Почему я не могу создать файл по пути, который действительно существует в профиле 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());
но оба не работают.
еще один комментарий: код в приватном профиле работает исправно.