Android 6.0官方提供的正常权限和危险权限描述
系统权限分为几个保护级别。需要了解的两个最重要保护级别是正常权限和危险权限:
- 正常权限涵盖应用需要访问其沙盒外部数据或资源,但对用户隐私或其他应用操作风险很小的区域。例如,设置时区的权限就是正常权限。如果应用声明其需要正常权限,系统会自动向应用授予该权限。如需当前正常权限的完整列表,请参阅正常权限。
- 危险权限涵盖应用需要涉及用户隐私信息的数据或资源,或者可能对用户存储的数据或其他应用的操作产生影响的区域。例如,能够读取用户的联系人属于危险权限。如果应用声明其需要危险权限,则用户必须明确向应用授予该权限。
权限组
所有危险的 Android 系统权限都属于权限组。如果设备运行的是 Android 6.0(API 级别 23),并且应用的targetSdkVersion
是 23 或更高版本,则当用户请求危险权限时系统会发生以下行为:
- 如果应用请求其清单中列出的危险权限,而应用目前在权限组中没有任何权限,则系统会向用户显示一个对话框,描述应用要访问的权限组。对话框不描述该组内的具体权限。例如,如果应用请求
READ_CONTACTS
权限,系统对话框只说明该应用需要访问设备的联系信息。如果用户批准,系统将向应用授予其请求的权限。 - 如果应用请求其清单中列出的危险权限,而应用在同一权限组中已有另一项危险权限,则系统会立即授予该权限,而无需与用户进行任何交互。例如,如果某应用已经请求并且被授予了
READ_CONTACTS
权限,然后它又请求WRITE_CONTACTS
,系统将立即授予该权限。
任何权限都可属于一个权限组,包括正常权限和应用定义的权限。但权限组仅当权限危险时才影响用户体验。可以忽略正常权限的权限组。
如果设备运行的是 Android 5.1(API 级别 22)或更低版本,并且应用的 targetSdkVersion
是 22 或更低版本,则系统会在安装时要求用户授予权限。再次强调,系统只告诉用户应用需要的权限组,而不告知具体权限。
权限组 | 权限 |
---|---|
CALENDAR (日历数据) |
|
CAMERA (相机) |
|
CONTACTS (联系人) |
|
LOCATION (位置) |
|
MICROPHONE (麦克风) |
|
PHONE (电话) |
|
SENSORS (传感器) | |
SMS (短信) |
|
STORAGE (存储) |
|
我的获取权限方式:
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(); }
就这么简单明了,弹窗自己加的,希望对大家有帮助!