花门楼前见秋草,岂能贫贱相看老。这篇文章主要讲述android 6.0+ 动态权限获取相关的知识,希望能为你提供帮助。
android 6.0+ 的权限 需要动态申请 这里的权限针对的是 敏感权限:
SMS(短信) SEND_SMS RECEIVE_SMS READ_SMS RECEIVE_WAP_PUSH RECEIVE_MMS STORAGE(存储卡) READ_EXTERNAL_STORAGE WRITE_EXTERNAL_STORAGE CONTACTS(联系人) READ_CONTACTS WRITE_CONTACTS GET_ACCOUNTS PHONE(手机) READ_PHONE_STATE CALL_PHONE READ_CALL_LOG WRITE_CALL_LOG ADD_VOICEMAIL USE_SIP PROCESS_OUTGOING_CALLS CALENDAR(日历) READ_CALENDAR WRITE_CALENDAR CAMERA(相机) CAMERA LOCATION(位置) ACCESS_FINE_LOCATION ACCESS_COARSE_LOCATION SENSORS(传感器) BODY_SENSORS MICROPHONE(麦克风) RECORD_AUDIO
一共用到 以下方法:
- ContextCompat.checkSelfPermission
检查应用是否具有某个危险权限。如果应用具有此权限,方法将返回 PackageManager.PERMISSION_GRANTED,并且应用可以继续操作。如果应用不具有此权限,方法将返回 PackageManager.PERMISSION_DENIED,且应用必须明确向用户要求权限。
- ActivityCompat.requestPermissions
应用可以通过这个方法动态申请权限,调用后会弹出一个对话框提示用户授权所申请的权限。
- ActivityCompat.shouldShowRequestPermissionRationale
如果应用之前请求过此权限但用户拒绝了请求,此方法将返回 true。如果用户在过去拒绝了权限请求,并在权限请求系统对话框中选择了 Don‘t ask again 选项,此方法将返回 false。如果设备规范禁止应用具有该权限,此方法也会返回 false。
- onRequestPermissionsResult
当应用请求权限时,系统将向用户显示一个对话框。当用户响应时,系统将调用应用的 onRequestPermissionsResult() 方法,向其传递用户响应,处理对应的场景
例:
< uses-permission android:name="android.permission.READ_CONTACTS" />
private void requestPermission() {
if(Build.VERSION.SDK_INT> =23){
if (ContextCompat.checkSelfPermission(this,Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
//此处一般直接去申请对应的权限有必要时可以去做判断 if (ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.READ_CONTACTS)) { Log.i(TAG,"shouldShowRequestPermissionRationale"); ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_CONTACTS},MY_PERMISSIONS_REQUEST_READ_CONTACTS); } else {
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_CONTACTS},MY_PERMISSIONS_REQUEST_READ_CONTACTS);
}
}else{
//这里是权限已经授予了去做该做的事
}
}
}
重写Activity 的
onRequestPermissionsResult方法 接收回调
@Override public void onRequestPermissionsResult(int requestCode,String permissions[], int[] grantResults) { switch (requestCode) { case MY_PERMISSIONS_REQUEST_READ_CONTACTS: { if (grantResults.length > 0 & & grantResults[0] == PackageManager.PERMISSION_GRANTED) { Log.i(TAG,"onRequestPermissionsResult granted"); } else { Log.i(TAG,"onRequestPermissionsResult denied");
//弹出框 让用户去应用详情页手动设置权限
showWaringDialog(); } return; }} }private void showWaringDialog() { AlertDialog dialog = new AlertDialog.Builder(this) .setTitle("警告!") .setMessage("请前往设置-> 应用-> PermissionDemo-> 权限中打开相关权限,否则功能无法正常运行!") .setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri); }
}).show(); }
【android 6.0+ 动态权限获取】
推荐阅读
- android开发(底部导航条的实现 | navigation tab)
- android dumpsys
- android开发(android studio的下载安装与简单使用 | sdk的安装与编译)
- Android 程序结构
- 安卓Recycleview简单的网格布局-初学者的关键点
- 安卓微信中下载apk无反应 微信浏览器无法跳转到apk下载链接方案
- Android实现选择题答题(包括单选多选和答题卡)
- Android : 跟我学Binder ---驱动情景分析
- 如何为你的博客文章创建很棒的精选图像