Почему я не могу создать файл по пути, который действительно существует в профиле Android Work?

ОБНОВЛЕНИЕ Я решил проблему с помощью следующего кода. По сути, он создает файл и копирует поток из исходного в новый, чтобы у нашего приложения была копия файла, которую можно безопасно загрузить на сервер.

try {
    ParcelFileDescriptor parcelFileDescriptor = getContext().getContentResolver().openFileDescriptor(videoUri, "r", null);
    FileInputStream inputStream = new FileInputStream(parcelFileDescriptor.getFileDescriptor());
    file = new File(getContext().getCacheDir(), getFileName(videoUri));
    FileOutputStream outputStream = new FileOutputStream(file);
    IOUtils.copy(inputStream, outputStream);
} catch (Exception e) {
    e.printStackTrace();
}

Я хочу выбрать видео из галереи и загрузить на сервер, пока мое приложение работает в рабочем профиле. Когда приложение работает в личном профиле, все работает отлично, но когда я запускаю приложение в рабочем профиле, мое приложение дает сбой.

File file = new File(videoPath); вызывает сбой приложения.

 java.lang.IllegalArgumentException: Invalid file:
 /storage/emulated/0/DCIM/Camera/VID_20200511_121657.mp4

приложение работает с рабочим профилем и ему предоставлены разрешения во время выполнения:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Как-то он не находит файлы, которые находятся в галерее пользователя только в рабочем профиле, так как я могу загрузить тот же файл с тем же кодом в личном профиле. Заранее спасибо!

Обновление: приложение вылетает, когда я загружаю видео в AWS.

public TrasferObserver upload(String bucket, String key, File file, ...) {
  if (file == null || file.isDirectory() || !file.exists()) {
     throw new IllegalArgumentException("Invalid file: " + file);
  }
  //some other aws code
}

Что ж, в основном я получаю uri из средства выбора, а затем получаю путь к видео из своей функции.

  public String getPath(Uri uri, Context context) {
    String[] projection = {MediaStore.Video.Media.DATA};
    Cursor cursor = context.getContentResolver().query(uri, projection, null, null, null);
    if (cursor != null) {
      int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA);
      cursor.moveToFirst();
      return cursor.getString(columnIndex);
    } else {
      return null;
    }
  }

а затем создайте файл из пути с помощью File file = new File(videoPath); и вызовите метод загрузки.

Я тестировал это с new File(uri.getPath()); но оба не работают.

еще один комментарий: код в приватном профиле работает исправно.

0 ответов

Другие вопросы по тегам