场景一:
描述:部分安卓手机,尽管系统是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;
}
}
}
写在最后:
此方法有个问题,如果摄像头、或者录音被其他应用占用,此处也返回失败,其他权限是有的,需要优化
完毕。。。