Android 6.0 動態權限申請注意事項

 

版權聲明:本文爲博主原創文章,未經博主容許不得轉載。 https://blog.csdn.net/uana_777/article/details/54136255

Part One

權限區分
Android 6.0 爲了保護用戶隱私,將一些權限的申請放在了應用運行的時候去申請, 好比以往的開發中,開發人員只須要將須要的權限在清單文件中配置便可,安裝後用戶能夠在設置中的應用信息中看到:XX應用以獲取**權限。用戶點擊能夠選擇給應用相應的權限。此前的應用權限用戶能夠選擇容許、提醒和拒絕。在安裝的時候用戶是已經知道應用須要的權限的。可是這樣存在一個問題,就是用戶在安裝的時候,應用須要的權限十分的多(有些開發者爲了省事,會請求一些沒必要要的權限或者請求所有的權限),這個時候用戶在安裝應用的時候也許並無發現某些侵犯本身隱私的權限請求,安裝以後才發現本身的隱私數據被竊取。其實Android6.0 動態權限一方面是爲了廣大用戶考慮,另外一方面實際上是Google爲了不一些沒必要要的官司。可是這樣作可實在是苦了程序員了。不過還好,權限不是全部的都須要動態申請,下面就說一下Android6.0對權限的分割:
1、普通權限
這類的權限不須要動態申請,須要這個權限的時候仍是按照以往的作法,在清單文件中申請相應的權限便可,在安裝的時候會展現給用戶,用戶贊成安裝就獲取相應的權限。寫法舉例以下:
清單文件中:css

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.deepai.paipai"> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> ........
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

下面是對權限的總結:
android.permission.EXPAND_STATUS_BAR 容許一個程序擴展收縮在狀態欄,android開發網提示應該是一個相似Windows Mobile中的托盤程序
android.permission.FACTORY_TEST 做爲一個工廠測試程序,運行在root用戶
android.permission.FLASHLIGHT 訪問閃光燈,android開發網提示HTC Dream不包含閃光燈
android.permission.FORCE_BACK 容許程序強行一個後退操做是否在頂層activities
android.permission.FOTA_UPDATE 暫時不瞭解這是作什麼使用的,android開發網分析多是一個預留權限.
android.permission.GET_ACCOUNTS 訪問一個賬戶列表在Accounts Service中
android.permission.GET_PACKAGE_SIZE 容許一個程序獲取任何package佔用空間容量
android.permission.GET_TASKS 容許一個程序獲取信息有關當前或最近運行的任務,一個縮略的任務狀態,是否活動等等
android.permission.HARDWARE_TEST 容許訪問硬件
android.permission.INJECT_EVENTS 容許一個程序截獲用戶事件如按鍵、觸摸、軌跡球等等到一個時間流,android開發網提醒算是hook技術吧
android.permission.INSTALL_PACKAGES 容許一個程序安裝應用
android.permission.INTERNAL_SYSTEM_WINDOW 容許打開窗口使用系統用戶界面
android.permission.ACCESS_CHECKIN_PROPERTIES 容許讀寫訪問「properties」表在checkin數據庫中,改值能夠修改上傳。
android.permission.ACCESS_COARSE_LOCATION 容許一個程序訪問CellID或WiFi熱點來獲取粗略的位置
android.permission.ACCESS_FINE_LOCATION 容許一個程序訪問精良位置(如GPS)
android.permission.WRITE_CONTACTS 容許程序寫入但不讀取用戶聯繫人數據
android.permission.WRITE_GSERVICES 容許程序修改Google服務地圖
android.permission.WRITE_OWNER_DATA 容許一個程序寫入但不讀取全部者數據
android.permission.WRITE_SETTINGS 容許程序讀取或寫入系統設置
android.permission.WRITE_SMS 容許程序寫短信
android.permission.WRITE_SYNC_SETTINGS 容許程序寫入同步設置
android.permission.ACCESS_LOCATION_EXTRA_COMMANDS 容許應用程序訪問額外的位置提供命令
android.permission.ACCESS_MOCK_LOCATION 容許程序建立模擬位置提供用於測試
android.permission.ACCESS_NETWORK_STATE 容許程序訪問有關GSM網絡信息
android.permission.ACCESS_SURFACE_FLINGER 容許程序使用SurfaceFlinger底層特性
android.permission.ACCESS_WIFI_STATE 容許程序訪問Wi-Fi網絡狀態信息
android.permission.ADD_SYSTEM_SERVICE 容許程序發佈系統級服務
android.permission.BATTERY_STATS 容許程序更新手機電池統計信息
android.permission.BLUETOOTH 容許程序鏈接到已配對的藍牙設備
android.permission.BLUETOOTH_ADMIN 容許程序發現和配對藍牙設備
android.permission.BROADCAST_PACKAGE_REMOVED 容許程序廣播一個提示消息在一個應用程序包已經移除後
android.permission.BROADCAST_STICKY 容許一個程序廣播經常使用intents
android.permission.CALL_PHONE 容許一個程序初始化一個電話撥號不需經過撥號用戶界面須要用戶確認
android.permission.DELETE_CACHE_FILES 容許程序刪除緩存文件
android.permission.DELETE_PACKAGES 容許一個程序刪除包
android.permission.DEVICE_POWER 容許訪問底層電源管理
android.permission.DIAGNOSTIC 容許程序RW診斷資源
android.permission.DISABLE_KEYGUARD 容許程序禁用鍵盤鎖
android.permission.DUMP 容許程序返回狀態抓取信息從系統服務
android.permission.CALL_PRIVILEGED 容許一個程序撥打任何號碼,包含緊急號碼無需經過撥號用戶界面須要用戶確認
android.permission.CAMERA 請求訪問使用照相設備
android.permission.CHANGE_COMPONENT_ENABLED_STATE 容許一個程序是否改變一個組件或其餘的啓用或禁用
android.permission.CHANGE_CONFIGURATION 容許一個程序修改當前設置,如本地化
android.permission.CHANGE_NETWORK_STATE 容許程序改變網絡鏈接狀態
android.permission.CHANGE_WIFI_STATE 容許程序改變Wi-Fi鏈接狀態
android.permission.CLEAR_APP_CACHE 容許一個程序清楚緩存從全部安裝的程序在設備中
android.permission.CLEAR_APP_USER_DATA 容許一個程序清除用戶設置
android.permission.CONTROL_LOCATION_UPDATES 容許啓用禁止位置更新提示從無線模塊
android.permission.REBOOT 請求可以從新啓動設備
android.permission.RECEIVE_BOOT_COMPLETED 容許一個程序接收到ACTION_BOOT_COMPLETED 廣播在系統完成啓動
android.permission.RECEIVE_MMS 容許一個程序監控將收到MMS彩信,記錄或處理
android.permission.RECEIVE_SMS 容許程序監控一個將收到短信息,記錄或處理
android.permission.RECEIVE_WAP_PUSH 容許程序監控將收到WAP PUSH信息
android.permission.RECORD_AUDIO 容許程序錄制音頻
android.permission.REORDER_TASKS 容許程序改變Z軸排列任務
android.permission.RESTART_PACKAGES 容許程序從新啓動其餘程序
android.permission.SEND_SMS 容許程序發送SMS短信
android.permission.INTERNET 容許程序打開網絡套接字
android.permission.MANAGE_APP_TOKENS 容許程序管理(建立、催後、 z-order默認向z軸推移)程序引用在窗口管理器中
android.permission.MASTER_CLEAR 目前尚未明確的解釋,android開發網分析多是清除一切數據,相似硬格機
android.permission.MODIFY_AUDIO_SETTINGS 容許程序修改全局音頻設置
android.permission.MODIFY_PHONE_STATE 容許修改話機狀態,如電源,人機接口等
android.permission.MOUNT_UNMOUNT_FILESYSTEMS 容許掛載和反掛載文件系統可移動存儲
android.permission.PERSISTENT_ACTIVITY 容許一個程序設置他的activities顯示
android.permission.PROCESS_OUTGOING_CALLS 容許程序監視、修改有關播出電話
android.permission.READ_CALENDAR 容許程序讀取用戶日曆數據
android.permission.READ_CONTACTS 容許程序讀取用戶聯繫人數據
android.permission.READ_FRAME_BUFFER 容許程序屏幕波或和更多常規的訪問幀緩衝數據
android.permission.READ_INPUT_STATE 容許程序返回當前按鍵狀態
android.permission.READ_LOGS 容許程序讀取底層系統日誌文件
android.permission.READ_OWNER_DATA 容許程序讀取全部者數據
android.permission.READ_SMS 容許程序讀取短信息
android.permission.READ_SYNC_SETTINGS 容許程序讀取同步設置
android.permission.READ_SYNC_STATS 容許程序讀取同步狀態
android.permission.SET_ACTIVITY_WATCHER 容許程序監控或控制activities已經啓動全局系統中
android.permission.SET_ALWAYS_FINISH 容許程序控制是否活動間接完成在處於後臺時
android.permission.SET_ANIMATION_SCALE 修改全局信息比例
android.permission.SET_DEBUG_APP 配置一個程序用於調試
android.permission.SET_ORIENTATION 容許底層訪問設置屏幕方向和實際旋轉
android.permission.SET_PREFERRED_APPLICATIONS 容許一個程序修改列表參數PackageManager.addPackageToPreferred()和PackageManager.removePackageFromPreferred()方法
android.permission.SET_PROCESS_FOREGROUND 容許程序當前運行程序強行到前臺
android.permission.SET_PROCESS_LIMIT 容許設置最大的運行進程數量
android.permission.SET_TIME_ZONE 容許程序設置時間區域
android.permission.SET_WALLPAPER 容許程序設置壁紙
android.permission.SET_WALLPAPER_HINTS 容許程序設置壁紙hits
android.permission.SIGNAL_PERSISTENT_PROCESSES 容許程序請求發送信號到全部顯示的進程中
android.permission.STATUS_BAR 容許程序打開、關閉或禁用狀態欄及圖標Allows an application toopen, close, or disable the status bar and its icons.
android.permission.SUBSCRIBED_FEEDS_READ 容許一個程序訪問訂閱RSS Feed內容提供
android.permission.SUBSCRIBED_FEEDS_WRITE 系統暫時保留改設置,android開發網認爲將來版本會加入該功能。
android.permission.SYSTEM_ALERT_WINDOW 容許一個程序打開窗口使用TYPE_SYSTEM_ALERT,顯示在其餘全部程序的頂層
android.permission.VIBRATE 容許訪問振動設備
android.permission.WAKE_LOCK 容許使用PowerManager的 WakeLocks保持進程在休眠時從屏幕消失
android.permission.WRITE_APN_SETTINGS 容許程序寫入API設置
android.permission.WRITE_CALENDAR 容許一個程序寫入但不讀取用戶日曆數據java

能夠看出Android中對資源以及服務的訪問都很是嚴格,另外,在程序打包成APK的時候也須要對軟件進行簽名。react

定位相關權限android

獲取精確位置    android.permission.ACCESS_FINE_LOCATION 經過GPS芯片接收衛星的定位信息,定位精度達10米之內 訪問定位額外命令 android.permission.ACCESS_LOCATION_EXTRA_COMMANDS 容許程序訪問額外的定位提供者指令 獲取模擬定位信息 android.permission.ACCESS_MOCK_LOCATION 獲取模擬定位信息,通常用於幫助開發者調試應用 控制定位更新 android.permission.CONTROL_LOCATION_UPDATES 容許得到移動網絡定位信息改變 安裝定位提供 android.permission.INSTALL_LOCATION_PROVIDER 安裝定位提供
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

網絡狀態nginx

訪問網絡    android.permission.INTERNET 訪問網絡鏈接,可能產生GPRS流量 獲取網絡狀態 android.permission.ACCESS_NETWORK_STATE 獲取網絡信息狀態,如當前的網絡鏈接是否有效 獲取WiFi狀態 android.permission.ACCESS_WIFI_STATE 獲取當前WiFi接入的狀態以及WLAN熱點的信息 改變網絡狀態 android.permission.CHANGE_NETWORK_STATE 改變網絡狀態如是否能聯網 改變WiFi多播狀態 android.permission.CHANGE_WIFI_MULTICAST_STATE 改變WiFi多播狀態 改變WiFi狀態 android.permission.CHANGE_WIFI_STATE 改變WiFi狀態
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

帳戶管理程序員

帳戶管理    android.permission.ACCOUNT_MANAGER 獲取帳戶驗證信息,主要爲GMail帳戶信息,只有系統級進程才能訪問的權限 驗證帳戶 android.permission.AUTHENTICATE_ACCOUNTS 容許一個程序經過帳戶驗證方式訪問帳戶管理ACCOUNT_MANAGER相關信息 訪問帳戶Gmail列表 android.permission.GET_ACCOUNTS 訪問GMail帳戶列表 管理帳戶 android.permission.MANAGE_ACCOUNTS 容許程序管理AccountManager中的帳戶列表
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

底層操做相關權限數據庫

