動的権限申請
4159 ワード
以前の権限はすべてManifestファイルにリストされていて、appのインストール時に申請して、ユーザーが同意した後にappは関連する権限を持っています.6.0以降、機密権限はManifestにリストされるだけでなく、ユーザーの異なる操作に応じてコードをチェックして申請する必要があります.カメラと読み書きSDカードの権限を例にとると(Kotlin)、手順は以下の通りです.
appが所有するすべての権限を出力します(オプション)
onRequestPermissionsResultを書き換え、requestCodeに従って対応する処理を行う
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
}
}
}