美文网首页
Android 动态权限申请

Android 动态权限申请

作者: YoungEveryday | 来源:发表于2019-08-15 10:06 被阅读0次

    一、需求

    开发Android首先要动态提示用户授权,比如访问摄像头、读取本地照片等等,这些都需要用户动态提供权限,然后程序才能有权限动态操作。

    二、流程分析

    ①在AndroidManifest.xml添加需要的权限列表

        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
        <uses-permission android:name="android.permission.CAMERA"/>
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
        <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
        <uses-permission android:name="android.permission.RECORD_AUDIO"/>
        <uses-permission android:name="android.permission.CALL_PHONE"/>
    

    ②创建Activity,在Activity中创建权限数组

    private String[] str = new String[]{
                Manifest.permission.READ_EXTERNAL_STORAGE,
                Manifest.permission.WRITE_EXTERNAL_STORAGE,
                Manifest.permission.CAMERA,
                Manifest.permission.ACCESS_COARSE_LOCATION,
                Manifest.permission.ACCESS_FINE_LOCATION,
                Manifest.permission.READ_PHONE_STATE,
                Manifest.permission.ACCESS_WIFI_STATE,
                Manifest.permission.RECORD_AUDIO,
                Manifest.permission.CALL_PHONE
        };
    

    ③进行权限申请

    private void checkPermissions(String[] str) {
            //发现需要申请的权限
            List<String> needPermissions = findNeedPermissions(str);
            if(null!=needPermissions&&needPermissions.size()>0){
                ActivityCompat.requestPermissions(this,
                        needPermissions.toArray(new String[needPermissions.size()]),
                        REQUEST_CODE);
            }
    
        }
    private List<String> findNeedPermissions(String[] str){
            for(String string:str){
                if (ContextCompat.checkSelfPermission(this,
                        string) != PackageManager.PERMISSION_GRANTED
                        || ActivityCompat.shouldShowRequestPermissionRationale(
                        this, string)) {
                    list_needPermission.add(string);
                }
            }
            return list_needPermission;
        }
    

    ④动态监听用户是否授权,如果用户没有授权,弹出框提示用户没有授权,并且可以直接点击设置跳转到设置页面进行授权

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            if (requestCode == REQUEST_CODE) {
                if(!verifyPermissions(grantResults)){
                    showMissingPermissionDialog();
                }
            }
    
        }
    //判断用户是否授权
    private boolean verifyPermissions(int[] grantResults) {
            for (int result : grantResults) {
                if (result != PackageManager.PERMISSION_GRANTED) {
                    return false;
                }
            }
            return true;
        }
    //没有授权弹出AlertDialog
    private void showMissingPermissionDialog() {
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setTitle("提示");
            builder.setMessage("当前应用缺少必要权限。\n\n请点击\"设置\"-\"权限\"-打开所需权限。");
    
            // 拒绝, 退出应用
            builder.setNegativeButton("取消",
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            finish();
                        }
                    });
    
            builder.setPositiveButton("设置",
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            startAppSettings();
                        }
                    });
    
            builder.setCancelable(false);
    
            builder.show();
        }
    //跳转到设置页面
    private void startAppSettings() {
            Intent intent = new Intent(
                    Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
            intent.setData(Uri.parse("package:" + getPackageName()));
            startActivity(intent);
        }
    

    相关文章

      网友评论

          本文标题:Android 动态权限申请

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