訪問Surface Flinger    android.permission.ACCESS_SURFACE_FLINGER Android平臺上底層的圖形顯示支持,通常用於遊戲或照相機預覽界面和底層模式的屏幕截圖 變成磚頭 android.permission.BRICK 可以禁用手機,很是危險,顧名思義就是讓手機變成磚頭 硬件測試 android.permission.HARDWARE_TEST 訪問硬件輔助設備,用於硬件測試 底層訪問權限 android.permission.CWJ_GROUP 容許CWJ帳戶組訪問底層信息
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

藍牙 通話 拍照api

使用藍牙    android.permission.BLUETOOTH 容許程序鏈接配對過的藍牙設備 藍牙管理 android.permission.BLUETOOTH_ADMIN 容許程序進行發現和配對新的藍牙設備 撥打電話 android.permission.CALL_PHONE 容許程序從非系統撥號器裏輸入電話號碼 通話權限 android.permission.CALL_PRIVILEGED 容許程序撥打電話,替換系統的撥號器界面 拍照權限 android.permission.CAMERA 容許訪問攝像頭進行拍照 使用閃光燈 android.permission.FLASHLIGHT 容許訪問閃光燈
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

清理緩存 應用數據 應用操做緩存

應用刪除時廣播    android.permission.BROADCAST_PACKAGE_REMOVED 當一個應用在刪除時觸發一個廣播 刪除緩存文件 android.permission.DELETE_CACHE_FILES 容許應用刪除緩存文件 刪除應用 android.permission.DELETE_PACKAGES 容許程序刪除應用 清除應用緩存 android.permission.CLEAR_APP_CACHE 清除應用緩存 清除用戶數據 android.permission.CLEAR_APP_USER_DATA 清除應用的用戶數據 結束後臺進程 android.permission.KILL_BACKGROUND_PROCESSES 容許程序調用killBackgroundProcesses(String).方法結束後臺進程 安裝應用程序 android.permission.INSTALL_PACKAGES 容許程序安裝應用 強制後退 android.permission.FORCE_BACK 容許程序強制使用back後退按鍵,不管Activity是否在頂層 改變配置 android.permission.CHANGE_CONFIGURATION 容許當前應用改變配置,如定位 應用診斷 android.permission.DIAGNOSTIC 容許程序到RW到診斷資源 手機優化大師擴展權限 android.permission.CELL_PHONE_MASTER_EX 手機優化大師擴展權限 獲取應用大小 android.permission.GET_PACKAGE_SIZE 獲取應用的文件大小 獲取任務信息 android.permission.GET_TASKS 容許程序獲取當前或最近運行的應用 容許全局搜索 android.permission.GLOBAL_SEARCH 容許程序使用全局搜索功能 注射事件 android.permission.INJECT_EVENTS 容許訪問本程序的底層事件,獲取按鍵、軌跡球的事件流 內部系統窗口 android.permission.INTERNAL_SYSTEM_WINDOW 容許程序打開內部窗口,不對第三方應用程序開放此權限
  • 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

電量 狀態欄 壁紙markdown

電量統計    android.permission.BATTERY_STATS 獲取電池電量統計信息 電源管理 android.permission.DEVICE_POWER 容許訪問底層電源管理 狀態欄控制 android.permission.EXPAND_STATUS_BAR 容許程序擴展或收縮狀態欄 綁定壁紙 android.permission.BIND_WALLPAPER 必須經過WallpaperService服務來請求,只有系統才能用
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

其餘

綁定小插件    android.permission.BIND_APPWIDGET 容許一個程序告訴appWidget服務須要訪問小插件的數據庫,只有很是少的應用纔用到此權限 綁定設備管理 android.permission.BIND_DEVICE_ADMIN 請求系統管理員接收者receiver,只有系統才能使用 綁定輸入法 android.permission.BIND_INPUT_METHOD 請求InputMethodService服務,只有系統才能使用 綁定RemoteView android.permission.BIND_REMOTEVIEWS 必須經過RemoteViewsService服務來請求,只有系統才能用 收到短信時廣播 android.permission.BROADCAST_SMS 當收到短信時觸發一個廣播 連續廣播 android.permission.BROADCAST_STICKY 容許一個程序收到廣播後快速收到下一個廣播 WAP PUSH廣播 android.permission.BROADCAST_WAP_PUSH WAPPUSH服務收到後觸發一個廣播 改變組件狀態 android.permission.CHANGE_COMPONENT_ENABLED_STATE 改變組件是否啓用狀態 禁用鍵盤鎖 android.permission.DISABLE_KEYGUARD 容許程序禁用鍵盤鎖 轉存系統信息 android.permission.DUMP 容許程序獲取系統dump信息從系統服務 工廠測試模式 android.permission.FACTORY_TEST 容許程序運行工廠測試模式
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

