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?
CodePudding user response:
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