Существует ли простой вызов 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 для обнаружения этого, но больше не могу найти эту статью ...
источник
an app running on Android 10 or later must use Scoped Storage access
? Можете ли вы объяснить, что вы имеете в виду под этим? Какие функции вы имеете в виду? Я знаю, что, например, Storage Volume и Storage Manager, которые были перенесены для N, уже устарели для Q.Ответы:
Вы можете использовать эти два метода из
android.os.Environment
:isExternalStorageLegacy(File path)
isExternalStorageLegacy()
В случае, если вы обнаружите, что у вас есть доступ к устаревшему хранилищу, лично я думаю, что лучше просто перенести данные в хранилище с областью действия и использовать его вместо этого, так как устаревшее хранилище может перестать работать без предупреждения.
источник