Android 6.0RunTime Permission完美解决方案

来源:互联网 发布:mac androidsdk 编辑:程序博客网 时间:2024/05/19 21:15

Android6.0新引进了全新的权限管理方式,不了解的可以先去查看

Android 6.0 新特性之 RunTime Permissions :http://blog.csdn.net/u011068996/article/details/50517869

本文主要讲解在android6.0中的动态权限管理的解决方案。


在6.0中需要动态获取权限,而在动态获取权限的时候,默认提示框包含不在提示按钮,一旦用户勾选了不在提示,那么默认的系统提示框就不会再出现,因此我们需要自定义系统提示框。

在Api 23中, 权限需要动态获取, 核心权限必须满足. 标准流程:
这里写图片描述


下面我们以读取文件权限为例,演示对动态权限获取的解决方案.

1 、 权限检测工具

 public class PermissionHelper {    private Context mContext;    public static final String PACKAGE = "package:";    public PermissionHelper(Context context) {        this.mContext = context;    }    /**     * 判断权限集合     *     * @param permissions 检测权限的集合     * @return 权限已全部获取返回true,未全部获取返回false     */    public boolean checkPermissions(String... permissions) {        for (String permission : permissions) {            if (!checkPermission(permission)) {                return false;            }        }        return true;    }    /**     * 判断权限是否获取     *     * @param permission 权限名称     * @return 已授权返回true,未授权返回false     */    public boolean checkPermission(String permission) {        return ContextCompat.checkSelfPermission(mContext, permission) == PackageManager.PERMISSION_GRANTED;    }    /**     * 获取权限     *     * @param resultCode     * @return     */    public void permissionsCheck(String permission, int resultCode) {        // 注意这里要使用shouldShowRequestPermissionRationale而不要使用requestPermission方法        // 因为requestPermissions方法会显示不在询问按钮        if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) mContext, permission)) {            //如果用户以前拒绝过改权限申请,则给用户提示            showMissingPermissionDialog();        } else {            //进行权限请求            ActivityCompat.requestPermissions((Activity) mContext,                    new String[]{permission},                    resultCode);        }//        ActivityCompat.requestPermissions((Activity) mContext, new String[]{permission},resultCode);    }    // 显示缺失权限提示    private void showMissingPermissionDialog() {        AlertDialog.Builder builder = new AlertDialog.Builder(mContext);        final AlertDialog alertDialog = builder.create();        builder.setMessage("当前应用缺少必要权限。\n\n请点击\"设置\"-\"权限\"-打开所需权限。\n\n最后点击两次后退按钮,即可返回。");        // 拒绝, 退出应用        builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {            @Override public void onClick(DialogInterface dialog, int which) {                alertDialog.dismiss();            }        });        builder.setPositiveButton("设置", new DialogInterface.OnClickListener() {            @Override public void onClick(DialogInterface dialog, int which) {                startAppSettings();            }        });        builder.show();    }    // 启动应用的设置    public void startAppSettings() {        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);        intent.setData(Uri.parse( PACKAGE + mContext.getPackageName()));        mContext.startActivity(intent);    }}

2、主界面
假设进入主界面的时候需要获取到文件访问权限,获取成功的话,进入另一个Activity,在onResume()方法中判断获取权限状态。

public class MainActivity extends AppCompatActivity {    //返回值    private static final int  WRITE_RESULT_CODE = 12;    //权限名称    private static final String  WRITE_PERMISSION = Manifest.permission.WRITE_EXTERNAL_STORAGE;    //权限检测类    private PermissionHelper mPermissionHelper;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mPermissionHelper = new PermissionHelper(this);    }    @Override    protected void onResume() {        super.onResume();        //判断权限授权状态        boolean b = mPermissionHelper.checkPermission(WRITE_PERMISSION);        //如果没有获取到权限,则尝试获取权限        if (!b){            mPermissionHelper.permissionsCheck(WRITE_PERMISSION,WRITE_RESULT_CODE);        }else{            //如果请求成功,则进行相应的操作,比如我们这里打开一个新的Activity            Intent intent = new Intent(MainActivity.this,PermissionActivity.class);            startActivity(intent);        }    }    @Override    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {        super.onRequestPermissionsResult(requestCode, permissions, grantResults);        switch(requestCode){            case WRITE_RESULT_CODE:                if (grantResults.length > 0                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {                    //如果请求成功,则进行相应的操作,比如我们这里打开一个新的Activity                    Intent intent = new Intent(MainActivity.this,PermissionActivity.class);                    startActivity(intent);                } else {                    //如果请求失败                    mPermissionHelper.startAppSettings();                }                break;        }    }}

动态权限授权虽然给程序员带来了一些麻烦,但是Google这样做也是为了Android能有更好的用户体验和更高的安全系数,最后祝愿移动开发越来越好(因为我也是IOS程序员 0.0)。

代码地址:http://download.csdn.net/detail/u011068996/9421242

1 0
原创粉丝点击