Rendimiento de los permisos de tiempo de ejecución (Runtime Permission) en varias versiones de Android

Introducción

El rendimiento del permiso de tiempo de ejecución (Permiso de tiempo de ejecución) de diferentes versiones de Android puede ser diferente.
Por razones de seguridad, la mayoría de las versiones actuales de Android tienen ciertos permisos confidenciales, como: grabación, cámara, envío de mensajes de texto, etc. Debe solicitar los permisos correspondientes antes. llamando a la APLICACIÓN. El usuario elige "Aceptar" significa que puede usarse normalmente, de lo contrario la función correspondiente no estará disponible.
La certificación CTA requiere que las aplicaciones de versiones inferiores, como Android 5, admitan permisos de tiempo de ejecución, pero su función solo se introdujo en Android 6. Es necesario tener una comprensión preliminar del rendimiento de las diferentes versiones de permisos de tiempo de ejecución para poder modificarlos de acuerdo. a los requisitos de la CTA.

Android5 y versiones inferiores

No existe una función de permiso de tiempo de ejecución, que se puede llamar sin solicitar permiso en el código. Los permisos se obtendrán automáticamente después de instalar la aplicación.

Android 5 (Lollipop, 21) y versiones anteriores no tienen esta función.
Puede abrir la cámara directamente en el código y crear un proyecto llamado TestM para realizar pruebas.
El primer paso es declarar los permisos de cámara requeridos
AndroidManifest.xml

<uses-permission android:name="android.permission.CAMERA" />

Esto debe agregarse sin importar qué versión; de lo contrario, no se obtendrá el permiso.

El segundo paso en app build.gradle corresponde al siguiente
targetSdk 21
, que requiere que el código se ejecute en android5.

    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.result);
         startCamera(); // 可直接打开摄像头
    }

Puede verificar si ha obtenido el permiso en Configuración-Aplicaciones y notificaciones-TestM-Permisos.
Una vez instalada la aplicación de Android5, los permisos se obtienen automáticamente.
Figura 1
Insertar descripción de la imagen aquí

La función de permiso de tiempo de ejecución introducida en Android 6.0

Los permisos confidenciales requieren una aplicación de código. Si no se solicitan, no se pueden usar.
Por ejemplo, en el ejemplo de la cámara,
el primer paso es declarar los permisos de cámara requeridos
en AndroidManifest.xml.

<uses-permission android:name="android.permission.CAMERA" />

Tenga en cuenta que si esta línea de código no se agrega al xml, el
cuadro de selección de autorización de permiso no aparecerá cuando el código requestPermissions solicite permisos. Si intenta abrir la cámara directamente sin solicitar permiso, fallará y se imprimirá el error: no se puede abrir la cámara "1" sin el permiso de la cámara".

En el segundo paso
, el build.gradle de la aplicación necesita configurar el número de versión del SDK,
que debe ser mayor o igual a 23. 23 corresponde a Android 6.0, lo que significa que debe ejecutarse en el sistema 6.0. El código se compilará con el SDK de la versión 6.0 para generar un apk compileSdk.
Actualmente, Android Studio 2021 solo puede establecer el valor mínimo en 28. Si se establece en 23, varias compilaciones fallarán porque no se puede encontrar la versión correspondiente de AppCompat. Por ejemplo, la correspondiente a
28 se puede descargar a
la implementación 'com.android.support:appcompat-v7:28.0 .0'
y la
implementación correspondiente 'com.android.support:appcompat-v7:23.0.0' no se descargará .

android {
    compileSdk 28

    defaultConfig {
        minSdk 19
        targetSdk 23
…
    }
…
}

En el tercer paso del código, solicite el permiso de la cámara. Si la solicitud anterior tiene éxito o esta aplicación tiene éxito, la cámara se puede encender. Lo principal es verificar primero el AutoPermiso. Si no ha sido autorizado antes,
llame requestPermissions para solicitar autorización.
Si abres la cámara directamente sin pedir permiso, fallará.

public class MainActivity extends AppCompatActivity {
    
    

    private static final String TAG = "MainActivity";
    private static final int FRONT_CAMERA = 1;
    private static final int MY_PERMISSIONS_REQUEST = 1000;

    Camera mCamera = null;
    TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.result);
      getPermissionInfo(); // 如果是6以上版本执行此句
      //startCamera(); // 5及以下版本执行此句

    }

    @Override
    protected void onDestroy() {
    
    
        super.onDestroy();
        if (mCamera != null)
            mCamera.release();
    }

    private void getPermissionInfo() {
    
    
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    
     // M为23,  表示版本6.0及以上
            if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
    
    
                //版本大于等于6.0的版本,未授权则动态请求授权
                ActivityCompat.requestPermissions(this, new String[] {
    
    Manifest.permission.CAMERA }, MY_PERMISSIONS_REQUEST);
                return;
            } else {
    
    
                // PERMISSION_GRANTED  表示已经授权并可以使用
                startCamera();
            }
        } else {
    
    //Android6.0以前的版本,可以直接使用
            Log.d("",  "6.0以前的版本");
            startCamera();
        }
    }

    private void startCamera() {
    
    
        try {
    
    
            mCamera = Camera.open(FRONT_CAMERA);
            Log.d(TAG, "open success");
            textView.setText("open camera success");
        } catch (RuntimeException e) {
    
    
            Log.e(TAG, "fail to open camera");
            e.printStackTrace();
            mCamera = null;
            textView.setText("open camera failed");
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    
    
       // 通过回调,监听用户是否授权
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
    
    
            case MY_PERMISSIONS_REQUEST: {
    
    
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
    
    
                    // 授权成功
                    startCamera();
                } else {
    
    
                    // 授权失败!
                    Toast.makeText(this, "授权失败", Toast.LENGTH_SHORT);
                }
                break;
            }
            default:
                break;
        }
    }
}

Para Android 6 y superior, al solicitar permisos en el código, aparecerá un cuadro de selección para
Insertar descripción de la imagen aquí
permitir permisos. Si selecciona "Permitir", obtendrá permisos y podrá abrir la cámara. Los permisos en la configuración se muestran en la Figura 1 ;
si selecciona "Denegar", no podrá obtener permisos. , la cámara no se puede abrir normalmente,
como se muestra en la Figura 3.
Insertar descripción de la imagen aquí
La parte CTA debe modificarse para el SDK de Android para que también admita permisos de tiempo de ejecución. para Android5 apk, que no se detallará aquí.
Autor: Demasiado guapo para salir. Se rechaza la reimpresión.

Supongo que te gusta

Origin blog.csdn.net/zmlovelx/article/details/128915485
Recomendado
Clasificación