Bladeren bron

webview 文件选择时授权异常处理

cc12458 3 weken geleden
bovenliggende
commit
5419ad39cf

+ 22 - 11
library/browser/src/main/java/com/hzliuzhi/applet/browser/webview/WebViewFileChooser.kt

@@ -1,6 +1,7 @@
 package com.hzliuzhi.applet.browser.webview
 
 import android.content.Context
+import android.content.pm.PackageManager
 import android.net.Uri
 import android.os.Environment
 import android.webkit.ValueCallback
@@ -19,16 +20,13 @@ import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.platform.LocalContext
+import androidx.core.content.ContextCompat
 import androidx.core.content.FileProvider
-import com.google.accompanist.permissions.ExperimentalPermissionsApi
-import com.google.accompanist.permissions.isGranted
-import com.google.accompanist.permissions.rememberPermissionState
 import java.io.File
 import java.text.SimpleDateFormat
 import java.util.Date
 import java.util.Locale
 
-@OptIn(ExperimentalPermissionsApi::class)
 @Composable
 fun WebViewFileChooser(controller: WebViewController) {
   val context = LocalContext.current.applicationContext
@@ -37,7 +35,7 @@ fun WebViewFileChooser(controller: WebViewController) {
   var showDialog by remember { mutableStateOf(false) }
   var temporaryUri by remember { mutableStateOf<Uri?>(null) }
 
-  var file: File? = null
+  var file by remember { mutableStateOf<File?>(null) }
 
 
   fun callback(values: Array<Uri>?) {
@@ -49,10 +47,9 @@ fun WebViewFileChooser(controller: WebViewController) {
   fun callback(value: Uri?) = callback(if (value != null) arrayOf(value) else emptyArray())
 
   fun callback() {
+    val staleCaptureFile = file
     callback(emptyArray())
-    // 清理未用的临时文件
-    file?.also { deleteTempFileByUri(it) }
-    file = null
+    staleCaptureFile?.also { deleteTempFileByUri(it) }
     showDialog = false
   }
 
@@ -87,13 +84,27 @@ fun WebViewFileChooser(controller: WebViewController) {
     callback(uris.takeIf { it.isNotEmpty() }?.toTypedArray())
   }
 
-  val cameraPermissionState = rememberPermissionState(android.Manifest.permission.CAMERA)
+  val cameraPermissionLauncher = rememberLauncherForActivityResult(
+    contract = ActivityResultContracts.RequestPermission()
+  ) { granted ->
+    if (granted) {
+      file?.also { deleteTempFileByUri(it) }
+      temporaryUri = createImageUri(context) { file = it }.also { capturePictureLauncher.launch(it) }
+    } else {
+      callback()
+    }
+  }
+
   fun capturePicture() {
     file?.also { deleteTempFileByUri(it) }
-    if (cameraPermissionState.status.isGranted) {
+    val hasCameraPermission = ContextCompat.checkSelfPermission(
+      context,
+      android.Manifest.permission.CAMERA,
+    ) == PackageManager.PERMISSION_GRANTED
+    if (hasCameraPermission) {
       temporaryUri = createImageUri(context) { file = it }.also { capturePictureLauncher.launch(it) }
     } else {
-      cameraPermissionState.launchPermissionRequest()
+      cameraPermissionLauncher.launch(android.Manifest.permission.CAMERA)
     }
     showDialog = false
   }