Android 6.0 以降、動的に適用する必要がある権限の一般的な手順は次のとおりです。
1. 対応するアクセス許可をマニフェストに追加します;
2. ActivityCompatまたはContextCompatのcheckSelfPermissionメソッドを使用して、アクセス許可があるかどうかを確認します;
3. アクセス許可がない場合は、ActivityCompatのrequestPermissionsメソッドを使用して、対応するアクセス許可を申請します。
4. onRequestPermissionsResultメソッドを書き換えて、アクセス許可の承認結果を監視します。
位置決め権限については、通常、 ACCESS_COARSE_LOCATION 権限またはACCESS_FINE_LOCATION 権限を申請する必要があります。targetSdkVersion >= 29の場合は、 ACCESS_BACKGROUND_LOCATION 権限も申請する必要があります。
例えば:
private fun checkPermissions() {
val mutableListOf = mutableListOf<String>()
for (permission: String in permissions) {
if (ActivityCompat.checkSelfPermission(
this,
permission
) != PackageManager.PERMISSION_GRANTED
) {
mutableListOf.add(permission)
Log.d("PermissionTag", "has no $permission permission")
}
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
if (ACCESS_BACKGROUND_LOCATION.isNotEmpty() && ActivityCompat.checkSelfPermission(
this,
ACCESS_BACKGROUND_LOCATION
) != PackageManager.PERMISSION_GRANTED
) {
mutableListOf.add(ACCESS_BACKGROUND_LOCATION)
Log.d("PermissionTag", "has no background location permission")
}
}
if (mutableListOf.isNotEmpty()) {
val permissions = mutableListOf.toTypedArray()
ActivityCompat.requestPermissions(this, permissions, 0x01)
}
}
このうち、権限と ACCESS_BACKGOUND_LOCATION は権限定数として定義されています
val permissions = arrayOf(
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.CHANGE_WIFI_STATE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
)
val ACCESS_BACKGROUND_LOCATION =
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) Manifest.permission.ACCESS_BACKGROUND_LOCATION else ""
ただし、アプリのtargetSdkVersion>=30の場合、 ACCESS_BACKGOUND_LOCATION 権限を申請する場合は、 ACCESS_BACKGROUND_LOCATION 権限を申請する前に、 ACCESS_COARSE_LOCATION 権限またはACCESS_FINE_LOCATION権限を申請する必要があります。ACCESS_BACKGROUND_LOCATION 権限がACCESS_COARSE_LOCATION 権限またはACCESS_FINE_LOCATION 権限と一緒に適用されている場合、権限適用ダイアログ ボックスは表示されません。他の権限が一緒に適用されている場合、すべての権限適用ウィンドウはポップアップしません。
解決策:
方法 1. targetSdkVersion<=2;方法 2. 最初にACCESS_COARSE_LOCATION 権限またはACCESS_FINE_LOCATION 権限
を申請し、アプリケーションが合格した後、ACCESS_BACKGROUND_LOCATION 権限を申請します。
ポジショニング権限の概要については、「ポジショニング権限」を参照してください。