Con respecto a la aplicación de permiso ACCESS_BACKGROUND_LOCATION, el registro del problema que provocó que el cuadro de diálogo de permiso no apareciera

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

Supongo que te gusta

Origin blog.csdn.net/fengyulinde/article/details/129556403
Recomendado
Clasificación