解决安卓6.0部分手机动态申请权限无效、和6.0以下没有权限申请的问题

场景一:

描述:部分安卓手机,尽管系统是6.0,但是动态申请了权限,还是没有权限弹窗;

分析:尽管手机是6.0系统,但是还是用的之前的机制。只有在真正使用到权限并执行相关代码时,才弹出权限提示框;

场景二:

描述:安卓6.0权限申请,点击了《不允许后不再询问》,下次再检查,不会走回调;

场景三:

描述:安卓6.0以下,没有权限申请,只有用到的时候,才会弹出;一旦用户拒绝了权限,无法监听,会导致各种异常;

针对以上场景,下面给出解决方案:模拟启动摄像头、模拟打开录音

模拟启动摄像头:

public static boolean hasCameraPermission() {
        try {
            Camera camera = Camera.open(0);
            try {
                Camera.Parameters param = camera.getParameters();
                if (param != null) {
                    camera.release();
                    camera = null;
                    return true;
                } else {
                    camera.release();
                    camera = null;
                    return false;
                }
            } catch (Exception e) {
                camera.release();
                camera = null;
                return false;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

模拟打卡录音:

public static boolean hasRecordPermission() {
        int minBufferSize = AudioRecord.getMinBufferSize(8000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
        int bufferSizeInBytes = 640;
        byte[] audioData = new byte[bufferSizeInBytes];
        int readSize = 0;
        AudioRecord audioRecord = null;
        try {
            audioRecord = new AudioRecord(MediaRecorder.AudioSource.DEFAULT, 8000,
                    AudioFormat.CHANNEL_IN_MONO,
                    AudioFormat.ENCODING_PCM_16BIT, minBufferSize);
            // 开始录音
            audioRecord.startRecording();
        } catch (Exception e) {
            //可能情况一
            if (audioRecord != null) {
                audioRecord.release();
                audioRecord = null;
            }
            return false;
        }
        // 检测是否在录音中,6.0以下会返回此状态
        if (audioRecord.getRecordingState() != AudioRecord.RECORDSTATE_RECORDING) {
            //可能情况二
            if (audioRecord != null) {
                audioRecord.stop();
                audioRecord.release();
                audioRecord = null;
            }
            return false;
        } else {// 正在录音
            readSize = audioRecord.read(audioData, 0, bufferSizeInBytes);
            // 检测是否可以获取录音结果
            if (readSize <= 0) {
                //可能情况三
                if (audioRecord != null) {
                    audioRecord.stop();
                    audioRecord.release();
                    audioRecord = null;
                }
                return false;
            } else {
                //有权限,正常启动录音并有数据
                if (audioRecord != null) {
                    audioRecord.stop();
                    audioRecord.release();
                    audioRecord = null;
                }
                return true;
            }
        }
    }

写在最后:

此方法有个问题,如果摄像头、或者录音被其他应用占用,此处也返回失败,其他权限是有的,需要优化

完毕。。。

发布了33 篇原创文章 · 获赞 20 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/huangwenkui1990/article/details/83031266