简体   繁体   中英

Android registerForActivityResult launch never prompting for Permissions

I am trying to simply prompt for WRITE_EXTERNAL_STORAGE in a hello world targetSdk 28 Android app running on a Android 12 Pixel 5.

The whole project is here: https://github.com/paulpv/AndroidPermissionsTest

The main code meat is: build.gradle

android {
    compileSdk 32

    defaultConfig {
        applicationId "com.example.permissionstest"
        minSdk 26
        targetSdk 28
        versionCode 1
        versionName "1.0"
    }
    ...
}

AndroidManifest.xml

<manifest ...>

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

    <application
        ...
        android:requestLegacyExternalStorage="true"
        >
        ...
    </application>
</manifest>

MainActivity.kt

    private var runAfterRequestWriteExternalStoragePermissions: (() -> Unit)? = null
    private val writeExternalStoragePermissionsRequired =
        arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE)
    private val requestWriteExternalStoragePermissions =
        registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions ->
            val runAfter = runAfterRequestWriteExternalStoragePermissions
            runAfterRequestWriteExternalStoragePermissions = null
            if (permissions.containsValue(false)) return@registerForActivityResult
            runAfter?.invoke()
        }

    private fun requestWriteExternalStoragePermissions(runAfter: () -> Unit) {
        Log.i(TAG, "+requestWriteExternalStoragePermissions(...)")
        writeExternalStoragePermissionsRequired.forEach {
            val permission = ContextCompat.checkSelfPermission(this, it)
            if (permission != PackageManager.PERMISSION_GRANTED) {
                runAfterRequestWriteExternalStoragePermissions = runAfter
                if (shouldShowRequestPermissionRationale(it)) {
                    AlertDialog.Builder(this).apply {
                        setTitle("Permission(s) Required")
                        setMessage("Please allow the required permission(s)")
                        setPositiveButton("OK") { _, _ ->
                            requestWriteExternalStoragePermissions.launch(
                                writeExternalStoragePermissionsRequired
                            )
                        }
                        setNegativeButton("Cancel", null)
                    }.show()
                } else {
                    Log.i(TAG, "requestWriteExternalStoragePermissions: requestWriteExternalStoragePermissions.launch($writeExternalStoragePermissionsRequired)")
requestWriteExternalStoragePermissions.launch(writeExternalStoragePermissionsRequired)
                }
                Log.i(TAG, "-requestWriteExternalStoragePermissions(...)")
                return
            }
        }
        runAfter()
        Log.i(TAG, "-requestWriteExternalStoragePermissions(...)")
    }


    override fun onCreate(savedInstanceState: Bundle?) {
        Log.v(TAG, "+onCreate(...)")
        super.onCreate(savedInstanceState)
        //...
        requestWriteExternalStoragePermissions {
            Log.i(TAG, "Huzzah!")
        }
        Log.v(TAG, "-onCreate(...)")
    }

The log shows onCreate followed by onStart, then onResume, then onPause, then onResume:

2022-06-14 22:42:47.956 28831-28831/com.example.permissionstest V/MainActivity: +onCreate(...)
2022-06-14 22:42:48.416 28831-28831/com.example.permissionstest I/MainActivity: +requestWriteExternalStoragePermissions(...)
2022-06-14 22:42:48.419 28831-28831/com.example.permissionstest I/MainActivity: requestWriteExternalStoragePermissions: requestWriteExternalStoragePermissions.launch([Ljava.lang.String;@7baaa6)
2022-06-14 22:42:48.430 28831-28831/com.example.permissionstest I/MainActivity: -requestWriteExternalStoragePermissions(...)
2022-06-14 22:42:48.430 28831-28831/com.example.permissionstest V/MainActivity: -onCreate(...)
2022-06-14 22:42:48.446 28831-28831/com.example.permissionstest V/MainActivity: +onStart()
2022-06-14 22:42:48.463 28831-28831/com.example.permissionstest V/MainActivity: -onStart()
2022-06-14 22:42:48.469 28831-28831/com.example.permissionstest V/MainActivity: +onResume()
2022-06-14 22:42:48.470 28831-28831/com.example.permissionstest V/MainActivity: -onResume()
2022-06-14 22:42:48.514 28831-28831/com.example.permissionstest V/MainActivity: +onPause()
2022-06-14 22:42:48.521 28831-28831/com.example.permissionstest V/MainActivity: -onPause()
2022-06-14 22:42:48.987 28831-28831/com.example.permissionstest V/MainActivity: +onResume()
2022-06-14 22:42:48.987 28831-28831/com.example.permissionstest V/MainActivity: -onResume()

Any idea why my requestWriteExternalStoragePermissions.launch(...) isn't launching?

From android 12 now you dont need WRITE_EXTERNAL_STORAGE permission. Instead you will need to implement scoped storage for devices above android 11. Refer https://developer.android.com/about/versions/11/privacy/storage#permissions-target-11

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM