Я работаю над приложением для удаления фона из изображения, и после процесса удаления фона я должен загрузить его в папку загрузки, но я продолжаю получать исключение, что такое имя файла не найдено. Итак, я попытался запросить разрешения во время выполнения перед загрузкой, и столкнулся с проблемой, из-за которой мое приложение для Android не отображает запрошенные разрешения в настройках приложения. Я объявил разрешение android.permission.WRITE_EXTERNAL_STORAGE в своем AndroidManifest.xml и запрашиваю его во время выполнения, используя ActivityCompat.requestPermissions.
Несмотря на это, на странице настроек приложения не указано запрошенное разрешение. Я пробовал следующее:
В моем файле build.gradle (приложение) для minSdk установлено значение 24, а для targetSdk установлено значение 34, а в моем файле AndroidManifest я установил для targetApi значение 31, и я тестирую его на своем устройстве OnePlus 12R.
Чтобы запросить разрешения во время выполнения, я использую следующий код:
private fun requestRuntimePermissions() {
when {
ContextCompat.checkSelfPermission(
this@ImageStaging,
android.Manifest.permission.WRITE_EXTERNAL_STORAGE
) == PackageManager.PERMISSION_GRANTED -> {
// You can use the API that requires the permission.
Log.d("PermGrant", "Permission already granted...")
}
ActivityCompat.shouldShowRequestPermissionRationale(
this@ImageStaging, android.Manifest.permission.WRITE_EXTERNAL_STORAGE) -> {
val builder = AlertDialog.Builder(this@ImageStaging)
builder.setMessage("Permission to write is required to download the image to your storage...")
builder.setTitle("Permission Required").setCancelable(false).setPositiveButton("OK", DialogInterface.OnClickListener { dialog, which ->
ActivityCompat.requestPermissions(this@ImageStaging, arrayOf(android.Manifest.permission.WRITE_EXTERNAL_STORAGE), writepermcode)
dialog.dismiss()
})
builder.setNegativeButton("Cancel", DialogInterface.OnClickListener { dialog, which ->
dialog.dismiss()
})
builder.show()
}
else -> {
// You can directly ask for the permission.
// The registered ActivityResultCallback gets the result of this request.
ActivityCompat.requestPermissions(this@ImageStaging, arrayOf(android.Manifest.permission.WRITE_EXTERNAL_STORAGE), writepermcode)
}
}
}
override fun onRequestPermissionsResult(requestCode: Int,
permissions: Array<String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
when (requestCode) {
writepermcode -> {
// If request is cancelled, the result arrays are empty.
if ((grantResults.isNotEmpty() &&
grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
// Permission is granted. Continue the action or workflow
// in your app.
Toast.makeText(this@ImageStaging, "Permission Granted!", Toast.LENGTH_SHORT).show()
} else if (!ActivityCompat.shouldShowRequestPermissionRationale(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
// Explain to the user that the feature is unavailable because
// the feature requires a permission that the user has denied.
// At the same time, respect the user's decision. Don't link to
// system settings in an effort to convince the user to change
// their decision.
val builder = AlertDialog.Builder(this@ImageStaging)
builder.setMessage("Permission to write is required to download the image to your storage...")
builder.setTitle("Permission Required").setCancelable(false).setPositiveButton("OK", DialogInterface.OnClickListener { dialog, which ->
val intent: Intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
val uri: Uri = Uri.fromParts("package", packageName, null)
intent.setData(uri)
startActivity(intent)
dialog.dismiss()
})
builder.setNegativeButton("Cancel", DialogInterface.OnClickListener { dialog, which ->
dialog.dismiss()
})
builder.show()
}
return
}
// Add other 'when' lines to check for other
// permissions this app might request.
else -> {
// Ignore all other requests.
requestRuntimePermissions()
}
}
}
Запустив приложение на своем устройстве, я ожидаю увидеть, что приложение запросило хотя бы один запрос на внешнее хранилище, но получаю следующий вывод:
Добавить разрешение в файл AndroidManifest.xml
<uses-permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE" />
можете ли вы предоставить код манифеста? также попробуйте удалить приложение и запустить его снова.
Обработка разрешений для Android 13 и выше.
private fun checkStoragePermission(): Boolean {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
val audioPermission = ContextCompat.checkSelfPermission(
this,
Manifest.permission.READ_MEDIA_AUDIO
)
val videoPermission = ContextCompat.checkSelfPermission(
this,
Manifest.permission.READ_MEDIA_VIDEO
)
val imagePermission = ContextCompat.checkSelfPermission(
this,
Manifest.permission.READ_MEDIA_IMAGES
)
return audioPermission == PackageManager.PERMISSION_GRANTED && videoPermission == PackageManager.PERMISSION_GRANTED && imagePermission == PackageManager.PERMISSION_GRANTED
} else {
val storagePermission = ContextCompat.checkSelfPermission(
this,
Manifest.permission.WRITE_EXTERNAL_STORAGE
)
val courseLocationPermission = ContextCompat.checkSelfPermission(
this,
Manifest.permission.READ_EXTERNAL_STORAGE
)
return storagePermission == PackageManager.PERMISSION_GRANTED && courseLocationPermission == PackageManager.PERMISSION_GRANTED
}
}
И добавьте эти строки в manfest.
<uses-permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion = "32"/>
<uses-permission android:name = "android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion = "32"/>
<uses-permission android:name = "android.permission.READ_MEDIA_AUDIO"/>
<uses-permission android:name = "android.permission.READ_MEDIA_IMAGES"/>
<uses-permission android:name = "android.permission.READ_MEDIA_VIDEO"/>
Кажется, это помогает запрашивать разрешения во время выполнения. Но я все еще не могу загрузить сгенерированное изображение PNG в файл загрузок. Хотя это уже другая проблема. Спасибо!
Я уже добавил его, но приложение все равно сообщает, что приложение не запрашивало никаких запросов.