Android6.0以后需要动态申请权限,常用的写法:
1.AndroidManifest中声明需要的权限
2.检查权限checkSelfPermission(),如果已经开启,do anything。
如果未开启,则提示用户为何申请该权限,或提示去设置界面开启权限等等。
但是在onRequestPermissionsResult回调方法中,有同学可能遇到返回结果一直为GRANTED的情况...
下面贴出相机权限和录音权限申请时的解决方案:
/**
* 通过尝试打开相机的方式判断有无拍照权限(在6.0以下使用拥有root权限的管理软件可以管理权限)
*
* @return
*/
public static boolean cameraIsCanUse() {
boolean isCanUse = true;
Camera mCamera = null;
try {
mCamera = Camera.open();
Camera.Parameters mParameters = mCamera.getParameters();
mCamera.setParameters(mParameters);
} catch (Exception e) {
isCanUse = false;
}
if (mCamera != null) {
try {
mCamera.release();
} catch (Exception e) {
e.printStackTrace();
return isCanUse;
}
}
return isCanUse;
}
// 音频获取源
public static int audioSource = MediaRecorder.AudioSource.MIC;
// 设置音频采样率,44100是目前的标准,但是某些设备仍然支持22050,16000,11025
public static int sampleRateInHz = 44100;
// 设置音频的录制的声道CHANNEL_IN_STEREO为双声道,CHANNEL_CONFIGURATION_MONO为单声道
public static int channelConfig = AudioFormat.CHANNEL_IN_STEREO;
// 音频数据格式:PCM 16位每个样本。保证设备支持。PCM 8位每个样本。不一定能得到设备支持。
public static int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
// 缓冲区字节大小
public static int bufferSizeInBytes = 0;
/**
* 判断是是否有录音权限
*/
public static boolean audioIsCanUse(final Context context) {
bufferSizeInBytes = 0;
bufferSizeInBytes = AudioRecord.getMinBufferSize(sampleRateInHz,
channelConfig, audioFormat);
AudioRecord audioRecord = new AudioRecord(audioSource, sampleRateInHz,
channelConfig, audioFormat, bufferSizeInBytes);
//开始录制音频
try {
// 防止某些手机崩溃,例如联想
audioRecord.startRecording();
} catch (IllegalStateException e) {
e.printStackTrace();
}
/**
* 根据开始录音判断是否有录音权限
*/
if (audioRecord.getRecordingState() != AudioRecord.RECORDSTATE_RECORDING) {
return false;
}
audioRecord.stop();
audioRecord.release();
audioRecord = null;
return true;
}
可以将方法放在一个PermissionUtils里,在判断权限的地方 多加一层判断:
/**
* 检查权限
*/
private void checkPermission() {
// 先判断是否有权限。
if (AndPermission.hasPermission(mContext, Manifest.permission.CAMERA)) {
// 有权限,直接do anything.
if (PermissionUtil.cameraIsCanUse()) {
getImageFromCamera();
} else {
// 申请权限。
requestPermission();
}
} else {
// 申请权限。
requestPermission();
}
}
这样的判断 可以兼顾到正常返回状态码的机型和异常的机型。
网友评论