|
|
@@ -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
|
|
|
}
|