Fragment 运行时权限申请,处理onRequestPermissionsResult回调

387 阅读1分钟

1. 运行时申请权限

class CameraFragment : Fragment() {

    private val REQUEST_CODE_PERMISSIONS = 10
    private val REQUIRED_PERMISSIONS = arrayOf(Manifest.permission.CAMERA)
    
    //检查清单中指定的所有权限是否已被授予
    private fun allPermissionsGranted() =
        REQUIRED_PERMISSIONS.all {
            ContextCompat.checkSelfPermission(
                activity!!.baseContext, it
            ) == PackageManager.PERMISSION_GRANTED
        }
      
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
    }
    
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view,
        savedInstanceState)
        //检查是否授予权限
        if (allPermissionsGranted()) {
        //权限已授予,执行相应的操作
            preview_view.post {
                startCamera()
            }
        } else {
        //未授予权限,则动态申请
            ActivityCompat.requestPermissions(
                activity as Activity,   //此处activity为FragmentActivity,转化为Activity
                REQUIRED_PERMISSIONS,
                REQUEST_CODE_PERMISSIONS
            )
        }
    }
}

效果如下:

2. 处理onRequestPermissionsResult回调

参考博文android 6.0权限,onRequestPermissionsResult回调不执行问题

在Activity中处理onRequestPermissionsResult

class ContentActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
    ···
    }
    
    private val REQUEST_CODE_PERMISSIONS_CAMERA = 10

    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        if (requestCode == REQUEST_CODE_PERMISSIONS_CAMERA) {
            if (
            //确认已授权
                ContextCompat.checkSelfPermission(baseContext, android.Manifest.permission.CAMERA)
                == PackageManager.PERMISSION_GRANTED
            ) {
            //从supportFragmentManager获取当前fragment
                val fragment = supportFragmentManager.fragments.let {
                    it.get(it.size - 1)
                }
                //若当前fragment刚好是CameraFragment,将fragment转化为CameraFragment,并做相应的处理
                if (fragment.javaClass==CameraFragment::class.java){
                    fragment as CameraFragment
                    fragment.preview_view.post {
                        fragment.startCamera()
                    }
                }
            }else Toast.makeText(this, "请授予权限!", Toast.LENGTH_SHORT).show()
        }
    }
}