Android编程检测手机录音权限是否打开的方法
本文实例讲述了Android编程检测手机录音权限是否打开的方法。分享给大家供大家参考,具体如下:
6.0之前的权限检测只是检测到是否在清单文件中注册
Booleanflag=(PackageManager.PERMISSION_GRANTED==
pm.checkPermission("android.permission.RECORD_AUDIO","包名"));
Booleanflag=PermissionChecker.checkSelfPermission(this,Manifest.permission.)==PermissionChecker.PERMISSION_GRANTED;
if(flag){
ToastUtil.showMessage("有权限");
}else{
ToastUtil.showMessage("无权限");
return;
}
在6.0系统一下无论是关闭或者打开app的录音权限都能获取到权限,6.0以上则正常,后来发现是6.0以后google加强了权限管理
publicclassCheckPermissionUtils{
/**
*获取app的录音权限是否打开
*android6.0version以上传统方法不适合以此兼容
*@paramcontext
*/
publicstaticBooleanisHasAudioRecordPermission(Contextcontext){
//音频获取源
intaudioSource=MediaRecorder.AudioSource.MIC;
//设置音频采样率,44100是目前的标准,但是某些设备仍然支持22050,16000,11025
intsampleRateInHz=44100;
//设置音频的录制的声道CHANNEL_IN_STEREO为双声道,CHANNEL_CONFIGURATION_MONO为单声道
intchannelConfig=AudioFormat.CHANNEL_IN_STEREO;
//音频数据格式:PCM16位每个样本。保证设备支持。PCM8位每个样本。不一定能得到设备支持。
intaudioFormat=AudioFormat.ENCODING_PCM_16BIT;
//缓冲区字节大小
intbufferSizeInBytes=0;
bufferSizeInBytes=AudioRecord.getMinBufferSize(sampleRateInHz,
channelConfig,audioFormat);
AudioRecordaudioRecord=newAudioRecord(audioSource,sampleRateInHz,
channelConfig,audioFormat,bufferSizeInBytes);
//开始录制音频
try{
//防止某些手机崩溃,例如联想
audioRecord.startRecording();
}
catch(IllegalStateExceptione){
e.printStackTrace();
}
/**
*根据开始录音判断是否有录音权限
*/
if(audioRecord.getRecordingState()!=AudioRecord.RECORDSTATE_RECORDING){
returnfalse;
}
audioRecord.stop();
audioRecord.release();
audioRecord=null;
returntrue;
}
}
最后一种,测试没问题。
publicclassCheckPermissionUtils{
privatestaticfinalStringTAG="CheckPermissionUtils";
privatestaticCheckPermissionUtilscheckPermissionUtils=newCheckPermissionUtils();
staticfinalintSAMPLE_RATE_IN_HZ=44100;
staticfinalintBUFFER_SIZE=AudioRecord.getMinBufferSize(
SAMPLE_RATE_IN_HZ,AudioFormat.CHANNEL_IN_DEFAULT,
AudioFormat.ENCODING_PCM_16BIT);
privateAudioRecordmAudioRecord;
BooleanisGetVoiceRun;
privateObjectmLock;
privateintcount=0;
privateBooleanisHasPermission;
privateCheckPermissionUtils(){
mLock=newObject();
}
publicstaticCheckPermissionUtilsgetinstance(){
if(checkPermissionUtils==null){
checkPermissionUtils=newCheckPermissionUtils();
}
returncheckPermissionUtils;
}
publicBooleanisHasAudioRecordingPermission(Contextcontext){
isHasPermission=false;
count=0;
mAudioRecord=newAudioRecord(MediaRecorder.AudioSource.MIC,
SAMPLE_RATE_IN_HZ,AudioFormat.CHANNEL_IN_DEFAULT,
AudioFormat.ENCODING_PCM_16BIT,BUFFER_SIZE);
if(mAudioRecord==null){
Log.e("sound","mAudioRecord初始化失败");
}
isGetVoiceRun=true;
try{
//newThread(newRunnable(){
//@Override
//publicvoidrun(){
mAudioRecord.startRecording();
short[]buffer=newshort[BUFFER_SIZE];
while(isGetVoiceRun){
count++;
if(count++>10){
isGetVoiceRun=false;
}
//r是实际读取的数据长度,一般而言r会小于buffersize
intr=mAudioRecord.read(buffer,0,BUFFER_SIZE);
longv=0;
//将buffer内容取出,进行平方和运算
for(inti=0;i0&&r>0){
//有录音
isHasPermission=true;
returnisHasPermission;
}
//大概一秒十次
synchronized(mLock){
try{
mLock.wait(5);
}
catch(InterruptedExceptione){
e.printStackTrace();
}
}
}
mAudioRecord.stop();
mAudioRecord.release();
mAudioRecord=null;
//}
//}).start();
}
catch(Exceptione){
}
returnisHasPermission;
}
}
 
另,可点击此处查看Android权限操作说明
更多关于Android相关内容感兴趣的读者可查看本站专题:《Android开发入门与进阶教程》、《Android多媒体操作技巧汇总(音频,视频,录音等)》、《Android视图View技巧总结》、《Android编程之activity操作技巧总结》、《Android操作json格式数据技巧总结》、《Android资源操作技巧汇总》及《Android控件用法总结》
希望本文所述对大家Android程序设计有所帮助。
