国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表
主站蜘蛛池模板: 栖霞市| 海城市| 应用必备| 沐川县| 广饶县| 太仆寺旗| 武川县| 景德镇市| 奇台县| 长葛市| 东港市| 兴城市| 都匀市| 公安县| 高唐县| 辽源市| 广宁县| 赤峰市| 古田县| 南岸区| 凯里市| 大同市| 海口市| 曲沃县| 普宁市| 尉氏县| 凤山县| 阿拉善右旗| 涞水县| 剑河县| 邯郸市| 克山县| 广汉市| 建湖县| 榕江县| 西乌| 富阳市| 瑞金市| 安化县| 梓潼县| 吴江市|