Android----权限申请结构化

作者: pgydbh | 来源:发表于2018-07-01 21:36 被阅读69次

目录

目录.png

文件结构

结构.png

思路

param.png
每一个asker 有很多属性, 有三个方法【请求时】【用户处理后】【用户前往设置界面处理后】

工具代码

接口
public interface OnAskAppearListener {
    void onAppear();
}
工具类
public class PermissionAsker {

    private Activity activity;//activity
    private OnAskAppearListener listener;//申请权限时要执行的事件
    private String permission;//权限
    private int permissionCode;//权限申请码,不同权限,不能冲突
    private int activityCode;//设置界面权限申请码,不同权限不能冲突
    private boolean popTip;//是否要弹出提示跳转权限设置界面
    private String askReason;//权限跳转提示语句


    /**
     * 构造一个asker
     * @param activity activity
     * @param listener 申请权限时要执行的事件
     * @param permisstion 权限
     * @param permissionCode 权限申请的requestCode
     * @param activityCode 跳转到设置界面的requestCode
     * @param askReason 是否弹出dialog跳转到权限设置
     * @param popTip 弹出dialog提示语句
     */
    public PermissionAsker(Activity activity,OnAskAppearListener listener, String permisstion, int permissionCode, int activityCode, String askReason, boolean popTip){
        this.activity = activity;
        this.listener = listener;
        this.permission = permisstion;
        this.permissionCode = permissionCode;
        this.activityCode = activityCode;
        this.popTip = popTip;
        this.askReason = askReason;
    }


    /**
     * 请求时
     */
    public void onAsk(){
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && ActivityCompat.checkSelfPermission(activity, permission) != PackageManager.PERMISSION_GRANTED) {
            activity.requestPermissions(new String[]{permission},permissionCode);
        }
        else{
            listener.onAppear();
        }
    }


    /**
     * 权限申请对方选取是否拒绝后
     * @param requestCode
     * @param grantResults
     */
    public void onChoose(int requestCode, int[] grantResults){
        if (requestCode == permissionCode){
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED){
                listener.onAppear();
            }else{
                if (popTip){
                    AlertDialog.Builder dialog = new AlertDialog.Builder(activity).setTitle("权限申请").setMessage(askReason)
                            .setPositiveButton("立即开启", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    goToAppSetting();
                                }
                            }).setNegativeButton("取消", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    dialog.cancel();
                                }
                            });
                    dialog.show();
                }
            }
        }
    }


    /**
     * 设置界面返回后
     * @param requestCode
     */
    public void onSet(int requestCode){
        if (requestCode == activityCode &&
                Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&
                ActivityCompat.checkSelfPermission(activity, permission) == PackageManager.PERMISSION_GRANTED) {
            listener.onAppear();
        }
    }


    // 跳转到当前应用的设置界面
    private void goToAppSetting() {
        Intent intent = new Intent();
        intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
        Uri uri = Uri.fromParts("package", activity.getPackageName(), null);
        intent.setData(uri);
        activity.startActivityForResult(intent, activityCode);
    }
}

使用代码

public class MainActivity extends AppCompatActivity implements View.OnClickListener {


    private PermissionAsker askerRead;//申请写入权限
    private PermissionAsker askerWrite;//申请读取权限
    private PermissionAsker askerRecode;//申请录音权限
    private PermissionAsker askerCamera;//申请拍照权限

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

        askerRead = new PermissionAsker(this, new OnAskAppearListener() {
            @Override
            public void onAppear() {
                Toast.makeText(MainActivity.this, "已经成功获取文件读取权限", Toast.LENGTH_SHORT).show();
            }
        },Manifest.permission.READ_EXTERNAL_STORAGE,2,2, "为了测试,我希望申请文件读取权限",true);

        askerWrite = new PermissionAsker(this, new OnAskAppearListener() {
            @Override
            public void onAppear() {
                Toast.makeText(MainActivity.this, "已经成功获取文件写入权限", Toast.LENGTH_SHORT).show();
            }
        },Manifest.permission.WRITE_EXTERNAL_STORAGE,3,3, "为了测试,我希望申请文件写入权限",true);

        askerRecode = new PermissionAsker(this, new OnAskAppearListener() {
            @Override
            public void onAppear() {
                Toast.makeText(MainActivity.this, "已经成功获取录音权限", Toast.LENGTH_SHORT).show();
            }
        },Manifest.permission.RECORD_AUDIO,4,4, "为了测试,我希望申请录音权限",false);

        askerCamera = new PermissionAsker(this, new OnAskAppearListener() {
            @Override
            public void onAppear() {
                Toast.makeText(MainActivity.this, "已经成功获取拍照权限", Toast.LENGTH_SHORT).show();
            }
        },Manifest.permission.CAMERA,5,5, "为了测试,我希望申请拍照权限",false);

        findViewById(R.id.btn_read).setOnClickListener(this);
        findViewById(R.id.btn_write).setOnClickListener(this);
        findViewById(R.id.btn_recode).setOnClickListener(this);
        findViewById(R.id.btn_carame).setOnClickListener(this);
    }


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

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        askerRead.onSet(requestCode);
        askerWrite.onSet(requestCode);
        askerRecode.onSet(requestCode);
        askerCamera.onSet(requestCode);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.btn_read:
                askerRead.onAsk();
                break;
            case R.id.btn_write:
                askerWrite.onAsk();
                break;
            case R.id.btn_recode:
                askerRecode.onAsk();
                break;
            case R.id.btn_carame:
                askerCamera.onAsk();
                break;
        }
    }
}

demo

https://github.com/pgyCode/AskPermission

相关文章

网友评论

    本文标题:Android----权限申请结构化

    本文链接:https://www.haomeiwen.com/subject/imuhuftx.html