适配6.0-PermissionsDispatcher_Demo

本文介绍了一个用于Android应用的权限管理框架PermissionsDispatcher的使用方法。通过示例代码详细展示了如何实现不同场景下的权限请求流程,包括首次请求、权限被拒绝但未勾选不再询问以及权限被永久拒绝的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

github: https://github.com/hotchemi/PermissionsDispatcher

package com.example.administrator.myapplication;

import android.Manifest;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;


import permissions.dispatcher.NeedsPermission;
import permissions.dispatcher.OnNeverAskAgain;
import permissions.dispatcher.OnPermissionDenied;
import permissions.dispatcher.OnShowRationale;
import permissions.dispatcher.PermissionRequest;
import permissions.dispatcher.RuntimePermissions;

@RuntimePermissions
public class MainActivity extends AppCompatActivity {
    private final String TAG = "MainActivity";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // MainActivityPermissionsDispatcher这个类由 类名+PermissionsDispatcher 组成
        // 在编译过程中动态生成, 生成的目录在 app/build/generated/source/apt/debug/包名
        // 在运行时, 会调用 @NeedsPermission注解下面的方法, demo里既是take()
        MainActivityPermissionsDispatcher.takeWithCheck(this);
    }

    @NeedsPermission(Manifest.permission.CAMERA)
    void take() {
        Log.d(TAG, "NeedsPermission");
        startCamera();
    }

    // 第一次出现授权提示出现后, 选择拒绝, 下次再进入才会出现
    @OnShowRationale(Manifest.permission.CAMERA)
    void show(final PermissionRequest request) {
        Log.d(TAG, "OnShowRationale");
        new AlertDialog.Builder(this)
                .setMessage("再次请求授权吗?")
                .setPositiveButton("确定", new DialogInterface.OnClickListener(){
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // 再次请求授权(带有不再提示选项)
                        request.proceed();
                    }
                })
                .setNegativeButton("取消", new DialogInterface.OnClickListener(){
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // 执行 OnPermissionDenied注解下面的方法
                        request.cancel();
                    }
                })
                .show();
    }

    // 每次拒绝都会调用一次, 【请求授权】或者request.cancel();
    @OnPermissionDenied(Manifest.permission.CAMERA)
    void denied() {
        Log.d(TAG, "OnPermissionDenied");
    }

    // 当勾选这个以后, 每次进入页面都会调用一次
    @OnNeverAskAgain(Manifest.permission.CAMERA)
    void showNeverAskForCamera(){
        Log.d(TAG, "OnNeverAskAgain");
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        Log.d(TAG, "requestCode = " + requestCode);
        MainActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
    }


    // 启动相机
    private void startCamera() {
        Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
        startActivity(intent);
    }


    // 问题
    // 1.第一次进入选择运行, 没有启动照相机, 既是不调用 @NeedsPermission注解下面的方法
    // 2.不知道如何执行neverAskAgain()

    // 解决
    // 补上onRequestPermissionsResult可以解决

}

更新时间 2017年10月27日17:37:42

最新包版本为3.0.1;

经测试,在第一次进入申请权限时黑屏,应用直接被杀掉;


更新2017年10月30日09:24:06

经反复测试,黑屏的原因是因为申请权限的Activty在注册时声明为
android:noHistory=”true”,去掉这个属性即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值