本文實(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ì)有所幫助。
新聞熱點(diǎn)
疑難解答
圖片精選