Android权限相关问题的处理

在项目中有个功能需要录制一段视频并上传,在做机型适配的时候,发现权限是个很大的问题。如果用户禁掉了某一个权限,像如摄像头、录音或本地文件存取等,程序就会崩掉,还是挺烦人的。后来从网上查阅资料,试了一些解决方法,效果还是不错的。

简述

首先是关于版本的问题,在Android 6.0系统(targetSdkVersion 23)以前,在安装应用时,只要点了确认安装,清单文件中申请的权限统一默认授予。当然通过一些权限管理软件是可以手动关掉的,这时候可能会出现崩溃的情况,即便有时候没有崩溃,但是这些功能是不可用的,例如录像保存的文件大小为0。这样我们可以在通过trycatch捕获异常,弹出提示,我们无法弹出权限授予的对话框,但是提示一下用户让用户自己通过权限管理软件打开相关的权限也是极好的。

关于Android 6.0系统(targetSdkVersion 23)以后的版本,google在原有的AndroidManifest.xml声明权限的基础上,良心新增了运行时权限动态检测,这样我们就可以在需要使用时动态申请某项权限了。具体方法见示例代码,需要重写onRequestPermissionsResult方法,当申请权限后,用户点击同意或拒绝都是会回调此方法的。当然这里只是简单的示例,网上还有更加详细的文章,有兴趣可以自己搜一下。


代码

//视频录制需要的权限(相机,录音,外部存储)
    private String[] VIDEO_PERMISSION = {
            Manifest.permission.CAMERA, 
            Manifest.permission.RECORD_AUDIO, 
            Manifest.permission.WRITE_EXTERNAL_STORAGE};
    //未权限集合
    private List<String> NO_VIDEO_PERMISSION = new ArrayList<String>();

    /**
     * 检测摄像头权限,具备相关权限才能继续
     */
    private void checkCameraPermission() {
        NO_VIDEO_PERMISSION.clear();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//当前版本大于23检测,小于的直接跳转
            for (int i = 0; i < VIDEO_PERMISSION.length; i++) {//存在未授权的权限就添加到集合
                if (ActivityCompat.checkSelfPermission(this, VIDEO_PERMISSION[i]) != PackageManager.PERMISSION_GRANTED) {
                    NO_VIDEO_PERMISSION.add(VIDEO_PERMISSION[i]);
                }
            }
            if (NO_VIDEO_PERMISSION.size() == 0) {//有未授权的权限就申请该权限
                Intent intent = new Intent(this, RecordVideoActivity.class);
                startActivity(intent);
            } else {
                ActivityCompat.requestPermissions(this, NO_VIDEO_PERMISSION.toArray(new String[NO_VIDEO_PERMISSION.size()]), REQUEST_CAMERA);
            }
        } else {
            Intent intent = new Intent(this, RecordVideoActivity.class);
            startActivity(intent);
        }
    }

    private static final int REQUEST_CAMERA = 0;

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        if (requestCode == REQUEST_CAMERA) {
            boolean flag = false;
            for (int i = 0; i < grantResults.length; i++) {
                if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
                    flag = true;
                } else {
                    flag = false;
                    break;
                }
            }
            if (flag) {
                Toast.makeText(this, "已授权", Toast.LENGTH_SHORT).show();
                Intent intent = new Intent(this, RecordVideoActivity.class);
                startActivity(intent);
            } else {
                Toast.makeText(this, "授权失败", Toast.LENGTH_SHORT).show();
            }
        } else {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }