Android: разрешения во время выполнения не работают — в настройках приложения не отображаются запрошенные разрешения, даже когда их запрашивают (WRITE_EXTERNAL_STORAGE)

Я работаю над приложением для удаления фона из изображения, и после процесса удаления фона я должен загрузить его в папку загрузки, но я продолжаю получать исключение, что такое имя файла не найдено. Итак, я попытался запросить разрешения во время выполнения перед загрузкой, и столкнулся с проблемой, из-за которой мое приложение для 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()
            }
        }
    }

Запустив приложение на своем устройстве, я ожидаю увидеть, что приложение запросило хотя бы один запрос на внешнее хранилище, но получаю следующий вывод:

введите сюда описание изображения

0
0
54
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Добавить разрешение в файл AndroidManifest.xml

<uses-permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE" />

Я уже добавил его, но приложение все равно сообщает, что приложение не запрашивало никаких запросов.

Rudranil Bhattacharjee 02.09.2024 09:27

можете ли вы предоставить код манифеста? также попробуйте удалить приложение и запустить его снова.

Mohammed Tofik 02.09.2024 09:39
Ответ принят как подходящий

Обработка разрешений для 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 в файл загрузок. Хотя это уже другая проблема. Спасибо!

Rudranil Bhattacharjee 02.09.2024 16:55

Другие вопросы по теме