Android 如何使用导航组件管理权限请求代码?
如何使用导航组件管理权限请求代码 我引用了太多的网站和堆栈链接,没有一个有效,仍然显示不推荐的警告 谷歌参考链接: 代码::在片段中使用下面的代码Android 如何使用导航组件管理权限请求代码?,android,kotlin,android-permissions,android-architecture-components,registerforactivityresult,Android,Kotlin,Android Permissions,Android Architecture Components,Registerforactivityresult,如何使用导航组件管理权限请求代码 我引用了太多的网站和堆栈链接,没有一个有效,仍然显示不推荐的警告 谷歌参考链接: 代码::在片段中使用下面的代码 private fun checkMultiplePermissions() { // check permission first if (ActivityCompat.checkSelfPermission(requireContext(), Manifest.permission.ACCESS_FINE_
private fun checkMultiplePermissions() {
// check permission first
if (ActivityCompat.checkSelfPermission(requireContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// request the permission
requestPermissions(arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), 100)
} else {
proceedAfterPermission() // has the permission.
}
}
override fun onRequestPermissionsResult(requestCode: Int,
permissions: Array<String>, grantResults: IntArray) {
myLog("log", "location code : $requestCode")
when (requestCode) {
100 -> {
// If request is cancelled, the result arrays are empty.
if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted.
proceedAfterPermission() // permission was granted.
myLog("log", "location granted")
} else {
// permission denied.
myLog("log", "location denied")
}
return
}
}
}
private fun checkMultiplePermissions(){
//先检查权限
if(ActivityCompat.checkSelfPermission(requireContext()、Manifest.permission.ACCESS\u FINE\u LOCATION)!=PackageManager.permission\u已授予){
//请求许可
requestPermissions(arrayOf(Manifest.permission.ACCESS\u FINE\u LOCATION),100)
}否则{
proceedAfterPermission()//具有该权限。
}
}
重写onRequestPermissionsResult(请求代码:Int,
权限:数组,grantResults:IntArray){
myLog(“日志”,“位置代码:$requestCode”)
何时(请求代码){
100 -> {
//如果取消请求,则结果数组为空。
if(grantResults.isNotEmpty()&&grantResults[0]==PackageManager.PERMISSION\u已授予){
//获得了许可。
proceedAfterPermission()//已授予权限。
myLog(“日志”,“授予位置”)
}否则{
//拒绝许可。
myLog(“日志”,“位置被拒绝”)
}
返回
}
}
}
Fragment.kt:完整代码
import android.Manifest
import android.content.pm.PackageManager
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment
class FragmentPermission : Fragment() {
private var binding: FragmentPermisionBinding ?= null
// Kotlin
//implementation "androidx.fragment:fragment-ktx:1.3.4"
//https://developer.android.com/training/permissions/requesting#manage-request-code-yourself
// <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
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) {
// request the permission
requestPermissions(arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), 100)
} else {
//proceedAfterPermission() // has the permission.
}
return binding!!.root
}
override fun onRequestPermissionsResult(requestCode: Int,
permissions: Array<String>, grantResults: IntArray) {
myLog("location3", "location code : $requestCode")
when (requestCode) {
100 -> {
// If request is cancelled, the result arrays are empty.
if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted.
//proceedAfterPermission() // permission was granted.
myLog("location3", "location granted")
} else {
// permission denied.
myLog("location3", "location denied")
}
return
}
}
}
override fun onDestroyView() {
super.onDestroyView()
binding=null
}
}
导入android.Manifest
导入android.content.pm.PackageManager
导入android.os.Bundle
导入android.view.LayoutInflater
导入android.view.view
导入android.view.ViewGroup
导入androidx.core.content.ContextCompat
导入androidx.fragment.app.fragment
类FragmentPermission:Fragment(){
私有变量绑定:FragmentPermissionBinding?=null
//科特林
//实现“androidx.fragment:fragment ktx:1.3.4”
//https://developer.android.com/training/permissions/requesting#manage-自己申请代码
//
覆盖创建视图(充气机:布局充气机,容器:视图组?,
savedInstanceState:捆绑?:视图{
绑定=碎片许可绑定。充气(充气机、容器、假)
if(ContextCompat.checkSelfPermission(requireContext(),Manifest.permission.ACCESS\u FINE\u LOCATION)!=PackageManager.permission\u已授予){
//请求许可
requestPermissions(arrayOf(Manifest.permission.ACCESS\u FINE\u LOCATION),100)
}否则{
//proceedAfterPermission()//具有该权限。
}
返回绑定!!.root
}
重写onRequestPermissionsResult(请求代码:Int,
权限:数组,grantResults:IntArray){
myLog(“位置3”,“位置代码:$requestCode”)
何时(请求代码){
100 -> {
//如果取消请求,则结果数组为空。
if(grantResults.isNotEmpty()&&grantResults[0]==PackageManager.PERMISSION\u已授予){
//获得了许可。
//proceedAfterPermission()//已授予权限。
myLog(“位置3”,“授予位置”)
}否则{
//拒绝许可。
myLog(“位置3”,“位置被拒绝”)
}
返回
}
}
}
重写onDestroyView(){
super.onDestroyView()
binding=null
}
}
此方法已弃用。
使用registerForActivityResult(ActivityResultContract,ActivityResultCallback)为ActivityResultContract传入ActivityResultContracts.RequestMultiplePermissions对象,并在回调中处理结果
API已弃用,取而代之的是传入ActivityResultContracts.RequestMultiplePermissions
对象
用于活动ResultContract
,并在回调中处理结果
首先,新API需要build.gradle
模块级依赖关系:
implementation 'androidx.activity:activity-ktx:1.3.0-beta01'
然后需要实现ActivityResultCallback
回调,并将其作为的参数传递。此接口具有处理用户对权限请求对话框的响应的回调
要显示权限对话框,请对registerForActivityResult
函数返回的ActivityResultLauncher
实例调用launch()
方法
因此,创建并实现回调实例以处理用户响应:
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)
}
更新
对于同时请求多个权限:您需要传递
启动()的权限ActivityResultCallback
返回一个Map
,权限为键,授予状态为值:
然后按如下方式使用:
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
}
您无法为下面的函数传递param活动
public static void requestPermissions(final @NonNull Activity activity,
final @NonNull String[] permissions, final @IntRange(from = 0) int requestCode)
检查您是否已经拥有权限(如果未请求权限)。
在下面的代码中,您需要通过活动,而不是此代码。
if (ContextCompat.checkSelfPermission(
this.applicationContext,
Manifest.permission.ACCESS_FINE_LOCATION
)
== PackageManager.PERMISSION_GRANTED
) {
//already you have permission
} else {
ActivityCompat.requestPermissions(
this, arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),
PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION
)
}
要获得用户响应,请使用以下命令
/**
* Handles the result of the request for location permissions.
*/
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
mLocationPermissionGranted = false
when (requestCode) {
PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION -> {
// If request is cancelled, the result arrays are empty.
if (grantResults.size > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED
) {
// user granted location call your function
}
}
}
}
/**
*处理位置权限请求的结果。
*/
覆盖onRequestPermissionsResult(
请求代码:Int,
权限:数组,
格兰特结果:因塔雷
) {
super.onRequestPermissionsResult(请求代码、权限、GrantResult)
mLocationPermissionGrassed=错误
何时(请求代码){
权限\请求\访问\精细\位置->{
//如果请求被取消
/**
* Handles the result of the request for location permissions.
*/
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
mLocationPermissionGranted = false
when (requestCode) {
PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION -> {
// If request is cancelled, the result arrays are empty.
if (grantResults.size > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED
) {
// user granted location call your function
}
}
}
}