Я пытаюсь открыть файлы с помощью Intent.ACTION_GET_CONTENT
.
В зависимости от бренда версии Android/устройства открывается браузер файлов, и я получаю следующие результаты:
Выбор файла из Downloads
:
content://com.android.providers.downloads.documents/document/446
Выбор файла из Fotos
:
content://media/external/images/media/309
Выбор файла из FileCommander
:
file:///storage/emulated/0/DCIM/Camera/20141027_132114.jpg
Я могу открыть все эти файлы, кроме тех случаев, когда я пытаюсь открыть файл из файлов Downloads,
, Audio
, Afbeeldingen
(Images)
Вероятно, я не могу справиться с этим типом Uri: content://com.android.providers.downloads.documents/document/446
Я пробовал следующие вещи:
- Попытка открыть файл с помощью нового файла (uri.getPath()). File.exists() возвращает false.
- Попытка открыть/получить файл getContext(). GetContentResolver(). OpenInputStream (uri). Результаты в FileNotFoundException
-
Попытка открыть файл со следующим кодом:
public static String getRealPathFromURI_API19(Context context, Uri uri) { Log.i("uri", uri.getPath()); String filePath = ""; if (uri.getScheme().equals("file")) { return uri.getPath(); } else if (DocumentsContract.isDocumentUri(context, uri)) { String wholeID = DocumentsContract.getDocumentId(uri); Log.i("wholeID", wholeID); // Split at colon, use second item in the array String[] splits = wholeID.split(":"); if (splits.length == 2) { String id = splits[1]; String[] column = {MediaStore.Images.Media.DATA}; // where id is equal to String sel = MediaStore.Images.Media._ID + "=?"; Cursor cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, column, sel, new String[]{id}, null); int columnIndex = cursor.getColumnIndex(column[0]); if (cursor.moveToFirst()) { filePath = cursor.getString(columnIndex); } cursor.close(); } } else { filePath = AttachmentUtils.getPath(context, uri); } return filePath; }
Что я делаю не так?
ОБНОВЛЕНИЕ: Я заметил, что файлы, перечисленные на скриншоте, которые они физически не хранят в хранилище. Устройство, которое я использую, представляет собой планшет от компании, содержащей данные мусора. Мой коллега сказал мне, что это устройство однажды было связано с другой учетной записью Google. Эти файлы могут быть файлами из предыдущей учетной записи, которые больше не существуют/недоступны.
Мой собственный вывод о том, что я столкнулся с некоторой ошибкой в Android. Мой отчет об ошибке
Обновление 6 февраля 2017 года:
Android запретил file://
URI. Пожалуйста, подумайте об этом.
Запрет на файл: Uri Scheme Самая большая проблема совместимости с Android 7.0 заключается в том, что файл: схема для значений Uri запрещена. Если вы попытаетесь передать файл: Uri в намерении, которое собирается в другое приложение - будь то через дополнительный или в виде "данных" аспект Intent - вы столкнетесь с исключением FileUriExposedException. Вы столкнетесь с аналогичными проблемами с помещением файла: значения Uri в буфер обмена в ClipData. Это происходит из обновленной версии StrictMode. StrictMode.VmPolicy.Builder имеет метод randomDeathOnFileUriExposure(), который запускает обнаружение файлов: значения Uri и результирующие исключения FileUriExposedException. И, похоже, что это предварительно настроено, так же, как StrictMode предварительно настроен для применения функции cancelDeathOnNetwork() (из-за сбоя источника NetworkOnMainThreadException).