標籤: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();
只要返回的值為 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();
同樣,只要判斷返回結果為 PackageManager.PERMISSION_GRANTED 就可以判定 app 已被授權網路攝影機許可權。
源碼下載
https://github.com/zhaozepeng/AndroidAudioCameraPermission
著作權聲明:轉載請標明出處http://blog.csdn.net/self_study,對技術感興趣的同鞋加群544645972一起交流
Android 錄音和網路攝影機許可權適配【轉】