Try:
// MainActivity.kt
package com.vivek.permission
import android.Manifest
import android.content.pm.PackageManager
import android.os.Build
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.Button
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import com.vivek.permission.ui.theme.PermissionTheme
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
PermissionTheme {
// A surface container using the 'background' color from the theme
Column(
modifier = Modifier
.fillMaxSize()
.background(MaterialTheme.colorScheme.background)
) {
ExampleScreenWithAccompanist()
}
}
}
}
}
val permissionsList = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
listOf(
Manifest.permission.BLUETOOTH,
Manifest.permission.BLUETOOTH_ADMIN,
Manifest.permission.BLUETOOTH_SCAN,
Manifest.permission.BLUETOOTH_CONNECT,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION
)
} else {
listOf(
Manifest.permission.BLUETOOTH,
Manifest.permission.BLUETOOTH_ADMIN,
Manifest.permission.ACCESS_COARSE_LOCATION,
)
}
@Composable
fun ExampleScreenWithAccompanist() {
val requestPermissionLauncher =
registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions ->
permissions.entries.forEach {
if (it.value) {
Text(text = " Permission Granted", color = Color.White)
} else {
Text(
text = "Permission permanently denied ,you can enable it by going to app setting",
color = Color.White
)
}
}
}
Button(onClick = { requestPermissionLauncher.launch(permissionsList.toTypedArray()) }) {
Text(text = "Give permission", color = Color.White)
}
}
说明:在上面的代码中,我使用了registerForActivityResult()
函数来注册活动结果。这registerForActivityResult()
函数有两个参数,第一个是ActivityResultContracts.RequestMultiplePermissions()
第二个是 lambda 函数。 lambda 函数采用Map<String, Boolean>
作为参数。这Map<String, Boolean>
包含权限名称作为键和权限状态作为值。如果授予权限,则权限状态为 true;如果拒绝权限,则权限状态为 false。
当用户拒绝权限时,您可以显示合理的消息,并且shouldShowRequestPermissionRationale()
函数返回真。这shouldShowRequestPermissionRationale()
如果用户拒绝了权限并且用户未选中“不再询问”复选框,则函数返回 true。下面的代码展示了如何显示理性消息。
if (ContextCompat.checkSelfPermission(
this,
Manifest.permission.ACCESS_FINE_LOCATION
) == PackageManager.PERMISSION_GRANTED
) {
// You can use the API that requires the permission.
}
else {
if (ActivityCompat.shouldShowRequestPermissionRationale(
this,
Manifest.permission.ACCESS_FINE_LOCATION
)
) {
// You can show the rational message.
} else {
// You can directly ask for the permission.
ActivityCompat.requestPermissions(
this,
arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),
1
)
}
}