Почему MediaStore.getmediaur () возвращает пустой курсор?

#java #android #kotlin #uri #storage-access-framework

Вопрос:

В настоящее время я выполняю переход к среде хранения с областью действия. Когда я впервые увидел MediaStore.getDocumentUri() «и getMediaUri() «, это показалось мне очень полезным. Но после нескольких тестов оказалось, что это совершенно бесполезно.

Скажите мне, если я ошибаюсь, но мне MediaStore.getDocumentUri() кажется, что для этого требуются только URI, которые изначально получены через SAF. Это означает, что он может конвертировать только те URI, которые были ранее преобразованы с помощью MediaStore.getMediaUri() . В противном случае я получаю SecurityException , даже если файл создан с использованием API MediaStore и все еще принадлежит мне. (Не тот RecoverableSecurityException )

Теперь перейдем к главному вопросу.

(На самом деле это не вопрос. Я просто жаловался и надеялся, что кто-нибудь поправит меня, если я ошибусь.)

Нормально ли, что приведенный ниже код всегда печатает «Количество курсоров: 0»?

Я тестирую это в течение нескольких часов, но все результаты одинаковы. Если он всегда пуст, то getMediaUri() в чем, в первую очередь, его цель? (С другой стороны, исходный документ docUri возвращает курсор с DISPLAY_NAME и SIZE в нем.)

 // docUri here is the URI returned by the system picker of SAF. Cursor cursor = getContentResolver().query(MediaStore.getMediaUri(this, docUri), null, null, null, null, null); Log.i("my_log", "Cursor Count: "   cursor.getCount());  

Комментарии:

1. MediaStore.getDocumentUri() seems like it only takes URIs that are originally obtained via SAF. Нет. Для этого требуется uri, полученный из хранилища mediastore.

2. That means it can only convert the URIs back that were previously converted using MediaStore.getMediaUri(). Нет. Просто используйте n uri, который вы получили из хранилища мультимедиа с a . запрос() или .вставка().

3. @blackapps Как было сказано выше, я получаю SecurityException , когда делаю это. Кроме того, я видел ваш комментарий, в котором то же самое говорилось на другом плакате, но они ответили, что они SecurityException слишком похожи на меня. Документ на getDocumentUri() тему : «Вызывающие абоненты должны уже иметь разрешения, полученные с намерением#ACTION_OPEN_DOCUMENT или связанные API»..

4. @blackapps Если я получил URI мультимедиа через API MediaStore во время выполнения, это означает, что у меня уже есть разрешение на чтение. Это связано с тем, что API MediaStore никогда не возвращает URI других приложений без READ_EXTERNAL_STORAGE разрешения в первую очередь. Поэтому выбрасывать SecurityException исключение не имеет смысла, если getDocumentUri() оно действительно поддерживает URI чистых носителей. Мы получаем RecoverableSecurityException только тогда, когда пытаемся изменить/удалить файлы других приложений, но в данном случае я просто пытаюсь конвертировать.

5. Извини, я потерял, о чем речь. Вы опубликовали две строки кода. И использовал MediaStore.getMediaUri() для ури SAF, который я понял. Затем у вас есть разрешение СВС. И, вероятно, вам понадобится READ_EXTERNAL_STORAGE для запроса хранилища мультимедиа. Но тогда вы должны получить uri для мультимедиа.