Fix permission request - single permission on Android 12 and below

This commit is contained in:
Alex Abudaev 2026-04-05 16:33:57 +08:00
parent 00c5db0253
commit 1558ead809

View file

@ -22,7 +22,7 @@ import com.duckai.app.R
class MainActivity : AppCompatActivity() { class MainActivity : AppCompatActivity() {
private lateinit var webView: WebView private lateinit var webView: WebView
private var filePathCallback: ValueCallback<Array<Uri>>? = null private var pendingFileCallback: ValueCallback<Array<Uri>>? = null
companion object { companion object {
private const val BASE_URL = "https://duck.ai" private const val BASE_URL = "https://duck.ai"
@ -31,23 +31,18 @@ class MainActivity : AppCompatActivity() {
private val filePickerLauncher = registerForActivityResult( private val filePickerLauncher = registerForActivityResult(
ActivityResultContracts.OpenMultipleDocuments() ActivityResultContracts.OpenMultipleDocuments()
) { uris -> ) { uris ->
if (uris.isNotEmpty()) { pendingFileCallback?.onReceiveValue(uris.toTypedArray())
filePathCallback?.onReceiveValue(uris.toTypedArray()) pendingFileCallback = null
Toast.makeText(this, getString(R.string.file_attached), Toast.LENGTH_SHORT).show()
} else {
filePathCallback?.onReceiveValue(null)
}
filePathCallback = null
} }
private val permissionLauncher = registerForActivityResult( private val permissionLauncher = registerForActivityResult(
ActivityResultContracts.RequestMultiplePermissions() ActivityResultContracts.RequestPermission()
) { permissions -> ) { granted ->
val allGranted = permissions.values.all { it } if (granted) {
if (allGranted) {
openFilePicker() openFilePicker()
} else { } else {
Toast.makeText(this, getString(R.string.permission_required), Toast.LENGTH_SHORT).show() pendingFileCallback?.onReceiveValue(null)
pendingFileCallback = null
} }
} }
@ -83,8 +78,8 @@ class MainActivity : AppCompatActivity() {
filePathCallback: ValueCallback<Array<Uri>>?, filePathCallback: ValueCallback<Array<Uri>>?,
fileChooserParams: FileChooserParams? fileChooserParams: FileChooserParams?
): Boolean { ): Boolean {
this@MainActivity.filePathCallback = filePathCallback pendingFileCallback = filePathCallback
checkPermissionAndPickFile() checkPermissionAndOpenPicker()
return true return true
} }
} }
@ -103,27 +98,15 @@ class MainActivity : AppCompatActivity() {
} }
} }
private fun checkPermissionAndPickFile() { private fun checkPermissionAndOpenPicker() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
val permissions = arrayOf( openFilePicker()
Manifest.permission.READ_MEDIA_IMAGES,
Manifest.permission.READ_MEDIA_VIDEO,
Manifest.permission.READ_MEDIA_AUDIO
)
val notGranted = permissions.filter {
ContextCompat.checkSelfPermission(this, it) != PackageManager.PERMISSION_GRANTED
}
if (notGranted.isEmpty()) {
openFilePicker()
} else {
permissionLauncher.launch(notGranted.toTypedArray())
}
} else { } else {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
== PackageManager.PERMISSION_GRANTED) { == PackageManager.PERMISSION_GRANTED) {
openFilePicker() openFilePicker()
} else { } else {
permissionLauncher.launch(arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE)) permissionLauncher.launch(Manifest.permission.READ_EXTERNAL_STORAGE)
} }
} }
} }