Dangerous permissions and permission groups.
Permission Group | Permissions |
---|---|
CALENDAR | READ_CALENDAR 、 WRITE_CALENDAR |
CAMERA | CAMERA |
CONTACTS | READ_CONTACTS 、 WRITE_CONTACTS 、 GET_ACCOUNTS |
LOCATION | ACCESS_FINE_LOCATION 、 ACCESS_COARSE_LOCATION |
MICROPHONE | RECORD_AUDIO |
PHONE | READ_PHONE_STATE 、 CALL_PHONE 、 READ_CALL_LOG 、 WRITE_CALL_LOG 、 ADD_VOICEMAIL 、 USE_SIP 、 PROCESS_OUTGOING_CALLS |
SENSORS | BODY_SENSORS |
SMS | SEND_SMS 、 RECEIVE_SMS 、 READ_SMS 、 RECEIVE_WAP_PUSH 、 RECEIVE_MMS |
STORAGE | READ_EXTERNAL_STORAGE 、 WRITE_EXTERNAL_STORAGE |
dangerous 权限需要开发者在 **AndroidManifest.xml 和 代码中动态申请
如果权限组里面的某个权限已经被用户授权了,那么申请这个组内的其它权限是就不需要弹出提示框让用户授权了**
Normal Permissions
As of API level 23, the following permissions are classified as PROTECTION_NORMAL:
- ACCESS_LOCATION_EXTRA_COMMANDS
- ACCESS_NETWORK_STATE
- ACCESS_NOTIFICATION_POLICY
- ACCESS_WIFI_STATE
- BLUETOOTH
- BLUETOOTH_ADMIN
- BROADCAST_STICKY
- CHANGE_NETWORK_STATE
- CHANGE_WIFI_MULTICAST_STATE
- CHANGE_WIFI_STATE
- DISABLE_KEYGUARD
- EXPAND_STATUS_BAR
- GET_PACKAGE_SIZE
- INSTALL_SHORTCUT
- INTERNET
- KILL_BACKGROUND_PROCESSES
- MODIFY_AUDIO_SETTINGS
- NFC
- READ_SYNC_SETTINGS
- READ_SYNC_STATS
- RECEIVE_BOOT_COMPLETED
- REORDER_TASKS
- REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
- REQUEST_INSTALL_PACKAGES
- SET_ALARM
- SET_TIME_ZONE
- SET_WALLPAPER
- SET_WALLPAPER_HINTS
- TRANSMIT_IR
- UNINSTALL_SHORTCUT
- USE_FINGERPRINT
- VIBRATE
- WAKE_LOCK
- WRITE_SYNC_SETTINGS
Normal 权限只需要在 AndroidManifest.xml 中申请即可。
动态权限申请例子
public void onClick(View v) {
if (down == 0) {
if (Build.VERSION.SDK_INT >= 23) {
int checkStoragePermission = ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (checkStoragePermission != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE_WRITE_EXTERNAL_STORAGE); //向系统申请权限
}else {
downloadAPK(URL_ADDRESS);
}
}else {
downloadAPK(URL_ADDRESS);
}
mButton.setText("正在下载!!");
}else if (down == 1 ){
installAPK();
}else if (down == 2){
openAPK(MainActivity.this,URL_ADDRESS);
}
}
@Override //申请后的回调方法
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
Logger.d("onRequestPermissionsResult.....");
switch (requestCode){
case REQUEST_CODE_WRITE_EXTERNAL_STORAGE:
if (grantResults[0] == PackageManager.PERMISSION_GRANTED){
downloadAPK(URL_ADDRESS);
}else {
Toast.makeText(MainActivity.this,"WRITE_EXTERNAL_STORAGE",Toast.LENGTH_SHORT);
}
break;
default:
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
http://blog.youkuaiyun.com/lmj623565791/article/details/50709663