国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android編程檢測手機(jī)錄音權(quán)限是否打開的方法

2019-10-22 18:22:44
字體:
供稿:網(wǎng)友

本文實(shí)例講述了Android編程檢測手機(jī)錄音權(quán)限是否打開的方法。分享給大家供大家參考,具體如下:

6.0之前的權(quán)限檢測只是檢測到是否在清單文件中注冊

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("有權(quán)限");} else {  ToastUtil.showMessage("無權(quán)限");  return;}

在6.0系統(tǒng)一下 無論是關(guān)閉或者打開app的錄音權(quán)限都能獲取到權(quán)限,6.0以上則正常,后來發(fā)現(xiàn)是6.0以后google加強(qiáng)了權(quán)限管理

public class CheckPermissionUtils {  /**  *獲取app的錄音權(quán)限是否打開  *android 6.0version以上 傳統(tǒng)方法不適合 以此兼容  * @param context  */  public static Boolean isHasAudioRecordPermission(Context context) {    // 音頻獲取源    int audioSource = MediaRecorder.AudioSource.MIC;    // 設(shè)置音頻采樣率,44100是目前的標(biāo)準(zhǔn),但是某些設(shè)備仍然支持22050,16000,11025    int sampleRateInHz = 44100;    // 設(shè)置音頻的錄制的聲道CHANNEL_IN_STEREO為雙聲道,CHANNEL_CONFIGURATION_MONO為單聲道    int channelConfig = AudioFormat.CHANNEL_IN_STEREO;    // 音頻數(shù)據(jù)格式:PCM 16位每個(gè)樣本。保證設(shè)備支持。PCM 8位每個(gè)樣本。不一定能得到設(shè)備支持。    int audioFormat = AudioFormat.ENCODING_PCM_16BIT;    // 緩沖區(qū)字節(jié)大小    int bufferSizeInBytes = 0;    bufferSizeInBytes = AudioRecord.getMinBufferSize(sampleRateInHz,            channelConfig, audioFormat);    AudioRecord audioRecord = new AudioRecord(audioSource, sampleRateInHz,            channelConfig, audioFormat, bufferSizeInBytes);    //開始錄制音頻    try{      // 防止某些手機(jī)崩潰,例如聯(lián)想      audioRecord.startRecording();    }    catch (IllegalStateException e){      e.printStackTrace();    }    /**     * 根據(jù)開始錄音判斷是否有錄音權(quán)限     */    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是實(shí)際讀取的數(shù)據(jù)長度,一般而言r會小于buffersize        int r = mAudioRecord.read(buffer, 0, BUFFER_SIZE);        long v = 0;        // 將 buffer 內(nèi)容取出,進(jìn)行平方和運(yùn)算        for (int i = 0; i < buffer.length; i++) {          v += buffer[i] * buffer[i];        }        // 平方和除以數(shù)據(jù)總長度,得到音量大小。        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;  }}

另,可點(diǎn)擊此處查看Android權(quán)限操作說明

希望本文所述對大家Android程序設(shè)計(jì)有所幫助。


注:相關(guān)教程知識閱讀請移步到Android開發(fā)頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 佛坪县| 永安市| 汉沽区| 云林县| 教育| 蓬溪县| 双牌县| 扎赉特旗| 闸北区| 革吉县| 辛集市| 新民市| 遂昌县| 淮安市| 普洱| 白朗县| 松滋市| 桦南县| 松江区| 饶阳县| 芜湖县| 成都市| 富宁县| 太和县| 凤庆县| 永昌县| 商南县| 宕昌县| 克什克腾旗| 宁城县| 长春市| 平凉市| 大丰市| 古交市| 安龙县| 罗田县| 三门峡市| 霍林郭勒市| 根河市| 翁牛特旗| 宁阳县|