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

首頁 > 系統 > Android > 正文

Android編程檢測手機錄音權限是否打開的方法

2019-12-12 01:38:23
字體:
來源:轉載
供稿:網友

本文實例講述了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程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 滨海县| 昌江| 巍山| 光山县| 沙湾县| 自贡市| 钦州市| 河东区| 陕西省| 阿鲁科尔沁旗| 汨罗市| 文水县| 新平| 达日县| 西和县| 阿克| 商河县| 湄潭县| 宜昌市| 寿光市| 温州市| 鄂伦春自治旗| 青铜峡市| 当阳市| 甘谷县| 鄂托克旗| 淅川县| 赫章县| 贵德县| 保山市| 永仁县| 册亨县| 剑川县| 南安市| 广饶县| 凤山县| 石泉县| 陵水| 汽车| 双鸭山市| 安溪县|