1.
项目中,经常有申请摄像头
,麦克风
权限的场景。但是原生SDK
在某些定制手机上是不可完全信任
(有时候API告知我们有相机权限,实际上没有
)的,所以我们可能有时候需要二次确认摄像头是否可用等逻辑
/**
* @return 二次判断摄像头,麦克风是否可用
*/
public static boolean againVideoChatSimpleVerify() {
if (PermissionUtil.isPermissionBlack()) {
if (PermissionUtil.cameraIsCanUse() && PermissionUtil.audioIsCanUse()) {
return true;
}
}
return false;
}
/**
* @return 此处可添加机型判断, 名单中的需要二次确认是否权限真正开启
*/
public static boolean isPermissionBlack() {
return true;
}
/**
* 通过尝试打开相机的方式判断有无拍照权限(在6.0以下使用拥有root权限的管理软件可以管理权限)
*
* @return
*/
public static boolean cameraIsCanUse() {
boolean isCanUse = true;
Camera mCamera = null;
try {
mCamera = Camera.open();
} catch (Exception e) {
isCanUse = false;
}
if (mCamera != null) {
try {
mCamera.setPreviewCallback(null);
mCamera.stopPreview();
mCamera.release();
mCamera = null;
} catch (Exception e) {
e.printStackTrace();
return isCanUse;
}
}
return isCanUse;
}
/**
* 获取语音文件名
*
* @param uid String
* @return
*/
public static String getVoiceFileName(String uid) {
return uid + System.currentTimeMillis() + ".mp3";
}
public static String getVoiceFolderPath(){
return "";
}
/**
* @return
*/
public static boolean audioIsCanUse() {
boolean isCanUse = true;
// 这里的音频文件名和音频文件路径随便写个字符串返回即可(因为我们不会真正去播放,而是初始化一下)
String voiceFileName = getVoiceFileName(String.valueOf(System.currentTimeMillis()));
String voicePath = getVoiceFolderPath();
MediaRecorder mRecorder = new MediaRecorder();
try {
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
mRecorder.setOutputFile(voicePath + "/" + voiceFileName);
} catch (IllegalStateException e) {
// ChanghongS06 手机报错 setAudioSource failed
e.printStackTrace();
}
try {
mRecorder.prepare();
} catch (IOException e) {
e.printStackTrace();
isCanUse = false;
} finally {
try {
mRecorder.stop();
mRecorder.release();
} catch (Exception e) {
e.printStackTrace();
}
}
return isCanUse;
}
2.
CameraX初学
这里有几篇很好的参考文章: