Android 錄音和網路攝影機許可權適配【轉】

來源:互聯網
上載者:User

標籤:markdown   content   context   star   直接   div   結合   boolean   錯誤   

本文轉載自:http://blog.csdn.net/self_study/article/details/52965045

 最近在研究許可權適配的相關內容,整理以前的許可權部落格如下: 
  android permission許可權與安全機制解析(上) 
  android permission許可權與安全機制解析(下) 
  Android 懸浮窗許可權各機型各系統適配大全 
  這篇部落客要是介紹錄音許可權和網路攝影機許可權的適配,android permission許可權與安全機制解析(下)這篇部落格中我介紹到了 6.0 之後危險許可權的相關處理步驟,而錄音和網路攝影機許可權正好是屬於危險許可權,所以需要去單獨申請,申請的步驟在這篇部落格中就不介紹了,上面那篇部落格中已經介紹的很詳細,這裡主要是介紹在不同版本如何去檢測許可權的授予與否。 
  轉載請註明出處:http://blog.csdn.net/self_study/article/details/52965045。 
  PS:對技術感興趣的同鞋加群544645972一起交流。

錄音許可權 6.0之前

  6.0 之前的檢測方法我最剛開始的想法是依照懸浮窗許可權的適配方案,使用 AppOpsManager 去檢測,但是實際情況是,6.0 版本之下的機型很多判斷都不準確,所以無奈在網上找到了一種粗暴的解決方案:

public class AudioPermissionCheckUtils {    private static final String TAG = "AudioPermissionCheckUtils";    // 音頻擷取源    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 checkAudioPermission(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();            AVLogUtils.e(TAG, Log.getStackTraceString(e));        }        /**         * 根據開始錄音判斷是否有錄音許可權         */        if (audioRecord.getRecordingState() != AudioRecord.RECORDSTATE_RECORDING                && audioRecord.getRecordingState() != AudioRecord.RECORDSTATE_STOPPED) {            AVLogUtils.e(TAG, "audioRecord.getRecordingState() != AudioRecord.RECORDSTATE_RECORDING : " + audioRecord.getRecordingState());            return false;        }        if (audioRecord.getRecordingState() == AudioRecord.RECORDSTATE_STOPPED) {            //如果短時間內頻繁檢測,會造成audioRecord還未銷毀完成,此時檢測會返回RECORDSTATE_STOPPED狀態,再去read,會讀到0的size,所以此時預設許可權通過            return true;        }        byte[] bytes = new byte[1024];        int readSize = audioRecord.read(bytes, 0, 1024);        if (readSize == AudioRecord.ERROR_INVALID_OPERATION || readSize <= 0) {            AVLogUtils.e(TAG, "readSize illegal : " + readSize);            return false;        }        audioRecord.stop();        audioRecord.release();        audioRecord = null;        return true;    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58

這個解決方案一目瞭然,就是直接調用 AudioRecord 去錄音,如果發現錄音的檔案大小不正確,比如為0,再結合此時的錄音狀態,那麼可以基本判定錄音許可權的開啟與否。

6.0 及之後

  6.0 之後,系統提供了相關 API,許可權檢測就很簡單了:

int hasCameraPermission;hasCameraPermission = checkSelfPermission(Manifest.permission.CAMERA);Toast.makeText(this, "camera granted : " + (hasCameraPermission == PackageManager.PERMISSION_GRANTED), Toast.LENGTH_SHORT).show();
  • 1
  • 2
  • 3

只要返回的值為 PackageManager.PERMISSION_GRANTED 就可以判定已經授權改許可權。

網路攝影機許可權 6.0之前

  同錄音許可權,在 6.0 之前的版本使用 AppOpsManager 在很多機型上會有適配問題,所以在這裡依舊粗暴的採用下面這種方案:

public class CameraPermissionCheckUtils {    private static final String TAG = "CameraPermissionCheckUtils";    public static boolean checkCameraPermission(Context context) {        boolean canUse = true;        Camera mCamera = null;        try {            mCamera = Camera.open(0);            mCamera.setDisplayOrientation(90);        } catch (Exception e) {            AVLogUtils.e(TAG, Log.getStackTraceString(e));            canUse = false;        }        if (canUse) {            mCamera.release();            mCamera = null;        }        return canUse;    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

但是貌似在少數機型和手機上依舊會有判斷錯誤的情況存在,而且由於這個函數會調用 Camera.open 函數,所以造成在少些手機上會卡頓一下。

6.0 及之後

  6.0 之後就直接使用系統 API 進行判斷就可以了:

int hasAudioPermission;hasAudioPermission = checkSelfPermission(Manifest.permission.RECORD_AUDIO);Toast.makeText(this, "audio granted : " + (hasAudioPermission == PackageManager.PERMISSION_GRANTED),        Toast.LENGTH_SHORT).show();
  • 1
  • 2
  • 3
  • 4

同樣,只要判斷返回結果為 PackageManager.PERMISSION_GRANTED 就可以判定 app 已被授權網路攝影機許可權。

源碼下載

  https://github.com/zhaozepeng/AndroidAudioCameraPermission

著作權聲明:轉載請標明出處http://blog.csdn.net/self_study,對技術感興趣的同鞋加群544645972一起交流

Android 錄音和網路攝影機許可權適配【轉】

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.