Android obtiene permisos dinámicamente (tutorial detallado con código)

descripción general

Si es una versión anterior a android6.0, solo necesita declarar los permisos correspondientes en el manifiesto. Pero esto reducirá en gran medida la seguridad del sistema. Por lo tanto, en Android 6.0 y versiones posteriores, la aplicación necesita recibir comentarios de los usuarios para obtener permisos.

Acceso dinámico a permisos

El acceso dinámico a los permisos se puede dividir en dos situaciones. Situación 1. Al operar funciones específicas de la aplicación, ciertos permisos se adquieren dinámicamente. Esta situación se denomina adquisición de "hombre perezoso". Situación 2 : en la situación inicial (obtenida en onCreate), todos los permisos requeridos se obtienen directamente, que es el "estilo hambriento".

Implementación

Por ejemplo, cuando se utiliza una aplicación, necesita obtener los permisos de lectura y escritura de la libreta de direcciones y los permisos de lectura y envío de SMS .

Nota: Leer la libreta de direcciones es un permiso y escribir la libreta de direcciones es un permiso. Estos son dos permisos.
Leer mensajes de texto es un permiso y enviar mensajes de texto es otro permiso para operar mensajes de texto.

código de diseño de diseño

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center_horizontal"
    >

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btn_contact"
        android:text="获取通讯录的读写权限"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btn_sms"
        android:text="获取短信的查看发送权限"/>
</LinearLayout>

El id del botón para obtener el permiso de lectura y escritura de la libreta de direcciones es: btn_contact
El id del botón para obtener el permiso de visualización y envío del SMS es: btn_sms

inserte la descripción de la imagen aquí

Función de devolución de llamada onRequestPermissionsResult

Esta función de devolución de llamada se ejecutará después de que el usuario haga clic en la ventana emergente para obtener permisos de forma dinámica. Cuando aparece la ventana para obtener permisos de forma dinámica, el usuario puede seleccionar "Permitir" o "No permitir" en la ventana. Una vez completada la selección, se puede realizar un juicio correspondiente en la función de devolución de llamada para determinar si el usuario ha permitido la permiso.

La función está en la clase MainActivity

//点击申请权限弹框后的回调函数
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    
    
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

Clase de herramienta de evaluación de permisos

public class PermissionUtil {
    
    

    //检查某个功能的多个权限,返回true表示已完全启用权限,返回false表示未完全启用权限
    //比如通讯录这个功能,需要获取它有的多个权限[读权限,写权限]
    //act:当前的Activity 
    //permissions:某个功能的权限集合,如通讯录的[读,写]
    //requestCode:标识一下“某个功能”
    public static boolean checkPermission(Activity act, String[] permissions, int requestCode){
    
    

        //判断android的版本
        //Build.VERSION.SDK_INT:当前android的版本
        //Build.VERSION_CODES.M:android6.0
        if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){
    
    //安卓版本在6.0及以后才需要判断  M就是6.0
           
           //check的含义:权限是否开启
           //这里给了默认值PackageManager.PERMISSION_GRANTED,意思是开启权限
            int check = PackageManager.PERMISSION_GRANTED;//默认授权的值
            for (String permission:permissions){
    
    
                //返回结果为是否授权
                check = ContextCompat.checkSelfPermission(act, permission);
                //如果没有授权,则退出
                if (check!=PackageManager.PERMISSION_GRANTED){
    
    
                    break;
                }
            }
            //未开启该权限,则请求系统弹窗,好让用户选择是否立即开启权限
            if (check!=PackageManager.PERMISSION_GRANTED){
    
    
                //弹窗,用户操作
                ActivityCompat.requestPermissions(act,permissions,requestCode);
                return false;
            }

        }

        return true;
    }

    //grantResults:是用户点“授权”完弹窗后的授权结果数组
    //检查权限结果数组,返回true表示都已经获得授权。返回false表示至少有一个未获得授权
    public static boolean checkGrant(int[] grantResults) {
    
    

        if (grantResults!=null){
    
    

            //遍历权限结果数组中的每条选择结果
            for (int grant:grantResults){
    
    
                //未获得授权
                if (grant!=PackageManager.PERMISSION_GRANTED){
    
    
                    return false;
                }

            }
            return true;
        }

        return false;
    }
}

archivo de manifiesto

Declarar permisos Permisos (deben declararse)

<!--    声明读写通讯录权限-->
    <uses-permission android:name="android.permission.READ_CONTACTS"/>
    <uses-permission android:name="android.permission.WRITE_CONTACTS"/>
<!--声明读发短信权限-->
    <uses-permission android:name="android.permission.READ_SMS"/>
    <uses-permission android:name="android.permission.SEND_SMS"/>

inserte la descripción de la imagen aquí

Método 1: estilo perezoso

Como se mencionó anteriormente, el estilo perezoso es obtener el permiso correspondiente cuando la aplicación ejecuta una función específica . La "función específica" aquí es obtener el permiso de forma dinámica cuando se hace clic en el botón.

Definir una matriz de permisos

//通信录的读写权限
    private static final String[] PERMISSIONS_CONTACTS=new String[]{
    
    
            Manifest.permission.READ_CONTACTS,//读通讯录
            Manifest.permission.WRITE_CONTACTS//写通讯录
    };

    //短信的发送、读取权限
    private static final String[] PERMISSIONS_SMS=new String[]{
    
    
            Manifest.permission.SEND_SMS,//发送短信
            Manifest.permission.READ_SMS//读取短信
    };

código de identificación

