如何使用导航组件管理权限请求代码?

Har*_*r S 8 android kotlin android-permissions android-architecture-components registerforactivityresult

如何使用导航组件管理权限请求代码?

我引用了太多网站和堆栈链接,但没有一个起作用,仍然显示已弃用的 Waring 在此输入图像描述

谷歌参考链接: https://developer.android.com/training/permissions/requesting#manage-request-code-yourself

代码::在片段中使用以下代码

  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
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

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
    }
}
Run Code Online (Sandbox Code Playgroud)

Zai*_*ain 13

requestPermissions(arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), 100)
Run Code Online (Sandbox Code Playgroud)

此方法已被弃用。使用 registerForActivityResult(ActivityResultContract, ActivityResultCallback) 为 ActivityResultContract 传入 ActivityResultContracts.RequestMultiplePermissions 对象,并在回调中处理结果。

requestPermissions()API 已弃用,取而代之的是 registerForActivityResult(ActivityResultContract, ActivityResultCallback)传入一个ActivityResultContracts.RequestMultiplePermissions对象ActivityResultContract并在回调中处理结果。

首先,新 API 需要Activity-ktx模块级别依赖项: build.gradle

implementation 'androidx.activity:activity-ktx:1.3.0-beta01'
Run Code Online (Sandbox Code Playgroud)

然后ActivityResultCallback需要实现回调并将其作为registerForActivityResult. 该接口具有处理用户对权限请求对话框的响应的回调。

要显示权限对话框,请在函数返回的launch()实例上调用该方法。ActivityResultLauncherregisterForActivityResult

因此,创建 & 实现回调的实例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")
        }
    }
Run Code Online (Sandbox Code Playgroud)

然后使用以下函数请求权限launch

if (ContextCompat.checkSelfPermission(
        requireContext(),
        Manifest.permission.ACCESS_FINE_LOCATION
    ) != PackageManager.PERMISSION_GRANTED
) {
    requestPermission.launch(Manifest.permission.ACCESS_FINE_LOCATION)
}
Run Code Online (Sandbox Code Playgroud)

更新

对于一次请求多个权限:您需要将权限数组传递给 launch()。ActivityResultCallback返回 aMap<String, Boolean>以权限作为键,其授予状态作为值:

然后使用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
    )
)
Run Code Online (Sandbox Code Playgroud)

将其应用到共享代码上:

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

}
Run Code Online (Sandbox Code Playgroud)