1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
| import android.Manifest import android.content.Context import android.content.Intent import android.content.pm.PackageManager import android.net.Uri import android.os.Build import android.provider.Settings import android.widget.Toast import androidx.activity.ComponentActivity import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Button import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.core.content.ContextCompat
fun hasPermanentlyDeniedPermissions( context: Context, permissions: Array<String> ): Boolean { return if (context is ComponentActivity) { permissions.any { permission -> !context.shouldShowRequestPermissionRationale(permission) } } else { false } }
fun openAppSettings(context: Context) { val intent = Intent( Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.fromParts("package", context.packageName, null) ) context.startActivity(intent) }
@Composable fun ZNativePermissionComp() { val permissionList = mutableListOf( Manifest.permission.CAMERA, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.READ_EXTERNAL_STORAGE ) val isAndroid13OrHigher = Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU if (!isAndroid13OrHigher) { permissionList.add(Manifest.permission.READ_EXTERNAL_STORAGE) } ZNativePermissionCompBase(permissionList) }
@Composable fun ZAudioPermissionComp() { val permissionList = mutableListOf( Manifest.permission.RECORD_AUDIO ) ZNativePermissionCompBase(permissionList) }
@Composable fun ZNativePermissionCompBase(permissionList: List<String>) { val context = LocalContext.current
val permissions = permissionList.toTypedArray()
var allPermissionsGranted by remember { mutableStateOf(false) }
allPermissionsGranted = permissions.all { permission -> ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED }
val multiplePermissionsLauncher = rememberLauncherForActivityResult( contract = ActivityResultContracts.RequestMultiplePermissions() ) { permissionsMap -> allPermissionsGranted = permissionsMap.all { it.value }
if (!allPermissionsGranted) { val result = hasPermanentlyDeniedPermissions(context, permissions) if (result) { openAppSettings(context) } } }
when { allPermissionsGranted -> { Toast.makeText(context, "所有权限已授予,可以使用相关功能", Toast.LENGTH_SHORT).show() }
else -> { Box( modifier = Modifier .fillMaxSize() .background(Color(0x33000000)) ) { Column( modifier = Modifier .width(300.dp) .background(Color.White, RoundedCornerShape(8.dp)) .padding(10.dp, 20.dp) .align(Alignment.Center), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center ) { Text("需要以下权限才能继续:\n相机、存储、位置") Button( modifier = Modifier .padding(top = 10.dp), onClick = { multiplePermissionsLauncher.launch(permissions) }) { Text("申请权限", fontSize = 12.sp) } } }
} } }
|