Протестируйте программно, если в Android 10+ устаревший доступ к внешнему хранилищу отключен

12

Существует ли простой вызов API, который сообщит мне, должно ли приложение, работающее на Android 10 или более поздней версии, использовать доступ к хранилищу Scoped, то есть, если обычный доступ к файлу, то есть «Legacy External Storage», отключен? Обратите внимание, что даже если приложение в AndroidManifest.xml, раздел объявлен:

  android:requestLegacyExternalStorage="true"

доступ к файлу по-прежнему может быть закрыт из-за изменений политики Google в будущем, поэтому проверка этого значения бесполезна. Единственный способ, который я нашел, - это проверить, доступна ли для чтения корневая папка внешнего хранилища, но для этого приложение должно сначала запросить разрешение хранилища, которое бесполезно для всего остального, если устаревшее хранилище отключено.

public static boolean mustUseScopedStorage() {
    // Impractical must first ask for useless Storage permission...
    File exSD = Environment.getExternalStorageDirectory();
    return !exSD.canRead(); // this test works only if Storage permission was granted.
}

Я думаю, что когда-то видел новый API для обнаружения этого, но больше не могу найти эту статью ...

gregko
источник
an app running on Android 10 or later must use Scoped Storage access? Можете ли вы объяснить, что вы имеете в виду под этим? Какие функции вы имеете в виду? Я знаю, что, например, Storage Volume и Storage Manager, которые были перенесены для N, уже устарели для Q.
blackapps
Я имею в виду обычный доступ к Java-файлам вне песочницы, назначенной приложению системой, или, например, в C / C ++ JNI-коде fopen ("filename.ext", mode); не будет работать (доступ запрещен), если путь к файлу находится за пределами каталога приложения, назначенного системой. Что ж, теперь он будет работать на Android 10, если в манифесте вы используете android: requestLegacyExternalStorage = "true", но это временное решение, которое может быть полностью отключено в следующем году. Прочитайте больше, например, androidcentral.com/what-scoped-storage-android-q
gregko
Даже в этой статье неясно, каким будет объем хранилища.
Blackapps
@blackapps, возможно, эта статья объясняет это лучше: developer.android.com/training/data-storage/files/…
gregko
Хорошо. Ограниченный доступ только к частным каталогам приложений.
Blackapps

Ответы:

8

Вы можете использовать эти два метода из android.os.Environment:

  • isExternalStorageLegacy(File path)

    Возвращает, является ли общий / внешний носитель по указанному пути устаревшим представлением, включающим файлы, не принадлежащие приложению.

  • isExternalStorageLegacy()

    Возвращает, является ли основной общий / внешний носитель хранения устаревшим представлением, содержащим файлы, не принадлежащие приложению.

Это значение может отличаться от значения, запрошенного requestLegacyExternalStorageв манифесте приложения, поскольку приложение может наследовать свое прежнее состояние в зависимости от того, когда оно было впервые установлено.

Не унаследованные приложения могут продолжать обнаруживать и считывать мультимедиа, принадлежащие другим приложениям, через MediaStore.

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

Zaffy
источник
1
Спасибо, @Zaffy, это именно тот ответ, который я искал. Он отлично работает, и нет необходимости запрашивать «Доступ к хранилищу».
Грегко