Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何使用导航组件管理权限请求代码?_Android_Kotlin_Android Permissions_Android Architecture Components_Registerforactivityresult - Fatal编程技术网

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