当前位置: 移动技术网 > IT编程>移动开发>Android > Android编程检测手机录音权限是否打开的方法

Android编程检测手机录音权限是否打开的方法

2019年07月24日  | 移动技术网IT编程  | 我要评论

智能电视网络电视,总裁别胡来,零号特工下载

本文实例讲述了android编程检测手机录音权限是否打开的方法。分享给大家供大家参考,具体如下:

6.0之前的权限检测只是检测到是否在清单文件中注册

boolean flag = (packagemanager.permission_granted ==
pm.checkpermission("android.permission.record_audio", "包名"));
boolean flag = permissionchecker.checkselfpermission(this, manifest.permission.)== permissionchecker.permission_granted;
if (flag){
  toastutil.showmessage("有权限");
} else {
  toastutil.showmessage("无权限");
  return;
}

在6.0系统一下 无论是关闭或者打开app的录音权限都能获取到权限,6.0以上则正常,后来发现是6.0以后google加强了权限管理

public class checkpermissionutils {
  /**
  *获取app的录音权限是否打开
  *android 6.0version以上 传统方法不适合 以此兼容
  * @param context
  */
  public static boolean ishasaudiorecordpermission(context context) {
    // 音频获取源
    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;
    }
    audiorecord.stop();
    audiorecord.release();
    audiorecord = null;
    return true;
  }
}

最后一种,测试没问题。

public class checkpermissionutils {
  private static final string tag = "checkpermissionutils";
  private static checkpermissionutils checkpermissionutils = new checkpermissionutils();
  static final int sample_rate_in_hz = 44100;
  static final int buffer_size = audiorecord.getminbuffersize(
  sample_rate_in_hz, audioformat.channel_in_default,
  audioformat.encoding_pcm_16bit);
  private audiorecord maudiorecord;
  boolean isgetvoicerun;
  private object mlock;
  private int count=0;
  private boolean ishaspermission;
  private checkpermissionutils() {
    mlock = new object();
  }
  public static checkpermissionutils getinstance() {
    if (checkpermissionutils == null) {
      checkpermissionutils = new checkpermissionutils();
    }
    return checkpermissionutils;
  }
  public boolean ishasaudiorecordingpermission(context context) {
    ishaspermission=false;
    count=0;
    maudiorecord = new audiorecord(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 {
      //    new thread(new runnable() {
      //      @override
      //      public void run() {
      maudiorecord.startrecording();
      short[] buffer = new short[buffer_size];
      while (isgetvoicerun) {
        count++;
        if (count++>10) {
          isgetvoicerun=false;
        }
        //r是实际读取的数据长度,一般而言r会小于buffersize
        int r = maudiorecord.read(buffer, 0, buffer_size);
        long v = 0;
        // 将 buffer 内容取出,进行平方和运算
        for (int i = 0; i < buffer.length; i++) {
          v += buffer[i] * buffer[i];
        }
        // 平方和除以数据总长度,得到音量大小。
        double mean = v / (double) r;
        double volume = 10 * math.log10(mean);
        log.d(tag, "-------分贝值:" +volume+"----v"+v+"------r"+r );
        if (v>0&&r>0) {
          //有录音
          ishaspermission=true;
          return ishaspermission;
        }
        // 大概一秒十次
        synchronized (mlock) {
          try {
            mlock.wait(5);
          }
          catch (interruptedexception e) {
            e.printstacktrace();
          }
        }
      }
      maudiorecord.stop();
      maudiorecord.release();
      maudiorecord = null;
      //  }
      //}).start();
    }
    catch (exception e) {
    }
    return ishaspermission;
  }
}

另,可点击此处查看

更多关于android相关内容感兴趣的读者可查看本站专题:《android开发入门与进阶教程》、《android多媒体操作技巧汇总(音频,视频,录音等)》、《android视图view技巧总结》、《android编程之activity操作技巧总结》、《android操作json格式数据技巧总结》、《android资源操作技巧汇总》及《android控件用法总结

希望本文所述对大家android程序设计有所帮助。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网