Google发布Android 6.0后对用权限的控制更加严格,在Android5.1或更低的版本中用户能在App的安装期间或使用设置应用程序权限来同意或拒绝某个权限,而在Android6.0或更高的版本中除了可以向上面说明的那样处理权限还可以在App任意运行期间请求权限。
Android将权限分为normal和dangerous两类。
简单的来说这个这个级别的权限只会对用户的隐私和设备造成很小的影响如INTERNET、ACCESS_NETWORK_STATE等权限。如果你在Manifest中声明多个Normal权限,Android会在App安装期间自动的通过这些Normal权限请求,Android不会提示用户Normal权限且用户不能移除那些权限。
如果App需要的数据或资源涉及到用户的私有数据如READ_CONTACTS、READ_SMS等权限。Dangerous权限需要用户显示的同意。
在Android6.0或更高的系统中权限的处理可以在任何APP运行期间,Android已经提供的兼容库并包含一系列的方法去处理权限。注意权限还是要在Manifest中声明的。
<uses-permission android:name="android.permission.READ_SMS"></uses-permission>
以上声明APP需要读SMS权限,在APP安装后Android6.0或更高的版本中这些权限可能默认都是不允许的。为兼容新的Andorid系统应该在读和发送SMS时先检查是否有READ_SMS权限。
int isGranted = ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_SMS); if(PackageManager.PERMISSION_GRANTED == isGranted){ readSms(); }
以上代码检查是否有READ_SMS权限,如果有则读取短信。
当通过上面的 checkSelfPermission
方法返回 PackageManager.PERMISSION_DENIED
表示当前还没有READ_SMS权限需要去手动请求权限。
final int READ_SMS_PERMISSION = 0x1; public void requestSmsPermission(View view){ final String[] permissions = new String[]{ android.Manifest.permission.READ_SMS, }; ActivityCompat.requestPermissions(this, permissions, READ_SMS_PERMISSION); }
调用 requestPermissions
方法系统会弹出Dialog询问用户是否同意该权限。
用户对APP权限的请求做出响应后,系统会调用Activity的 onRequestPermissionsResult
方法。
@Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if(requestCode == READ_SMS_PERMISSION && grantResults[0] == PackageManager.PERMISSION_GRANTED) readSms(); }
Normal权限列表
权限组
Permissions Best Practices