//标识通讯录
    private static final int REQUEST_CODE_CONTACTS=1;
    //标识短信
    private static final int REQUEST_CODE_SMS=2;

Hacer clic en monitoreo de eventos
Implementar View.OnClickListener e implementar el método onClick

@Override
    public void onClick(View view) {
    
    
        switch (view.getId()){
    
    
            case R.id.btn_contact:
                PermissionUtil.checkPermission(this,PERMISSIONS_CONTACTS,REQUEST_CODE_CONTACTS);
                break;
            case R.id.btn_sms:
                PermissionUtil.checkPermission(this,PERMISSIONS_CONTACTS,REQUEST_CODE_SMS);
                break;
        }
    }

Podemos ver que si no hay autorización se ejecutará la siguiente sentencia en la clase de herramienta PermissionUtil:

ActivityCompat.requestPermissions(act,permissions,requestCode);

Habrá una ventana emergente para que el usuario elija si desea obtener todos los permisos.
inserte la descripción de la imagen aquí
Después de que el usuario elija, volverá a llamar a la Actividad, para que podamos juzgar si autorizar en esta función.

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    
    
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

Código completo de MainActivity

package com.example.demo8;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.Manifest;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

import com.example.demo8.util.PermissionUtil;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    
    

    //通信录的读写权限
    private static final String[] PERMISSIONS_CONTACTS=new String[]{
    
    
            Manifest.permission.READ_CONTACTS,
            Manifest.permission.WRITE_CONTACTS
    };

    //短信的发送、读取权限
    private static final String[] PERMISSIONS_SMS=new String[]{
    
    
            Manifest.permission.SEND_SMS,
            Manifest.permission.READ_SMS
    };

    //标识通讯录
    private static final int REQUEST_CODE_CONTACTS=1;
    //标识短信
    private static final int REQUEST_CODE_SMS=2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //设置监听事件
        findViewById(R.id.btn_contact).setOnClickListener(this);
        findViewById(R.id.btn_sms).setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
    
    
        switch (view.getId()){
    
    
            case R.id.btn_contact:
                //上下文、权限数组、标识
                PermissionUtil.checkPermission(this,PERMISSIONS_CONTACTS,REQUEST_CODE_CONTACTS);
                break;
            case R.id.btn_sms:
                PermissionUtil.checkPermission(this,PERMISSIONS_SMS,REQUEST_CODE_SMS);
                break;
        }
    }


    //点击申请权限弹框后的回调函数
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    
    
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        switch (requestCode){
    
    
            case REQUEST_CODE_CONTACTS:
                if (PermissionUtil.checkGrant(grantResults)){
    
    
                    Toast.makeText(this, "通讯录权限获取成功", Toast.LENGTH_SHORT).show();
                }else{
    
    
                    Toast.makeText(this, "获取通讯录读写权限获取失败", Toast.LENGTH_SHORT).show();
                }
                break;
            case REQUEST_CODE_SMS:
                if (PermissionUtil.checkGrant(grantResults)){
    
    
                    Toast.makeText(this, "收发短信权限获取成功", Toast.LENGTH_SHORT).show();
                }else{
    
    
                    Toast.makeText(this, "收发短信权限获取失败", Toast.LENGTH_SHORT).show();
                }
                break;
        }

    }
}

Método 2: estilo chino hambriento

El estilo chino hambriento es solicitar permisos en el momento de "onCreate", y está en su lugar al mismo tiempo.

Ponemos todos los permisos que deben solicitarse en una matriz

//将权限放到一个数组中
    private static final String[] PERMISSIONS=new String[]{
    
    
            //通信录的读写权限
            Manifest.permission.READ_CONTACTS,
            Manifest.permission.WRITE_CONTACTS,

            //短信的发送、读取权限
            Manifest.permission.SEND_SMS,
            Manifest.permission.READ_SMS
    };

Solicitud de permisos en oncreate
inserte la descripción de la imagen aquí
El resto de los principios son los mismos que los del estilo perezoso, pero el tiempo para solicitar permisos es diferente.

Contactos
inserte la descripción de la imagen aquí
SMS
inserte la descripción de la imagen aquí
MainActivity código

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    
    


    //将权限放到一个数组中
    private static final String[] PERMISSIONS=new String[]{
    
    
            //通信录的读写权限
            Manifest.permission.READ_CONTACTS,
            Manifest.permission.WRITE_CONTACTS,

            //短信的发送、读取权限
            Manifest.permission.SEND_SMS,
            Manifest.permission.READ_SMS
    };

    private static final int REQUEST_CODE=1;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        /初始获取权限
        PermissionUtil.checkPermission(this,PERMISSIONS,REQUEST_CODE);

        //设置监听事件
        findViewById(R.id.btn_contact).setOnClickListener(this);
        findViewById(R.id.btn_sms).setOnClickListener(this);
    }
//饿汉式这里无用
    @Override
    public void onClick(View view) {
    
    
        switch (view.getId()){
    
    
            case R.id.btn_contact:
                break;
            case R.id.btn_sms:
                break;
        }
    }


    //点击申请权限弹框后的回调函数
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    
    
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        switch (requestCode){
    
    
            case REQUEST_CODE:
                if (PermissionUtil.checkGrant(grantResults)){
    
    
                    Toast.makeText(this, "权限获取成功", Toast.LENGTH_SHORT).show();
                }else{
    
    
                    Toast.makeText(this, "权限获取失败", Toast.LENGTH_SHORT).show();
                }
                break;
        }

    }
}

Supongo que te gusta

Origin blog.csdn.net/baiqi123456/article/details/128706330
Recomendado
Clasificación