Android 6.0 权限机制详解
来源:互联网 发布:淘宝里的表情 编辑:程序博客网 时间:2024/06/11 22:11
Android 6.0 发布以来,在权限机制上发布了新的API,已经抛弃了之前只需要在manifest上设置就可以获得权限的方式。6.0的权限机制更加注重隐私与体验,动态申请权限的方式更加灵活,把权限管理交给用户,即使授权之后也可以及时更改权限。
Google 将权限分为两类:
动态申请权限步骤:一类是Normal Permissions,这类权限一般不涉及用户隐私,不需要手机授权的,比如说访问网络。二是Dangerous Permissions,涉及用户隐私,需要授权。
* Normal Permissions :
ACCESS_LOCATION_EXTRA_COMMANDSACCESS_NETWORK_STATEACCESS_NOTIFICATION_POLICYACCESS_WIFI_STATEBLUETOOTHBLUETOOTH_ADMINBROADCAST_STICKYCHANGE_NETWORK_STATECHANGE_WIFI_MULTICAST_STATECHANGE_WIFI_STATEDISABLE_KEYGUARDEXPAND_STATUS_BARGET_PACKAGE_SIZEINSTALL_SHORTCUTINTERNETKILL_BACKGROUND_PROCESSESMODIFY_AUDIO_SETTINGSNFCREAD_SYNC_SETTINGSREAD_SYNC_STATSRECEIVE_BOOT_COMPLETEDREORDER_TASKSREQUEST_INSTALL_PACKAGESSET_ALARMSET_TIME_ZONESET_WALLPAPERSET_WALLPAPER_HINTSTRANSMIT_IRUNINSTALL_SHORTCUTUSE_FINGERPRINTVIBRATEWAKE_LOCKWRITE_SYNC_SETTINGS
* Dangerous Permissions :
group:android.permission-group.CONTACTS permission:android.permission.WRITE_CONTACTS permission:android.permission.GET_ACCOUNTS permission:android.permission.READ_CONTACTSgroup:android.permission-group.PHONE permission:android.permission.READ_CALL_LOG permission:android.permission.READ_PHONE_STATE permission:android.permission.CALL_PHONE permission:android.permission.WRITE_CALL_LOG permission:android.permission.USE_SIP permission:android.permission.PROCESS_OUTGOING_CALLS permission:com.android.voicemail.permission.ADD_VOICEMAILgroup:android.permission-group.CALENDAR permission:android.permission.READ_CALENDAR permission:android.permission.WRITE_CALENDARgroup:android.permission-group.CAMERA permission:android.permission.CAMERAgroup:android.permission-group.SENSORS permission:android.permission.BODY_SENSORSgroup:android.permission-group.LOCATION permission:android.permission.ACCESS_FINE_LOCATION permission:android.permission.ACCESS_COARSE_LOCATIONgroup:android.permission-group.STORAGE permission:android.permission.READ_EXTERNAL_STORAGE permission:android.permission.WRITE_EXTERNAL_STORAGEgroup:android.permission-group.MICROPHONE permission:android.permission.RECORD_AUDIOgroup:android.permission-group.SMS permission:android.permission.READ_SMS permission:android.permission.RECEIVE_WAP_PUSH permission:android.permission.RECEIVE_MMS permission:android.permission.RECEIVE_SMS permission:android.permission.SEND_SMS permission:android.permission.READ_CELL_BROADCASTS
1,你的手机系统版本是6.0以上并且targetSdkVersion设置为>=23,这是动态申请权限的基本条件。
2,在AndroidManifest.xml中申请你需要的权限,包括普通权限和需要申请的特殊权限(不可省)。
3,开始申请权限,这里有三个主要的API:
(1),ContextCompat.checkSelfPermission()检查权限
(2),ActivityCompat.requestPermissions()申请授权
(3),onRequestPermissionsResult()授权回调
(4),ActivityCompat.shouldShowRequestPermissionRationale()拒绝说明(可选)
下面在BaseActivity 封装申请权限
判断一组权限,如果没有就去申请
/** * 判断权限 * @param permissions * @return */ public boolean checkPermission(String... permissions) { for(String permisssion : permissions) { if(ContextCompat.checkSelfPermission(this,permisssion)!= PackageManager.PERMISSION_GRANTED) { return false ; } } return true ; }
申请权限:
/** * 申请权限 * @param code * @param permissions */ public void requestPermissions(int code,String... permissions) { ActivityCompat.requestPermissions(this,permissions,code); }
测试用例,判断有没有相机权限:
public class MainActivity extends BaseActivity { private String[] permissions = null ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); permissions = new String[]{permission.CAMERA} ; if(checkPermission(permissions)) { startCamera(); }else { /**如果app之前请求过该权限,被用户拒绝, 这个方法就会返回true. 如果用户之前拒绝权限的时候勾选了对话框中”Don’t ask again”的选项,那么这个方法会返回false. 如果设备策略禁止应用拥有这条权限, 这个方法也返回false. */ //可选 if(ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) { Toast.makeText(this,"你之前拒绝过该权限",Toast.LENGTH_LONG).show(); } requestPermissions(0,permissions); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); switch (requestCode) { case 0: if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { //拿到权限 startCamera(); }else { if (!ActivityCompat.shouldShowRequestPermissionRationale(this, permission.CAMERA)) { //权限设置页面 Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); Uri uri = Uri.fromParts("package", getPackageName(), null); intent.setData(uri); startActivityForResult(intent, 3); } }break ; } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case 3: if(checkPermission(permissions)) { //doSometh // Log.e("permisson","==================="+ActivityCompat.shouldShowRequestPermissionRationale(this, // permission.CAMERA)); startCamera(); }else { Log.e("permisson","==================="+ActivityCompat.shouldShowRequestPermissionRationale(this, permission.CAMERA)); requestPermissions(0,permissions); } break; } } /** * 启动相机 */ private void startCamera() { Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); startActivityForResult(intent, 1); }}把权限检测和申请放到Activity基类里,统一管理。
阅读全文
0 0
- Android 6.0 权限机制详解
- 详解Android权限机制
- Android之Android 6.0权限机制及开发流程详解
- Android 6.0权限机制
- Android 6.0权限机制及开发流程详解
- Android 6.0的新特性及权限机制的详解
- Android 6.0 Permission权限机制
- Android 6.0 动态权限机制
- android 6.0权限申请机制
- android 6.0权限详解
- Android 6.0 权限管理详解
- Android 6.0权限使用详解
- Android 6.0权限逻辑详解
- Android 6.0 运行时权限检查机制
- Android 6.0权限机制基本学习
- Android 6.0 权限申请机制处理
- Android 6.0 Permission权限与安全机制
- Android权限机制
- 577. Employee Bonus
- 350. Intersection of Two Arrays II
- 事务隔离级别及锁机制
- 浮躁的年轻人
- ISO刻录到U盘(ISO to USB) v3.0 绿色中文版
- Android 6.0 权限机制详解
- 1.9Android 学习+进度之九-消息队列及其相关
- Joda-Time几个用法小记
- 处理JSON数据中含有双引号??
- 图像基础、OpenCV入门2——变亮、变暗、日落、水印等
- 基本排序算法
- 每日英语阅读(十四)
- YUV420 存储格式
- Source Insight v4.0免费版