Part Two

普通權限的總結:

ACCESS_LOCATION_EXTRA_COMMANDS 定位權限
ACCESS_NETWORK_STATE 網絡狀態權限
ACCESS_NOTIFICATION_POLICY 通知 APP通知顯示在狀態欄
ACCESS_WIFI_STATE WiFi狀態權限
BLUETOOTH 使用藍牙權限
BLUETOOTH_ADMIN 控制藍牙開關
BROADCAST_STICKY 粘性廣播
CHANGE_NETWORK_STATE 改變網絡狀態
CHANGE_WIFI_MULTICAST_STATE 改變WiFi多播狀態,應該是控制手機熱點(猜想)
CHANGE_WIFI_STATE 控制WiFi開關,改變WiFi狀態
DISABLE_KEYGUARD 改變鍵盤爲不可用
EXPAND_STATUS_BAR 擴展bar的狀態
GET_PACKAGE_SIZE 獲取應用安裝包大小
INTERNET 網絡權限
KILL_BACKGROUND_PROCESSES 殺死後臺進程
MODIFY_AUDIO_SETTINGS 改變音頻輸出設置
NFC 支付
READ_SYNC_SETTINGS 獲取手機設置信息
READ_SYNC_STATS 數據統計
RECEIVE_BOOT_COMPLETED 監聽啓動廣播
REORDER_TASKS 建立新棧
REQUEST_INSTALL_PACKAGES 安裝應用程序
SET_TIME_ZONE 容許應用程序設置系統時間區域
SET_WALLPAPER 設置壁紙
SET_WALLPAPER_HINTS 設置壁紙上的提示信息,個性化語言
TRANSMIT_IR 紅外發射
USE_FINGERPRINT 指紋識別
VIBRATE 震動
WAKE_LOCK 鎖屏
WRITE_SYNC_SETTINGS 改變設置
SET_ALARM 設置警告提示
INSTALL_SHORTCUT 建立快捷方式
UNINSTALL_SHORTCUT 刪除快捷方式
以上這些只是普通權限,咱們開發的時候,正常使用就好了,須要的權限在清單文件配置便可。

危險權限

這類權限須要在須要的時候,須要咱們動態申請,好比:當咱們須要打開相機拍攝照片的時候須要咱們經過代碼的方式在須要的地方去申請權限。Android6.0中權限問題中咱們須要注意的是:

1:因爲權限API的問題,咱們的Actiivty最好是AppCompatActivity類型的,也就是說在你的BaseActivity須要繼承AppCompatActivity
2:權限是分組的,同一組的權限申請其中一個,同組的權限就所有都申請了

特殊權限 組:

CALENDAR    日曆
CAMERA      相機
CONTACTS    聯繫人
LOCATION    定位
MICROPHONE  麥克相關,好比錄音
PHONE       手機狀態
SENSORS     傳感器
SMS         短信
STORAGE     存儲權限
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

具體的權限分組狀況以下表:
這裏寫圖片描述

Part Three

請求權限實現:

使用的API:

6.0的運行時權限,咱們最終都是要支持的,一般咱們須要使用以下的API
int checkSelfPermission(String permission) 用來檢測應用是否已經具備權限,這個方法是在API23中才有的,爲了兼容低版本,建議使用v4包中的ContextCompat.checkSelfPermission,在下面的注意事項中有解釋,這裏就不在贅述了
void requestPermissions(String[] permissions, int requestCode) 進行請求單個或多個權限,第一個參數是請求的權限集合,第二個參數是請求碼,在回調監聽中能夠用來判斷是哪一個權限請求的結果
void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) 用戶對請求做出響應後的回調,請求成功或者失敗的監聽
shouldShowRequestPermissionRationale這個API能夠幫咱們判斷接下來的對話框是否包含」再也不詢問「選擇框。在6.0以前的版本永遠返回的是fasle
好比咱們請求CAMERA權限:

