Android 运行时权限问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/w690333243/article/details/89203663

代码类(Activity)中添加如下部分

public static String[] permissions = new String[]{Manifest.permission.READ_PHONE_STATE, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE};
    /**
     * 检测权限
     *
     * @param activity
     * @param permissionName
     * @return
     */
    private static String[] checkRequestedPermission(Activity activity, String[] permissionName) {
        boolean isPermissionGranted;
        List<String> needRequestPermission = new ArrayList<String>();
        for (String tmp : permissionName) {
            isPermissionGranted = (PackageManager.PERMISSION_GRANTED ==
                    ActivityCompat.checkSelfPermission(activity, tmp));
            if (!isPermissionGranted) {
                needRequestPermission.add(tmp);
            }
        }
        String[] needRequestPermissionArray = new String[needRequestPermission.size()];
        needRequestPermission.toArray(needRequestPermissionArray);
        return needRequestPermissionArray;
    }

    private static final String[] REQUIRED_PERMISSIONS = {
            //读写SD卡
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE,
            //获取手机状态
            //Manifest.permission.READ_PHONE_STATE,
            //Manifest.permission.RECEIVE_SMS,
            //Manifest.permission.READ_CONTACTS,
            //Manifest.permission.READ_SMS,
            //获取位置信息
            //Manifest.permission.ACCESS_COARSE_LOCATION,
            //Manifest.permission.ACCESS_FINE_LOCATION
            //Manifest.permission.REQUEST_INSTALL_PACKAGES


    };//Manifest.permission.CALL_PHONE
    private static final int REQUEST_CODE_INSTALL_PERMISSION = 107;
    private static final int REQUEST_CODE = 100;
    //private String[] mRequestedPermissons;
    private static final String PACKAGE_URL_SCHEME = "package:";
    boolean isAllPermissionsGranted = true;

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        //super.onActivityResult(requestCode, resultCode, data);
        //LogUtils.i(TAG, "onActivityResult: resultCode:" + resultCode);
        if (resultCode == RESULT_OK && requestCode == REQUEST_CODE_INSTALL_PERMISSION) {
            checkInstallPermission();//再次执行安装流程,包含权限判等
        } else {
            finish();
        }
    }

    @RequiresApi(api = Build.VERSION_CODES.O)
    private void startInstallPermissionSettingActivity() {
        //LogUtils.i(TAG, "startInstallPermissionSettingActivity: ");
        Uri packageURI = Uri.parse(PACKAGE_URL_SCHEME + getPackageName());
        //注意这个是8.0新API
        Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, packageURI);
        //Intent intent = new Intent(Intent.ACTION_INSTALL_PACKAGE, packageURI);
        //intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivityForResult(intent, REQUEST_CODE_INSTALL_PERMISSION);
        getPackageManager().canRequestPackageInstalls();
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions,
                                           int[] grantResults) {
        if (requestCode != REQUEST_CODE || permissions == null || grantResults == null ||
                permissions.length == 0 || grantResults.length == 0) {
            isAllPermissionsGranted = false;
        } else {
            for (int i : grantResults) {
                if (i != PackageManager.PERMISSION_GRANTED)
                    isAllPermissionsGranted = false;
            }
        }
        if (isAllPermissionsGranted) {
            Log.i(TAG, "onRequestPermissionsResult  isAllPermissionsGranted");
            checkInstallPermission();
        } else {
            showMissingPermissionDialog();
        }
    }


    private void showMissingPermissionDialog() {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("帮助");
        builder.setMessage("没有必需权限无法使用此应用。请在“设置”中授予权限。");
        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) {
                        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                        intent.setData(Uri.parse(PACKAGE_URL_SCHEME + getPackageName()));
                        startActivity(intent);
                        finish();
                    }
                });
        builder.setCancelable(false);
        builder.show();
    }

    //安装应用的流程
    private void checkInstallPermission() {
        boolean haveInstallPermission;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {//8.0
            //先获取是否有安装未知来源应用的权限
            haveInstallPermission = getPackageManager().canRequestPackageInstalls();
            if (!haveInstallPermission) {//没有权限
                //没有未知来源安装权限权限
                AlertDialog.Builder builder = new AlertDialog.Builder(this);
                builder.setTitle("提示");
                builder.setMessage("需要打开安装未知来源权限,请去设置中开启应用权限,以允许安装来自此来源的应用");
                builder.setPositiveButton("去设置", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                            startInstallPermissionSettingActivity();
                        }
                    }
                });
                builder.show();
                return;//防止系统执行默认的方法会跳转页面后弹窗提示,所以会重复 return 掉
            }
        }
        //有权限,开始安装应用程序
        //installApk(apk);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//23
            String[] neededPermissions =
                    checkRequestedPermission(this, REQUIRED_PERMISSIONS);
            if (neededPermissions != null && neededPermissions.length != 0) {
                requestPermissions(neededPermissions, REQUEST_CODE);
            } else {
                checkInstallPermission();
            }
        }
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_voice_encryption);

        mPlayButton = (Button) findViewById(R.id.playButton);
        mPlayButton.setOnClickListener(this);
        mEncryptionButton = (Button) findViewById(R.id.encryptionButton);
        mEncryptionButton.setOnClickListener(this);
        mDecryptionButton = (Button) findViewById(R.id.decryptionButton);
        mDecryptionButton.setOnClickListener(this);
    }

猜你喜欢

转载自blog.csdn.net/w690333243/article/details/89203663