потому чтоAndroidТребования рынка приложений — это минимальные требования.API 30Вот и все,Я собираюсь пойти прямо изAPI 28подняться доAPI 33Понятно,Были некоторые проблемы с чтением и записью места на диске.,Сделайте здесь несколько заметок. Подвести итог~
Связанные разрешения:
permission.READ_EXTERNAL_STORAGE
permission.WRITE_EXTERNAL_STORAGE
permission.MANAGE_EXTERNAL_STORAGE
permission.READ_MEDIA_VIDEO
permission.READ_MEDIA_IMAGES
permission.READ_MEDIA_AUDIO
Что касается более низких версий, я не буду объяснять это здесь.
android.permission.WRITE_EXTERNAL_STORAGE
权限的行为发生Понятно变化,Это разрешение по умолчанию считается недействительным.,может пройтиpermission.MANAGE_EXTERNAL_STORAGE
Получить разрешения для всех файлов,Но на это разрешение могут претендовать только системные приложения и приложения с особыми требованиями.,Environment.isExternalStorageManager()
判断自己是否получать Понятно全部的权限。Environment.getExternalStorageDirectory()
Без разрешения он недоступен.android:requestLegacyExternalStorage="true"
используется в Android 10 (уровень API 29))及Вот и все版本середина启用传统外部存储权限模式的应用程序清单属性,Android 11(API уровень 30) больше не действует./хранилище/эмулированный/0/Android/данные/имя пакета/файл
,Никаких специальных разрешений не требуется,Поскольку этот каталог является частным для приложения,После удаления приложения оно также будет удалено.READ_EXTERNAL_STORAGE
Разрешения ваше приложение может получить доступ только к своим собственным медиафайлам и общедоступным файлам, хранящимся в медиатеке. Если вам нужно получить доступ к медиафайлам из других приложений, вам нужно использовать Storage Access Framework или MediaStore API посетить.permission.READ_EXTERNAL_STORAGE
, существоватьAndroid 33后被细分出Понятноpermission.READ_MEDIA_VIDEO
,permission.READ_MEDIA_IMAGES
,permission.READ_MEDIA_AUDIO
android.permission.WRITE_EXTERNAL_STORAGE
Недействительно по умолчанию,Но даиспользоватьandroid:requestLegacyExternalStorage="true"
над.android:requestLegacyExternalStorage="true"
начинать无效Понятно,但是может пройтиpermission.MANAGE_EXTERNAL_STORAGE
Получите разрешения на чтение и запись для всех файлов илииспользовать context.getExternalFilesDir()
Метод получения каталога приложения во внешнем хранилище./хранилище/эмулированный/0/Android/данные/имя пакета/файл
час,Никаких специальных разрешений не требуется。нуждаться注意:существовать Android 12 середина,MANAGE_EXTERNAL_STORAGE
Разрешения изменены для более высокой защиты.уровень,Только определенные системные приложения могут получить это разрешение.,Это разрешение высокого риска.READ_EXTERNAL_STORAGE
Разрешения подразделяются,нуждатьсяполучать对应媒体权限permission.READ_MEDIA_VIDEO
,permission.READ_MEDIA_IMAGES
,permission.READ_MEDIA_AUDIO
fun checkHasPermission(activity: FragmentActivity,isRequest:Boolean): Boolean {
val hasPermission = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
//**Android 13(API уровень 33), обнаружить и подать заявку на соответствующее разрешение**
activity.hasPermission(
Manifest.permission.READ_MEDIA_VIDEO,
Manifest.permission.READ_MEDIA_IMAGES,
Manifest.permission.READ_MEDIA_AUDIO,
Manifest.permission.READ_EXTERNAL_STORAGE,
isRequest = isRequest
)
} else {
activity.hasPermission(
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
isRequest = isRequest
)
}
return hasPermission
}
Метод 1: Environment.getExternalStorageDirectory()
использовать context.getExternalFilesDir()
заменять;
- Преимущества: Не требуется получение разрешения.
- Недостатки: Когда приложение удаляется, оно будет удалено вместе, поэтому важные медиафайлы требуют использования нового медиа-метода для их сохранения.
метод2:получатьandroid.permission.WRITE_EXTERNAL_STORAGE
- Преимущества: этот метод может наследовать старые данные, и данные не будут удалены при удалении приложения.- Недостатки: Разрешения слишком чувствительны.,Пользователю необходимо перейти к соответствующему интерфейсу настроек, чтобы открыть его вручную.
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
tools:ignore="ScopedStorage" />
if (!Environment.isExternalStorageManager()) {
//Настраиваем соответствующие настройки для обработки
try {
val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION)
intent.addCategory("android.intent.category.DEFAULT")
intent.data = Uri.parse(String.format("package:%s", context.packageName))
context.startActivity(intent)
} catch (e: Exception) {
val intent = Intent()
intent.action = Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION
context.startActivity(intent)
}
}