嘚吧嘚
在使用內容提供器的時候很多情況下會使用到很多危險權限
,如通訊錄、攝像機、撥打電話、發送短信… …等權限。
而普通權限
在AndroidManifest.xml
中配置一下聲明權限就可以了使用了,如
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.test">
<!-- 振動權限 -->
<uses-permission android:name="android.permission.VIBRATE" />
......
</manifest>
而危險權限
不僅需要在AndroidManifest.xml
中配置聲明權限,還需要用戶授權
才能使用。
危險權限及其分組
注意:危險權限同一組內有一項權限被授權,則一組權限都被授權。
編號 | 權限組 | 權限 |
---|---|---|
1 | CONTACTS (聯繫人) | android.permission.READ_CONTACTS android.permission.WRITE_CONTACTS android.permission.GET_ACCOUNTS |
2 | PHONE (手機) | android.permission.READ_CALL_LOG android.permission.READ_PHONE_STATE android.permission.CALL_PHONE android.permission.WRITE_CALL_LOG android.permission.USE_SIP android.permission.PROCESS_OUTGOING_CALLS com.android.voicemail.permission.ADD_VOICEMAIL |
3 | CALENDAR (日曆) | android.permission.READ_CALENDAR android.permission.WRITE_CALENDAR |
4 | CAMERA (相機) | android.permission.CAMERA |
5 | SENSORS (傳感器) | android.permission.BODY_SENSORS |
6 | LOCATION (位置) | android.permission.ACCESS_FINE_LOCATION android.permission.ACCESS_COARSE_LOCATION |
7 | STORAGE (存儲卡) | android.permission.READ_EXTERNAL_STORAGE android.permission.WRITE_EXTERNAL_STORAGE |
8 | MICROPHONE (麥克風) | android.permission.RECORD_AUDIO |
9 | SMS (短信) | android.permission.READ_SMS android.permission.RECEIVE_WAP_PUSH android.permission.RECEIVE_MMS android.permission.RECEIVE_SMS android.permission.SEND_SMS aandroid.permission.READ_CELL_BROADCASTS |
所有權限及說明
編號 | 權限 | 說明 |
---|---|---|
1 | ACCESS_CHECKIN_PROPERTIES | 允許讀寫訪問”properties”表在checkin數據庫中,改值可以修改上傳 |
2 | ACCESS_COARSE_LOCATION | 允許一個程序訪問CellID或 WiFi熱點來獲取粗略的位置 |
3 | ACCESS_FINE_LOCATION | 允許一個程序訪問CellID或 WiFi熱點來獲取粗略的位置 |
4 | ACCESS_LOCATION_EXTRA_COMMANDS | 允許應用程序訪問額外的位置提供命令 |
5 | ACCESS_NETWORK_STATE | 允許程序獲取網絡信息狀態,如當前的網絡連接是否有效 |
6 | ACCESS_NOTIFICATION_POLICY | 希望訪問通知策略的應用程序的標記許可 |
7 | ACCESS_WIFI_STATE | 允許程序獲取當前WiFi接入的狀態以及WLAN熱點的信息 |
8 | ACCOUNT_MANAGER | 允許程序通過賬戶驗證方式訪問賬戶管理ACCOUNT_MANAGER相關信息 |
9 | ADD_VOICEMAIL | 允許一個應用程序添加語音郵件系統 |
10 | BATTERY_STATS | 允許程序更新手機電池統計信息 |
11 | BIND_ACCESSIBILITY_SERVICE | 請求accessibilityservice服務,以確保只有系統可以綁定到它 |
12 | BIND_APPWIDGET | 允許程序告訴appWidget服務需要訪問小插件的數據庫,只有非常少的應用纔用到此權限 |
13 | BIND_CARRIER_MESSAGING_SERVICE | API等級高於23時使用,否則使用BIND_CARRIER_SERVICES |
14 | BIND_CARRIER_SERVICES | 允許綁定到運營商應用程序中的服務的系統進程將有這個權限 |
15 | BIND_CHOOSER_TARGET_SERVICE | 必須由ChooserTargetService要求,確保只有系統可以綁定到它 |
16 | BIND_DEVICE_ADMIN | 請求系統管理員接收者receiver,只有系統才能使用 |
17 | BIND_DREAM_SERVICE | 必須由一個DreamService要求,確保只有系統可以綁定到它 |
18 | BIND_INCALL_SERVICE | 必須由一個MidiDeviceService要求,確保只有系統可以綁定到它 |
19 | BIND_INPUT_METHOD | 請求InputMethodService服務,只有系統才能使用 |
20 | BIND_MIDI_DEVICE_SERVICE | 必須由一MidiDeviceService要求,確保只有系統可以綁定到它 |
21 | BIND_NFC_SERVICE | 由HostApduServiceOffHostApduService必須確保只有系統可以綁定到它 |
22 | BIND_NOTIFICATION_LISTENER_SERVICE | 必須要求由notificationlistenerservice,以確保只有系統可以綁定到它 |
23 | BIND_PRINT_SERVICE | 必須要求由printservice,以確保只有系統可以綁定到它 |
24 | BIND_REMOTEVIEWS | 必須通過RemoteViewsService服務來請求,只有系統才能用 |
25 | BIND_TELECOM_CONNECTION_SERVICE | 必須由ConnectionService要求,確保只有系統可以綁定到它 |
26 | BIND_TEXT_SERVICE | 必須要求textservice,以確保只有系統可以綁定到它 |
27 | BIND_TV_INPUT | 必須由TvInputService需要確保只有系統可以綁定到它 |
28 | BIND_VOICE_INTERACTION | 必須VoiceInteractionService要求,確保只有系統可以綁定到它 |
29 | BIND_VPN_SERVICE | 綁定VPN服務必須通過VpnService服務來請求,只有系統才能用 |
30 | BIND_WALLPAPER | 必須通過WallpaperService服務來請求,只有系統才能用 |
31 | BLUETOOTH | 允許程序連接配對過的藍牙設備 |
32 | BLUETOOTH_ADMIN | 允許程序進行發現和配對新的藍牙設備 |
33 | BLUETOOTH_PRIVILEGED | 允許應用程序配對藍牙設備,而無需用戶交互。這不是第三方應用程序可用 |
34 | BODY_SENSORS | 允許應用程序訪問用戶使用的傳感器來測量他/她的身體內發生了什麼,如心率儀 |
35 | BROADCAST_PACKAGE_REMOVED | 允許程序廣播一個提示消息在一個應用程序包已經移除後 |
36 | BROADCAST_SMS | 允許程序當收到短信時觸發一個廣播 |
37 | BROADCAST_STICKY | 允許程序收到廣播後快速收到下一個廣播 |
38 | BROADCAST_WAP_PUSH | WAP PUSH服務收到後觸發一個廣播 |
39 | CALL_PHONE | 允許程序從非系統撥號器裏撥打電話 |
40 | CALL_PRIVILEGED | 允許程序撥打電話,替換系統的撥號器界面 |
41 | CAMERA | 允許程序訪問攝像頭進行拍照 |
42 | CAPTURE_AUDIO_OUTPUT | 允許一個應用程序捕獲音頻輸出。不被第三方應用使用 |
43 | CAPTURE_SECURE_VIDEO_OUTPUT | 允許一個應用程序捕獲視頻輸出。不被第三方應用使用 |
44 | CAPTURE_VIDEO_OUTPUT | 允許一個應用程序捕獲視頻輸出,不被第三方應用使用 |
45 | CHANGE_COMPONENT_ENABLED_STATE | 改變組件是否啓用狀態 |
46 | CHANGE_CONFIGURATION | 允許當前應用改變配置,如定位 |
47 | CHANGE_NETWORK_STATE | 允許程序改變網絡狀態,如是否聯網 |
48 | CHANGE_WIFI_MULTICAST_STATE | 允許程序改變WiFi多播狀態 |
49 | CHANGE_WIFI_STATE | 允許程序改變WiFi狀態 |
50 | CLEAR_APP_CACHE | 允許程序清除應用緩存 |
51 | CONTROL_LOCATION_UPDATES | 允許程序獲得移動網絡定位信息改變 |
52 | DELETE_CACHE_FILES | 允許程序刪除緩存文件 |
53 | DELETE_PACKAGES | 允許程序刪除應用 |
54 | DIAGNOSTIC | 允許程序到RW到診斷資源 |
55 | DISABLE_KEYGUARD | 允許程序禁用鍵盤鎖 |
56 | DUMP | 允許程序獲取系統dump信息從系統服務 |
57 | EXPAND_STATUS_BAR | 允許程序擴展或收縮狀態欄 |
58 | FACTORY_TEST | 允許程序運行工廠測試模式 |
59 | FLASHLIGHT | 允許訪問閃光燈 |
60 | GET_ACCOUNTS | 允許程序訪問賬戶Gmail列表 |
61 | GET_ACCOUNTS_PRIVILEGED | 允許訪問帳戶服務中的帳戶列表 |
62 | GET_PACKAGE_SIZE | 允許一個程序獲取任何package佔用空間容量 |
63 | GET_TASKS | 允許一個程序獲取信息有關當前或最近運行的任務,一個縮略的任務狀態,是否活動等等 |
64 | GLOBAL_SEARCH | 允許程序允許全局搜索 |
65 | INSTALL_LOCATION_PROVIDER | 允許程序安裝定位提供 |
66 | INSTALL_PACKAGES | 允許程序安裝應用 |
67 | INSTALL_SHORTCUT | 創建快捷方式 |
68 | INTERNET | 允許程序訪問網絡連接,可能產生GPRS流量 |
69 | KILL_BACKGROUND_PROCESSES | 允許程序調用killBackgroundProcesses(String).方法結束後臺進程 |
70 | LOCATION_HARDWARE | 允許一個應用程序中使用定位功能的硬件,不使用第三方應用 |
71 | MANAGE_DOCUMENTS | 允許一個應用程序來管理文檔的訪問,通常是一個文檔選擇器部分 |
72 | MASTER_CLEAR | 允許程序執行軟格式化,刪除系統配置信息 |
73 | MEDIA_CONTENT_CONTROL | 允許一個應用程序知道什麼是播放和控制其內容。不被第三方應用使用 |
74 | MODIFY_AUDIO_SETTINGS | 允許程序修改聲音設置信息 |
75 | MODIFY_PHONE_STATE | 允許程序修改電話狀態,如飛行模式,但不包含替換系統撥號器界面 |
76 | MOUNT_FORMAT_FILESYSTEMS | 允許程序格式化可移動文件系統,比如格式化清空SD卡 |
77 | MOUNT_UNMOUNT_FILESYSTEMS | 允許程序掛載、反掛載外部文件系統 |
78 | NFC | 允許程序執行NFC近距離通訊操作,用於移動支持 |
79 | PACKAGE_USAGE_STATS | 允許一個程序設置他的activities顯示 |
80 | PERSISTENT_ACTIVITY | 允許程序創建一個永久的Activity,該功能標記爲將來將被移除 |
81 | PROCESS_OUTGOING_CALLS | 允許程序監視,修改或放棄播出電話 |
82 | READ_CALENDAR | 允許程序讀取用戶的日程信息 |
83 | READ_CALL_LOG | 讀取通話記錄 |
84 | READ_CONTACTS | 允許程序訪問聯繫人通訊錄信息 |
85 | READ_EXTERNAL_STORAGE | 程序可以讀取設備外部存儲空間(內置SDcard和外置SDCard)的文件,如果您的App已經添加了”WRITE_EXTERNAL_STORAGE”權限,則就沒必要添加讀的權限了,寫權限已經包含了讀權限了 |
86 | READ_FRAME_BUFFER | 允許程序讀取幀緩存用於屏幕截圖 |
87 | READ_INPUT_STATE | 允許程序讀取當前鍵的輸入狀態,僅用於系統 |
88 | READ_LOGS | 允許程序讀取系統底層日誌 |
89 | READ_PHONE_STATE | 允許程序訪問電話狀態 |
90 | READ_SMS | 允許程序讀取短信內容 |
91 | READ_SYNC_SETTINGS | 允許程序讀取同步設置,讀取Google在線同步設置 |
92 | READ_SYNC_STATS | 允許程序讀取同步狀態,獲得Google在線同步狀態 |
93 | READ_VOICEMAIL | 允許應用程序在系統讀取語音郵件 |
94 | REBOOT | 允許程序重新啓動設備 |
95 | RECEIVE_BOOT_COMPLETED | 允許程序開機自動運行 |
96 | RECEIVE_MMS | 允許程序接收彩信 |
97 | RECEIVE_SMS | 允許程序接收短信 |
98 | RECEIVE_WAP_PUSH | 允許程序接收WAP PUSH信息 |
99 | RECORD_AUDIO | 允許程序錄制聲音通過手機或耳機的麥克 |
100 | REORDER_TASKS | 允許程序重新排序系統Z軸運行中的任務 |
101 | REQUEST_IGNORE_BATTERY_OPTIMIZATIONS | 權限的應用程序必須要使用ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS這是一個正常的權限:一個應用程序請求它將永遠被授予權限,而不需要用戶批准或看到它。 |
102 | REQUEST_INSTALL_PACKAGES | 允許應用程序請求安裝包。針對API大於22必須持有該許可使用ACTION_INSTALL_PACKAGE應用。 |
103 | RESTART_PACKAGES | 允許程序結束任務通過restartPackage(String)方法,該方式將在外來放棄 |
104 | SEND_RESPOND_VIA_MESSAGE | 允許用戶在來電的時候用你的應用進行即時的短信息回覆 |
105 | SEND_SMS | 允許程序發送短信 |
106 | SET_ALARM | 允許程序設置鬧鈴提醒 |
107 | SET_ALWAYS_FINISH | 允許程序設置程序在後臺是否總是退出 |
108 | SET_ANIMATION_SCALE | 允許程序設置全局動畫縮放 |
109 | SET_DEBUG_APP | 允許程序設置調試程序,一般用於開發 |
110 | SET_PREFERRED_APPLICATIONS | 允許程序設置應用的參數,已不再工作具體查看addPackageToPreferred(String) 介紹 |
111 | SET_PROCESS_LIMIT | 允許程序設置最大的進程數量的限制 |
112 | SET_TIME | 允許程序設置系統時間 |
113 | SET_TIME_ZONE | 允許程序設置系統時區 |
114 | SET_WALLPAPER | 允許程序設置桌面壁紙 |
115 | SET_WALLPAPER_HINTS | 允許程序設置壁紙建議 |
116 | SIGNAL_PERSISTENT_PROCESSES | 允許程序發送一個永久的進程信號 |
117 | STATUS_BAR | 允許程序打開、關閉、禁用狀態欄 |
118 | SYSTEM_ALERT_WINDOW | 允許程序顯示系統窗口 |
119 | TRANSMIT_IR | 允許使用設備的紅外發射器,如果可用 |
120 | UNINSTALL_SHORTCUT | 刪除快捷方式 |
121 | UPDATE_DEVICE_STATS | 允許程序更新設備狀態 |
122 | USE_FINGERPRINT | 允許應用程序使用指紋硬件 |
123 | USE_SIP | 允許程序使用SIP視頻服務 |
124 | VIBRATE | 允許程序振動 |
125 | WAKE_LOCK | 允許程序在手機屏幕關閉後後臺進程仍然運行 |
126 | WRITE_APN_SETTINGS | 允許程序寫入網絡GPRS接入點設置 |
127 | WRITE_CALENDAR | 允許程序寫入日程,但不可讀取 |
128 | WRITE_CALL_LOG | 允許程序寫入(但是不能讀)用戶的聯繫人數據 |
129 | WRITE_CONTACTS | 寫入聯繫人,但不可讀取 |
130 | WRITE_EXTERNAL_STORAGE | 允許程序寫入外部存儲,如SD卡上寫文件 |
131 | WRITE_GSERVICES | 允許程序修改Google服務地圖 |
132 | WRITE_SECURE_SETTINGS | 允許應用程序讀取或寫入安全系統設置 |
133 | WRITE_SETTINGS | 允許程序讀取或寫入系統設置 |
134 | WRITE_SYNC_SETTINGS | 允許程序寫入同步設置 |
135 | WRITE_VOICEMAIL | 允許應用程序修改和刪除系統中的現有的語音郵件,只有系統才能使用 |
危險權限授權示例
在AndroidManifest.xml
文件中聲明“撥打電話”的權限
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.test">
<uses-permission android:name="android.permission.CALL_PHONE" /> <!-- 打電話 -->
......
</manifest>
設置一個打電話的按鈕,點擊之後
call.setOnClickListener((v) -> {
/*傳入兩個參數,第一個是context,第二個是要獲得的權限名。將返回值與PackageManager.PERMISSION_GRANTED做比較*/
if (ContextCompat.checkSelfPermission(ContactItemActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
/*爲獲得授權,調用requestPermissions方法向用戶申請授權,傳入三個參數:context,獲得的權限名字符串,以及請求碼,唯一值即可。*/
ActivityCompat.requestPermissions(ContactItemActivity.this,new String[]{Manifest.permission.CALL_PHONE}, 1);
} else {
//number是要撥打的電話
call(number);
}
});
call方法的具體實現
private void call(String number) {
try {
System.out.println(number + "---------------------------");
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:" + number));
startActivity(intent);
} catch (SecurityException e) {
e.printStackTrace();
}
}
調用完requestPermissions方法後,無論用戶選擇授權與否,都會回調到onRequestPermissionsResult()方法中,授權結果封裝在grantResults參數中,所以判斷授權結果,只有用戶授權同意,纔會調用call方法。
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode) {
case 1:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
call(number);
} else {
Toast.makeText(this, "被拒絕了,沒愛了", Toast.LENGTH_SHORT).show();
}
break;
default:
}
}
普通權限授權示例
在AndroidManifest.xml
文件中聲明“振動”權限
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.test">
<!-- 振動權限 -->
<uses-permission android:name="android.permission.VIBRATE" />
......
</manifest>
然後直接調用方法使用就行,不需要
用戶授權
Button vibrate = findViewById(R.id.vibrate);
vibrate.setOnClickListener((v) -> {
Vibrator vs = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
vs.vibrate(1000);
});