@Override public void onClick(View v) { // 一個按鈕的點擊事件 if (!(checkSelfPermission(Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED)) { // 檢查權限 if (shouldShowRequestPermissionRationale(Manifest.permission.READ_CONTACTS)) { // 6.0以前的手機返回的都是true(清單文件配置了的前提下) Toast.makeText(this, "Please grant the permission this time", Toast.LENGTH_LONG).show(); } requestReadContactsPermission(); } else { Log.i(LOGTAG, "onClick granted"); } } private static final int REQUEST_PERMISSION_CAMERA_CODE = 1; private void requestCameraPermission() { requestPermissions(new String[]{Manifest.permission.CAMERA}, REQUEST_PERMISSION_CAMERA_CODE); } /* * 結果回調 */ @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_PERMISSION_CAMERA_CODE) { int grantResult = grantResults[0]; boolean granted = grantResult == PackageManager.PERMISSION_GRANTED; // 請求權限的結果 true表明用戶贊成了 Log.i(LOGTAG, "onRequestPermissionsResult granted=" + granted); } }
  • 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

以上是Android提供給咱們的申請一個權限時的方式。若是咱們想同時申請多個權限就應該寫爲以下方式:

private static final int REQUEST_CODE = 1; private void requestMultiplePermissions() { String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE}; requestPermissions(permissions, REQUEST_CODE); }
  • 1
  • 2
  • 3
  • 4
  • 5

上面的方式是Android提供給咱們的請求方式,這種方式的好處是徹底使用Android提供的api沒有引入別的依賴,若是公司對應用安裝包的大小比較在乎的話,建議使用原生的。

使用RxJava動態請求權限

首先app的build.gradle添加依賴:

dependencies { compile 'com.tbruyelle.rxpermissions:rxpermissions:0.7.0@aar' compile 'io.reactivex:rxjava:1.1.6' }
  • 1
  • 2
  • 3
  • 4

而後就是使用

public void requestPermission(){ RxPermissions.getInstance(this) .request( Manifest.permission.READ_PHONE_STATE, Manifest.permission.WRITE_EXTERNAL_STORAGE)//這裏申請了兩組權限 .subscribe(new Action1<Boolean>() { @Override public void call(Boolean granted) { if (granted) { //贊成 ... } else { //不一樣意 Toast.makeText(LaunchActivity.this, "請贊成**的權限,才能繼續提供服務", Toast.LENGTH_LONG).show(); } } }); }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

Part Four

注意事項

API問題

因爲checkSelfPermission和requestPermissions從API 23才加入,低於23版本,須要在運行時判斷 或者使用Support Library v4中提供的方法

ContextCompat.checkSelfPermission
ActivityCompat.requestPermissions
ActivityCompat.shouldShowRequestPermissionRationale

多系統問題

當咱們支持了6.0必須也要支持4.4,5.0這些系統,因此須要在不少狀況下,須要有兩套處理。好比Camera權限

if (isMarshmallow()) { requestPermission();//而後在回調中處理 } else { useCamera();//低於6.0直接使用Camera }
  • 1
  • 2
  • 3
  • 4
  • 5

兩個特殊權限

特殊權限,顧名思義,就是一些特別敏感的權限,在Android系統中,主要由兩個

SYSTEM_ALERT_WINDOW,設置懸浮窗,進行一些黑科技
WRITE_SETTINGS 修改系統設置

關於上面兩個特殊權限的受權,作法是使用startActivityForResult啓動受權界面來完成。

請求SYSTEM_ALERT_WINDOW

private static final int REQUEST_CODE = 1; private void requestAlertWindowPermission() { Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION); intent.setData(Uri.parse("package:" + getPackageName())); startActivityForResult(intent, REQUEST_CODE); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE) { if (Settings.canDrawOverlays(this)) { Log.i(LOGTAG, "onActivityResult granted"); } } }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

上述代碼須要注意的是
使用Action Settings.ACTION_MANAGE_OVERLAY_PERMISSION啓動隱式Intent
使用」package:」 + getPackageName()攜帶App的包名信息
使用Settings.canDrawOverlays方法判斷受權結果

請求WRITE_SETTINGS

private static final int REQUEST_CODE_WRITE_SETTINGS = 2; private void requestWriteSettings() { Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS); intent.setData(Uri.parse("package:" + getPackageName())); startActivityForResult(intent, REQUEST_CODE_WRITE_SETTINGS ); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE_WRITE_SETTINGS) { if (Settings.System.canWrite(this)) { Log.i(LOGTAG, "onActivityResult write settings granted" ); } } }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

上述代碼須要注意的是
使用Action Settings.ACTION_MANAGE_WRITE_SETTINGS 啓動隱式Intent
使用」package:」 + getPackageName()攜帶App的包名信息
使用Settings.System.canWrite方法檢測受權結果

最後

注意:關於上面這兩個特殊權限,通常不建議應用申請。

相關文章
相關標籤/搜索