欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2024-02-07 16:05:22
本文实例讲述了android编程检测手机录音权限是否打开的方法。分享给大家供大家参考,具体如下: 6.0之前的权限检测只是检测到是否在清单文件中注册 boole...

本文实例讲述了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多媒体操作技巧汇总(音频,视频,录音等)》、《android视图view技巧总结》、《android编程之activity操作技巧总结》、《android操作json格式数据技巧总结》、《android资源操作技巧汇总》及《android控件用法总结

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