Android 6.0动态获取权限,根据官方总结的最简单有效解决方法
2017-06-13 17:08
701 查看
Android 6.0官方提供的正常权限和危险权限描述
系统权限分为几个保护级别。需要了解的两个最重要保护级别是正常权限和危险权限:
正常权限涵盖应用需要访问其沙盒外部数据或资源,但对用户隐私或其他应用操作风险很小的区域。例如,设置时区的权限就是正常权限。如果应用声明其需要正常权限,系统会自动向应用授予该权限。如需当前正常权限的完整列表,请参阅正常权限。
危险权限涵盖应用需要涉及用户隐私信息的数据或资源,或者可能对用户存储的数据或其他应用的操作产生影响的区域。例如,能够读取用户的联系人属于危险权限。如果应用声明其需要危险权限,则用户必须明确向应用授予该权限。
权限组
所有危险的 Android 系统权限都属于权限组。如果设备运行的是 Android 6.0(API 级别 23),并且应用的
23 或更高版本,则当用户请求危险权限时系统会发生以下行为:
如果应用请求其清单中列出的危险权限,而应用目前在权限组中没有任何权限,则系统会向用户显示一个对话框,描述应用要访问的权限组。对话框不描述该组内的具体权限。例如,如果应用请求
如果应用请求其清单中列出的危险权限,而应用在同一权限组中已有另一项危险权限,则系统会立即授予该权限,而无需与用户进行任何交互。例如,如果某应用已经请求并且被授予了
任何权限都可属于一个权限组,包括正常权限和应用定义的权限。但权限组仅当权限危险时才影响用户体验。可以忽略正常权限的权限组。
如果设备运行的是 Android 5.1(API 级别 22)或更低版本,并且应用的
22 或更低版本,则系统会在安装时要求用户授予权限。再次强调,系统只告诉用户应用需要的权限组,而不告知具体权限。
表 1. 危险权限和权限组。
我的获取权限方式:
获取权限官方提供:
就这么简单明了,弹窗自己加的,希望对大家有帮助!
系统权限分为几个保护级别。需要了解的两个最重要保护级别是正常权限和危险权限:
正常权限涵盖应用需要访问其沙盒外部数据或资源,但对用户隐私或其他应用操作风险很小的区域。例如,设置时区的权限就是正常权限。如果应用声明其需要正常权限,系统会自动向应用授予该权限。如需当前正常权限的完整列表,请参阅正常权限。
危险权限涵盖应用需要涉及用户隐私信息的数据或资源,或者可能对用户存储的数据或其他应用的操作产生影响的区域。例如,能够读取用户的联系人属于危险权限。如果应用声明其需要危险权限,则用户必须明确向应用授予该权限。
权限组
所有危险的 Android 系统权限都属于权限组。如果设备运行的是 Android 6.0(API 级别 23),并且应用的
targetSdkVersion是
23 或更高版本,则当用户请求危险权限时系统会发生以下行为:
如果应用请求其清单中列出的危险权限,而应用目前在权限组中没有任何权限,则系统会向用户显示一个对话框,描述应用要访问的权限组。对话框不描述该组内的具体权限。例如,如果应用请求
READ_CONTACTS权限,系统对话框只说明该应用需要访问设备的联系信息。如果用户批准,系统将向应用授予其请求的权限。
如果应用请求其清单中列出的危险权限,而应用在同一权限组中已有另一项危险权限,则系统会立即授予该权限,而无需与用户进行任何交互。例如,如果某应用已经请求并且被授予了
READ_CONTACTS权限,然后它又请求
WRITE_CONTACTS,系统将立即授予该权限。
任何权限都可属于一个权限组,包括正常权限和应用定义的权限。但权限组仅当权限危险时才影响用户体验。可以忽略正常权限的权限组。
如果设备运行的是 Android 5.1(API 级别 22)或更低版本,并且应用的
targetSdkVersion是
22 或更低版本,则系统会在安装时要求用户授予权限。再次强调,系统只告诉用户应用需要的权限组,而不告知具体权限。
表 1. 危险权限和权限组。
权限组 | 权限 |
---|---|
CALENDAR (日历数据) | READ_CALENDAR 读取日程提醒 WRITE_CALENDAR 写入日程提醒 |
CAMERA (相机) | CAMERA 拍照权限 |
CONTACTS (联系人) | READ_CONTACTS 读取联系人 WRITE_CONTACTS 写入联系人 GET_ACCOUNTS 访问账户Gmail列表 |
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 使用SIP视频 PROCESS_OUTGOING_CALLS 处理拨出电话 |
SENSORS (传感器) | BODY_SENSORS |
SMS (短信) | SEND_SMS 发送短信 RECEIVE_SMS 接收短信 READ_SMS 读取短信内容 RECEIVE_WAP_PUSH 接收Wap Push RECEIVE_MMS 接收彩信 |
STORAGE (存储) | READ_EXTERNAL_STORAGE 读取SD卡文件 WRITE_EXTERNAL_STORAGE 写入文件到SD卡 |
public class MainActivity extends AppCompatActivity { String[] mPermissionList = new String[]{Manifest.permission.CAMERA}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (Build.VERSION.SDK_INT > 22) { ActivityCompat.requestPermissions(this, mPermissionList, 0); } } @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case 0: { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { Toast.makeText(getApplicationContext(), "同意此权限 " + grantResults[0], Toast.LENGTH_SHORT).show(); } else { Toast.makeText(getApplicationContext(), "拒绝此权限 " + grantResults[0] + permissions, Toast.LENGTH_SHORT).show(); showMissingPermissionDialog(permissions); } return; } } } /** * 显示提示信息 * * @param s * @since 2.5.0 */ public void showMissingPermissionDialog(final String[] s) { new AlertDialog.Builder(this) .setTitle("权限申请") .setMessage("拒绝此权限功能将无法正常使用") .setCancelable(false) .setNegativeButton("退出", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 拒绝, 退出应用 dialog.dismiss(); finish(); } }) .setPositiveButton("去设置", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { ActivityCompat.requestPermissions(MainActivity.this, s, 0); } }).show(); }
获取权限官方提供:
public class MainActivity extends AppCompatActivity { private static final int PERMISSIONS_CODE = 111; // 请求码 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); /** * 检查是否拥有某权限 * * 如果应用具有此权限,方法将返回 PackageManager.PERMISSION_GRANTED,并且应用可以继续操作。 * 如果应用不具有此权限,方法将返回 PERMISSION_DENIED,且应用必须明确向用户要求权限。 */ if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { Toast.makeText(getApplicationContext(), "没有此权限", Toast.LENGTH_SHORT).show(); /** * 如果应用之前请求过此权限但用户拒绝了请求,此方法将返回 true。 */ if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) { Toast.makeText(getApplicationContext(), "拒绝过此权限", Toast.LENGTH_SHORT).show(); // Show an expanation to the user *asynchronously* -- don't block // this thread waiting for the user's response! After the user // sees the explanation, try again to request the permission. } else { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA} , PERMISSIONS_CODE); } } else { Toast.makeText(getApplicationContext(), "拥有此权限", Toast.LENGTH_SHORT).show(); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == PERMISSIONS_CODE) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { Toast.makeText(getApplicationContext(), "同意权限", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(getApplicationContext(), "拒绝权限", Toast.LENGTH_SHORT).show(); showMissingPermissionDialog(); } } } /** * 显示提示信息 * * @since 2.5.0 */ public void showMissingPermissionDialog() { new AlertDialog.Builder(this) .setTitle("权限申请") .setMessage("拒绝此权限功能将无法正常使用") .setCancelable(false) .setNegativeButton("退出", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 拒绝, 退出应用 dialog.dismiss(); finish(); } }) .setPositiveButton("去授权", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CAMERA}, 0); } }).show(); }
就这么简单明了,弹窗自己加的,希望对大家有帮助!
相关文章推荐
- Android 6.0 最简单的权限获取方法 RxPermition EasyPermition
- Android 6.0 最简单的权限获取方法 RxPermition EasyPermition
- RxPermissions源码分析:使用RxJava处理Android 6.0运行时动态权限获取
- Android_在Android 6.0设备上动态获取权限
- Android动态权限获取总结
- Android 6.0获取wifi Mac地址为02:00:00:00:00:00的解决方法
- Android 6.0动态获取权限开源项目
- Android 6.0 权限问题解决方法
- 解决Android 6.0动态添加权限问题
- android 6.0 动态权限获取
- 关于Android中根据ID名动态获取资源的两个方法
- Android 6.0动态权限的获取
- Android 6.0 中动态获取权限
- 在android 6.0动态权限问题无法获取READ_PHONE_STATE权限的SecurityException的问题
- RxPermissions源码分析:使用RxJava处理Android 6.0运行时动态权限获取
- Android开发动态获取权限(6.0以上API>23)
- Android 6.0获取IMEI号是出错,动态获取权限
- 在Android 6.0 设备上动态获取权限
- Android 6.0动态权限大总结
- Android 6.0获取动态权限