Unity工程判断当前录音权限是否被禁
unity提供了和录音有关的类Microphone https://docs.unity3d.com/ScriptReference/Microphone.html
原本以为devices变量是指当前有效录音设备(应用的录音没有禁用)的数量,但实际上不是。这就很尴尬了,这意味着获取录音权限被用户拒绝时,单靠Microphone类解决不了问题,Unity也没有提供类似的接口,只能调用Android和IOS的原生接口。
1、Android
public boolean checkRecordAudioPermission(){
PackageManager pm = getPackageManager();
boolean permission = (PackageManager.PERMISSION_GRANTED == pm.checkPermission("android.permission.RECORD_AUDIO", "packageName"));
return permission;
}
网上很多人都提到了上面这种方法,但实际上这种方法Android6.0之前只是判断录音权限是否在AndroidMenifest里有注册。在网上查了一下Android6.0之前都是没有直接获取对应权限是否被禁的直接方法的。只能通过一些同等效果的方法实现,于是在网上找到了一种方法
public boolean HasRecordPermission()
{
// 音频获取源
int audioSource = MediaRecorder.AudioSource.MIC;
// 设置音频采样率,44100是目前的标准,但是某些设备仍然支持22050,16000,11025
int sampleRateInHz = 44100;
// 设置音频的录制的声道CHANNEL_IN_STEREO为双声道,CHANNEL_CONFIGURATION_MONO为单声道
int channelConfig = AudioFormat.CHANNEL_IN_STEREO;
// 音频数据格式:PCM 16位每个样本。保证设备支持。PCM 8位每个样本。不一定能得到设备支持。
int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
// 缓冲区字节大小
int 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;
}
else
{
audioRecord.stop();
audioRecord.release();
audioRecord = null;
return true;
}
}
方法大致是模拟录音过程,检测录音状态是否切换到正在录音的状态,如果不是则没有开启录音权限。测试有效。
2、IOS
IOS有原生的获取权限的接口。
+ (BOOL) canRecord
{
__block BOOL bCanRecord = YES;
if ([[[UIDevice currentDevice] systemVersion] compare:@"7.0"] != NSOrderedAscending)
{
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
if ([audioSession respondsToSelector:@selector(requestRecordPermission:)]) {
[audioSession performSelector:@selector(requestRecordPermission:) withObject:^(BOOL granted) {
bCanRecord = granted;
}];
}
}
return bCanRecord;
}
参考文章:
Android:http://blog.csdn.net/wanzhuanit/article/details/51218040
IOS: http://blog.csdn.net/jueyi1127/article/details/48241883