requestPermissions(arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), 100)
此方法已被弃用。
使用 registerForActivityResult(ActivityResultContract, ActivityResultCallback) 为 ActivityResultContract 传入 ActivityResultContracts.RequestMultiplePermissions 对象,并在回调中处理结果。
requestPermissions() https://developer.android.com/reference/androidx/fragment/app/Fragment#requestPermissions(java.lang.String%5B%5D,%20int)API 已弃用,并替换为registerForActivityResult(ActivityResultContract, ActivityResultCallback) https://developer.android.com/reference/androidx/activity/result/ActivityResultCaller#registerForActivityResult(androidx.activity.result.contract.ActivityResultContract%3CI,%20O%3E,%20androidx.activity.result.ActivityResultCallback%3CO%3E)传入一个ActivityResultContracts.RequestMultiplePermissions
目的
为了ActivityResultContract
并在回调中处理结果。
首先是活动-ktx https://developer.android.com/kotlin/ktx/extensions-list#dependency build.gradle
新 API 需要模块级依赖:
implementation 'androidx.activity:activity-ktx:1.3.0-beta01'
Then ActivityResultCallback
回调需要实现并作为参数传递registerForActivityResult https://developer.android.com/reference/androidx/activity/result/ActivityResultCaller#registerForActivityResult(androidx.activity.result.contract.ActivityResultContract%3CI,%20O%3E,%20androidx.activity.result.ActivityResultCallback%3CO%3E)。该接口具有处理用户对权限请求对话框的响应的回调。
要显示权限对话框,请调用launch()
实例上的方法ActivityResultLauncher
返回的registerForActivityResult
功能。
因此,创建一个实例ActivityResultLauncher https://developer.android.com/reference/androidx/activity/result/ActivityResultLauncher& 实现回调来处理用户响应:
private val requestPermission =
registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted ->
if (isGranted) { // Do something if permission granted
Log.d("LOG_TAG", "permission granted by the user")
} else { // Do something as the permission is not granted
Log.d("LOG_TAG", "permission denied by the user")
}
}
然后使用请求权限launch
功能:
if (ContextCompat.checkSelfPermission(
requireContext(),
Manifest.permission.ACCESS_FINE_LOCATION
) != PackageManager.PERMISSION_GRANTED
) {
requestPermission.launch(Manifest.permission.ACCESS_FINE_LOCATION)
}
UPDATE
要一次请求多个权限:您需要传递数组
允许启动()。ActivityResultCallback
返回一个Map<String, Boolean>
以权限为键,其授予状态为值:
然后使用ActivityResultContracts.RequestMultiplePermissions() https://developer.android.com/reference/androidx/activity/result/contract/ActivityResultContracts.RequestMultiplePermissions如下:
private val requestMultiplePermissions =
registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions ->
permissions.entries.forEach {
Log.e("LOG_TAG", "${it.key} = ${it.value}")
}
}
// Usage:
requestMultiplePermissions.launch(
arrayOf(
Manifest.permission.READ_CONTACTS,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.CAMERA
)
)
将其应用到共享代码上:
class FragmentPermission : Fragment() {
private var binding: FragmentPermisionBinding ?= null
//...
private val requestPermission =
registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted ->
if (isGranted) { // permission is granted
proceedAfterPermission()
} else {
// handle permission denial
}
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View {
binding = FragmentPermisionBinding.inflate(inflater, container, false)
if (ContextCompat.checkSelfPermission(
requireContext(),
Manifest.permission.ACCESS_FINE_LOCATION
) != PackageManager.PERMISSION_GRANTED
) {
requestPermission.launch(Manifest.permission.ACCESS_FINE_LOCATION)
} else {
proceedAfterPermission()
}
return binding!!.root
}
//.... rest of your code
}