1. 程式人生 > >判斷Android手機(OPPO手機)是否有錄音許可權相容6.0以下

判斷Android手機(OPPO手機)是否有錄音許可權相容6.0以下

專案中遇到老的OPPO手機5.1的版本,出現明明拒絕了錄音許可權,但是回撥依然是true,自從6.0之後出了執行時許可權,獲取許可權的方式就變得統一化了,首先在清單檔案配置需要的許可權,然後使用時拍照或者錄音去呼叫

//6.0以上動態獲取許可權
    if (ContextCompat.checkSelfPermission(MainActivity.this, 
Manifest.permission.CAMERA) != 
PackageManager.PERMISSION_GRANTED) {
        //申請許可權,REQUEST_TAKE_PHOTO_PERMISSION是自定義的常量
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_TAKE_PHOTO_PERMISSION);

這段是去喚起彈窗申請許可權

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    if
(requestCode == REQUEST_TAKE_PHOTO_PERMISSION) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { //申請成功,可以拍照 choseHeadImageFromCameraCapture(); } else { Toast.makeText(MainActivity.this,"你拒絕了許可權,該功能不可用\n可在應用設定裡授權拍照哦"
,Toast.LENGTH_SHORT).show(); } return; } super.onRequestPermissionsResult(requestCode, permissions, grantResults); }

so, 為了相容老版本,所以就不能只是使用官方判斷許可權申請的方式,而是使用MinBufferSize流來判斷是否能錄音

/** 
 * Function:判斷錄音許可權,相容android6.0以下以及以上系統 
*/  
  
public class CheckAudioPermission {  
    // 音訊獲取源  
    public static int audioSource = MediaRecorder.AudioSource.MIC;  
    // 設定音訊取樣率,44100是目前的標準,但是某些裝置仍然支援22050,16000,11025  
    public static int sampleRateInHz = 44100;  
    // 設定音訊的錄製的聲道CHANNEL_IN_STEREO為雙聲道,CHANNEL_CONFIGURATION_MONO為單聲道  
    public static int channelConfig = AudioFormat.CHANNEL_IN_STEREO;  
    // 音訊資料格式:PCM 16位每個樣本。保證裝置支援。PCM 8位每個樣本。不一定能得到裝置支援。  
    public static int audioFormat = AudioFormat.ENCODING_PCM_16BIT;  
    // 緩衝區位元組大小  
    public static int bufferSizeInBytes = 0;  
    /** 
     * 判斷是是否有錄音許可權 
     */  
    public static boolean isHasPermission(final Context context){  
        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;  
    }  
}