Después de Android 6.0, para los permisos que deben solicitarse dinámicamente, los pasos generales son los siguientes:
1. Agregue los permisos correspondientes en el Manifiesto;
2. Utilice el método checkSelfPermission de ActivityCompat o ContextCompat para comprobar si hay permisos; 3. Si no hay permiso, utilice el método requestPermissions de ActivityCompat para solicitar los permisos correspondientes. 4. Vuelva a escribir el método onRequestPermissionsResult para monitorear los resultados de la autorización de permisos.
Para permisos de posicionamiento, generalmente debe solicitar el permiso ACCESS_COARSE_LOCATION o el permiso ACCESS_FINE_LOCATION . Cuando targetSdkVersion>= 29 , también debe solicitar el permiso ACCESS_BACKGROUND_LOCATION .
Por ejemplo:
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)
}
}
Entre ellos, los permisos y ACCESS_BACKGOUND_LOCATION son constantes de permisos definidas.
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 ""
Sin embargo, cuando targetSdkVersion>=30 de la aplicación , si desea solicitar el permiso ACCESS_BACKGOUND_LOCATION , debe solicitar el permiso ACCESS_COARSE_LOCATION o el permiso ACCESS_FINE_LOCATION antes de poder solicitar el permiso ACCESS_BACKGROUND_LOCATION . Si el permiso ACCESS_BACKGROUND_LOCATION se aplica junto con el permiso ACCESS_COARSE_LOCATION o el permiso ACCESS_FINE_LOCATION , el cuadro de diálogo de solicitud de permiso no aparecerá. Si se aplican otros permisos juntos, no aparecerán todas las ventanas de solicitud de permiso.
Solución:
Método 1. targetSdkVersion<=2;
Método 2. Primero solicite el permiso ACCESS_COARSE_LOCATION o el permiso ACCESS_FINE_LOCATION . Una vez aprobada la solicitud, solicite el permiso ACCESS_BACKGROUND_LOCATION .
Para obtener una introducción a los permisos de posicionamiento, consulte Permisos de posicionamiento