Android编程检测手机录音权限是否打开的方法
程序员文章站
2022-06-04 10:45:57
本文实例讲述了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程序设计有所帮助。