Unity工程判断当前录音权限是否被禁

unity 专栏收录该内容
1 篇文章 0 订阅

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

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页

打赏作者

xtom0369

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值