在项目中想要检测录音用户是否禁用了录音权限,但是很坑爹的h5+并不提供判断安卓app是否拥有某项权限的接口,只好使用原生类来实现:
录音权限
6.0以下不提供获取接口,只能通过实际录一段声音来判断是否开启录音:
//是否有录音权限
function hasRecordPermission(callback) {
var MediaRecorder = plus.android.importClass('android.media.MediaRecorder');
var AudioFormat = plus.android.importClass('android.media.AudioFormat');
var AudioRecord = plus.android.importClass('android.media.AudioRecord');
var audioSource = MediaRecorder.AudioSource.MIC;
var channelConfig = AudioFormat.CHANNEL_IN_STEREO;
var audioFormat = AudioFormat.ENCODING_PCM_16BIT;
var sampleRateInHz = 44100;
var bufferSizeInBytes = AudioRecord.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat);
var audioRecord = new AudioRecord(audioSource, 44100, channelConfig, audioFormat, bufferSizeInBytes);
try {
// 防止某些手机崩溃,例如联想
audioRecord.startRecording();
} catch(e) {
console.log(e)
//检测不出,强行录音\(^o^)/~
callback(true)
return
}
if(audioRecord.getRecordingState() != AudioRecord.RECORDSTATE_RECORDING) {
//没有录音权限
callback(false)
} else {
audioRecord.stop();
audioRecord.release();
audioRecord = null;
//拥有录音权限
callback(true)
}
}
Android录音文档
参考blog:android 权限录音权限检测
Android 录音和摄像头权限适配
上述方法是粗暴检测安卓6.0之前的录音权限,兼容性请大家测试之后再使用,因为我手里的安卓5.3的华为平板就无论开没开启录音权限,audioRecord.getRecordingState()和AudioRecord.RECORDSTATE_RECORDING总是相等的,但是即使没开启录音权限,这台设备也不影响h5+的录音接口正常调用,只不过最后的录音文件会是0kb的空文件,所以这款pda只能通过判断文件大小来判断是否开启录音文件~
6.0之后系统提供了相关 API:
int hasCameraPermission;
hasCameraPermission = checkSelfPermission(Manifest.permission.CAMERA);
Toast.makeText(this, "camera granted : " + (hasCameraPermission == PackageManager.PERMISSION_GRANTED), Toast.LENGTH_SHORT).show();
只要返回的值为 PackageManager.PERMISSION_GRANTED 就可以判定已经授权改权限。
因为我需要兼容6.0以下所以采用了第一种方法。
下面是摘抄自 Shawn_Dut的博客 ,安卓原生编写,未转化为native.js。
摄像头权限
6.0之前
同录音权限,在 6.0 之前的版本使用 AppOpsManager 在很多机型上会有适配问题,所以在这里依旧粗暴的采用下面这种方案:
public class CameraPermissionCheckUtils {
private static final String TAG = "CameraPermissionCheckUtils";
public static boolean checkCameraPermission(Context context) {
boolean canUse = true;
Camera mCamera = null;
try {
mCamera = Camera.open(0);
mCamera.setDisplayOrientation(90);
} catch (Exception e) {
AVLogUtils.e(TAG, Log.getStackTraceString(e));
canUse = false;
}
if (canUse) {
mCamera.release();
mCamera = null;
}
return canUse;
}
}
但是貌似在少数机型和手机上依旧会有判断错误的情况存在,而且由于这个函数会调用 Camera.open 函数,所以造成在少些手机上会卡顿一下。
6.0 及之后
6.0 之后就直接使用系统 API 进行判断就可以了:
int hasAudioPermission;
hasAudioPermission = checkSelfPermission(Manifest.permission.RECORD_AUDIO);
Toast.makeText(this, "audio granted : " + (hasAudioPermission == PackageManager.PERMISSION_GRANTED),
Toast.LENGTH_SHORT).show();
同样,只要判断返回结果为 PackageManager.PERMISSION_GRANTED 就可以判定 app 已被授权摄像头权限。