Processamento de vários status de permissões quando o Android 6.0 está em execução (proibido, sem aviso/sem pergunta após a proibição)

Existem muitos tutoriais online sobre permissões de tempo de execução do Android 6.0, mas a maioria deles não é muito abrangente. É um aplicativo simples, mas realmente acabou? O fluxo lógico funciona?

por exemplo:

E se o usuário negar permissão?

E se a permissão for negada e você decidir não pedir novamente?

E se o usuário escolher uma permissão e desabilitar o restante?

E se o usuário optar por não permitir ao entrar no sistema para selecionar as permissões e depois retornar ao nosso programa?

Veja como resolver este problema: primeiro vamos tirar uma foto

 É um pouco feio, mas você pode ver.

Analisando o problema, o usuário deve exibir uma caixa pop-up informando ao usuário que algumas funções não podem ser utilizadas sem autorização, e deixar o usuário autorizar. Se o usuário proibir a permissão e selecionar a opção de não avisar novamente, então será não será solicitada permissão. Solicitará que você concorde com a autorização. Neste momento, permitiremos que o usuário vá para a página de permissão do sistema para autorizar. Há um problema na implementação aqui. Quando a caixa é exibida duas vezes, ela devem ser duas permissões, e ela retornou duas vezes. Aqui, basta colocar a inicialização do bullet box fora, e só exibir a operação no retorno da permissão. A seguir está o código completo para referência:

public class Main2Activity extends AppCompatActivity {
    private static final int NOT_NOTICE = 2;//如果勾选了不再询问
    private AlertDialog alertDialog;//禁止
    private AlertDialog mDialog;//禁止了并且不再提示
    //TODO 要申请的权限,这里我只放了读取文件和相机权限
    private static String[] PERMISSIONS_STORAGE = {
            Manifest.permission.CAMERA,
            Manifest.permission.WRITE_EXTERNAL_STORAGE};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //禁止当前页面截屏
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
        setContentView(R.layout.activity_main2);
        initDiaLogs();//初始化弹框
        requetPermission();//检测是否授权权限
    }

    /**
     * 检测是否有相关权限没有去授权
     * */
    private void requetPermission() {
        for (String permission : PERMISSIONS_STORAGE) {
            if (ContextCompat.checkSelfPermission(this, permission) != PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(this, PERMISSIONS_STORAGE, 1);
            } else {
                Toast.makeText(this, "您已经申请了权限!", Toast.LENGTH_SHORT).show();
            }
        }
    }

    /**
     * 授权返回结果:
     * 1.始终允许
     * 2.禁止
     * 3.禁止后不再提示
     * */
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 1) {
            for (int i = 0; i < permissions.length; i++) {
                if (grantResults[i] == PERMISSION_GRANTED) {//选择了“始终允许”
                    Toast.makeText(this, "" + "权限" + permissions[i] + "申请成功", Toast.LENGTH_SHORT).show();
                } else {
                    if (!ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[i])) {//用户选择了禁止不再询问
                        //TODO 不要在这里初始化Dialog,会导致弹框弹两遍
                        if (mDialog != null && mDialog.isShowing()) {
                            mDialog.show();
                        }
                    } else {//选择禁止
                        if (alertDialog != null && !alertDialog.isShowing()) {
                            alertDialog.show();
                        }
                    }
                }
            }
        }
    }

    /**
     * 初始化弹框
     * */
    public void initDiaLogs() {
        //禁止后不再提示的弹框
        AlertDialog.Builder builder1 = new AlertDialog.Builder(Main2Activity.this);
        builder1.setTitle("申请权限")
                .setMessage("由于您未授权会导致部分功能无法使用")
                .setPositiveButton("去授权", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        if (mDialog != null && mDialog.isShowing()) {
                            mDialog.dismiss();
                        }
                        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                        Uri uri = Uri.fromParts("package", getPackageName(), null);//注意就是"package",不用改成自己的包名
                        intent.setData(uri);
                        startActivityForResult(intent, NOT_NOTICE);
                    }
                });
        mDialog = builder1.create();
        mDialog.setCanceledOnTouchOutside(false);

        //禁止后的弹框
        AlertDialog.Builder builder = new AlertDialog.Builder(Main2Activity.this);
        builder.setTitle("申请权限")
                .setMessage("由于您未授权会导致部分功能无法使用")
                .setPositiveButton("去授权", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        if (alertDialog != null && alertDialog.isShowing()) {
                            alertDialog.dismiss();
                        }
                        requetPermission();
                    }
                });
        alertDialog = builder.create();
        alertDialog.setCanceledOnTouchOutside(false);
    }

    /**
     * 从系统权限那里过来如果没有权限需要再次申请
     * */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == NOT_NOTICE) {
            requetPermission();//由于不知道是否选择了允许所以需要再次判断
        }
    }
}

As anotações são bem completas. Aqui eu as utilizo diretamente na classe. Você pode encapsula-las na classe ferramenta, ou escrevê-las na classe base. Está tudo bem, basta sair da interface de permissão

 

Acho que você gosta

Origin blog.csdn.net/lanrenxiaowen/article/details/112615471
Recomendado
Clasificación