對於Android開發來說,經常需要申請權限,Android6.0以前,所有權限的配置只需要在配置文件AndroidManifest.xml中編寫權限配置就可以了,但Android6.0以后版本中,Google為了提高系統的安全性,當APP需要用到用戶隱私權限時需要進行權限配置,除了在配置文件AndroidManifest.xml中編寫權限配置之外,還需要手動進行權限適配。申請權限的方式有以下兩種:
①、在配置文件AndroidManifest.xml中編寫權限配置
②、在邏輯代碼中動態申請權限授權
Android權限可以分為兩大類:普通權限和高級權限。
一、普通權限
常見的普通權限如下所示。
1 ACCESS_LOCATION_EXTRA_COMMANDS 定位權限 2 ACCESS_NETWORK_STATE 網絡狀態權限 3 ACCESS_NOTIFICATION_POLICY 通知 APP通知顯示在狀態欄 4 ACCESS_WIFI_STATE WiFi 狀態權限 5 BLUETOOTH 使用藍牙權限 6 BLUETOOTH_ADMIN 控制藍牙開關 7 BROADCAST_STICKY 粘性廣播 8 CHANGE_NETWORK_STATE 改變網絡狀態 9 CHANGE_WIFI_MULTICAST_STATE 改變WiFi多播狀態,應該是控制手機熱點(猜測) 10 CHANGE_WIFI_STATE 控制WiFi開關,改變WiFi狀態 11 DISABLE_KEYGUARD 改變鍵盤為不可用 12 EXPAND_STATUS_BAR 擴展bar的狀態 13 GET_PACKAGE_SIZE 獲取應用安裝包大小 14 INTERNET 網絡權限 15 KILL_BACKGROUND_PROCESSES 殺死后台進程 16 MODIFY_AUDIO_SETTINGS 改變音頻輸出設置 17 NFC 支付 18 READ_SYNC_SETTINGS 獲取手機設置信息 19 READ_SYNC_STATS 數據統計 20 RECEIVE_BOOT_COMPLETED 監聽啟動廣播 21 REORDER_TASKS 創建新棧 22 REQUEST_INSTALL_PACKAGES 安裝應用程序 23 SET_TIME_ZONE 允許應用程序設置系統時間區域 24 SET_WALLPAPER 設置壁紙 25 SET_WALLPAPER_HINTS 設置壁紙上的提示信息,個性化語言 26 TRANSMIT_IR 紅外發射 27 USE_FINGERPRINT 指紋識別 28 VIBRATE 震動 29 WAKE_LOCK 鎖屏 30 WRITE_SYNC_SETTINGS 改變設置 31 SET_ALARM 設置警告提示 32 INSTALL_SHORTCUT 創建快捷方式 33 UNINSTALL_SHORTCUT 刪除快捷方式
在AndroidManifest.xml文件中的配置方式如下:
1 //XXXX為需要配置的權限名稱 2 <uses-permission android:name="android.permission.XXXX"/>
二、高級權限
高級權限如下所示。
1 READ_CALENDAR 日歷 2 WRITE_CALENDAR 日歷 3 CAMERA 相機 4 READ_CONTACTS 聯系人 5 WRITE_CONTACTS 聯系人 6 GET_ACCOUNTS 聯系人 7 ACCESS_FINE_LOCATION 位置 8 ACCESS_COARSE_LOCATION 位置 9 RECORD_AUDIO 麥克風 10 READ_PHONE_STATE 電話 11 CALL_PHONE 電話 12 READ_CALL_LOG 電話 13 WRITE_CALL_LOG 電話 14 ADD_VOICEMAIL 電話 15 USE_SIP 電話 16 PROCESS_OUTGOING_CALLS 電話 17 BODY_SENSORS 傳感器 18 SEND_SMS 短信 19 RECEIVE_SMS 短信 20 READ_SMS 短信 21 RECEIVE_WAP_PUSH 短信 22 RECEIVE_MMS 短信 23 READ_EXTERNAL_STORAGE 存儲 24 WRITE_EXTERNAL_STORAGE 存儲
動態權限申請的邏輯代碼如下所示(以官方讀寫內存為例):
1 public void requestAllPower() { 2 if (ContextCompat.checkSelfPermission(this, 3 Manifest.permission.WRITE_EXTERNAL_STORAGE) 4 != PackageManager.PERMISSION_GRANTED) { 5 if (ActivityCompat.shouldShowRequestPermissionRationale(this, 6 Manifest.permission.WRITE_EXTERNAL_STORAGE)) { 7 } else { 8 ActivityCompat.requestPermissions(this, 9 new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, 10 Manifest.permission.READ_EXTERNAL_STORAGE}, 1); 11 } 12 } 13 }
判斷動態申請權限的結果代碼如下:
1 @Override 2 public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 3 super.onRequestPermissionsResult(requestCode, permissions, grantResults); 4 5 if (requestCode == 1) { 6 for (int i = 0; i < permissions.length; i++) { 7 if (grantResults[i] == PERMISSION_GRANTED) { 8 Toast.makeText(this, "" + "權限" + permissions[i] + "申請成功", Toast.LENGTH_SHORT).show(); 9 } else { 10 Toast.makeText(this, "" + "權限" + permissions[i] + "申請失敗", Toast.LENGTH_SHORT).show(); 11 } 12 } 13 } 14 }
對於動態權限申請,可以采用封裝好的權限申請框架方便的處理權限申請問題,這樣有利於代碼的重用和整潔性,可以參考以下幾個鏈接:
①、https://blog.csdn.net/fireqiang2/article/details/78343233
②、https://blog.csdn.net/wdd1324/article/details/79402573
③、https://blog.csdn.net/jsxin0816/article/details/78605731
④、https://www.jianshu.com/p/52e66d9e4a9a