動的権限申請

4159 ワード

以前の権限はすべてManifestファイルにリストされていて、appのインストール時に申請して、ユーザーが同意した後にappは関連する権限を持っています.6.0以降、機密権限はManifestにリストされるだけでなく、ユーザーの異なる操作に応じてコードをチェックして申請する必要があります.カメラと読み書きSDカードの権限を例にとると(Kotlin)、手順は以下の通りです.
    private val permissions = arrayOf("android.permission.CAMERA", "android.permission.WRITE_EXTERNAL_STORAGE")
    private val appPackage = "com.demo"
    private val ASK_FOR_CAMERA_PERMISSION = 1000
    private fun requestCodeQRCodePermissions() {

        val ps = getGrantedPermissions(appPackage)
        Log.e(TAG, "     " + ps.toString())
        if (checkPermission(ps, permissions[0]) && checkPermission(ps, permissions[1])) {
            //   ,todo
        } else {
            if (android.os.Build.VERSION.SDK_INT < 23) {
                AlertDialog.Builder(this@OrderInfoActivity, R.style.Theme_AppCompat_Light_Dialog_Alert)
                        .setTitle("      ,                  ")
                        .setPositiveButton("    ") { _, _ ->
                            val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
                                    Uri.fromParts("package", packageName, null))
                            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
                            startActivityForResult(intent, Constants.ASK_FOR_PERMISSION)
                        }.setNegativeButton("    ") { dialog, _ -> dialog.dismiss() }.show()
            } else {
                // Should we show an explanation?
                if (ActivityCompat.shouldShowRequestPermissionRationale(this@OrderInfoActivity,
                        Manifest.permission.CALL_PHONE)) {

                    ActivityCompat.requestPermissions(this@OrderInfoActivity, permissions, ASK_FOR_CAMERA_PERMISSION)

                    // Show an expanation to the user *asynchronously* -- don't block
                    // this thread waiting for the user's response! After the user
                    // sees the explanation, try again to request the permission.

                } else {

                    // No explanation needed, we can request the permission.

                    ActivityCompat.requestPermissions(this@OrderInfoActivity, permissions, ASK_FOR_CAMERA_PERMISSION)

                    // MY_PERMISSIONS_REQUEST_CALL_PHONE is an
                    // app-defined int constant. The callback method gets the
                    // result of the request.
                }
            }
        }
    }
    private fun checkPermission(permissions: List, permission: String): Boolean {
        return permissions.contains(permission)
    }

appが所有するすべての権限を出力します(オプション)
    internal fun getGrantedPermissions(appPackage: String): List {
        val granted = ArrayList()
        try {
            val pi = packageManager.getPackageInfo(appPackage, PackageManager.GET_PERMISSIONS)
            pi.requestedPermissions.indices
                    .filter { pi.requestedPermissionsFlags[it] and PackageInfo.REQUESTED_PERMISSION_GRANTED != 0 }
                    .mapTo(granted) { pi.requestedPermissions[it] }
        } catch (e: Exception) {
            e.printStackTrace()
        }

        return granted
    }

onRequestPermissionsResultを書き換え、requestCodeに従って対応する処理を行う
    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) {
        when (requestCode) {
            ASK_FOR_CAMERA_PERMISSION -> {
                // If request is cancelled, the result arrays are empty.

                if (checkPermission(getGrantedPermissions(appPackage), permissions[0]) && checkPermission(getGrantedPermissions(appPackage), permissions[1])) {
                    startActivity(Intent(this@OrderInfoActivity, QRCodeActivity::class.java))
                } else {
                    requestCodeQRCodePermissions()
                }

                return
            }
        }
    }