Google发布Android 6.0后对用权限的控制更加严格,在Android5.1或更低的版本中用户能在App的安装期间或使用设置应用程序权限来同意或拒绝某个权限,而在Android6.0或更高的版本中除了可以向上面说明的那样处理权限还可以在App任意运行期间请求权限。
Android权限
Android将权限分为normal和dangerous两类。
Normal权限
简单的来说这个这个级别的权限只会对用户的隐私和设备造成很小的影响如INTERNET、ACCESS_NETWORK_STATE等权限。如果你在Manifest中声明多个Normal权限,Android会在App安装期间自动的通过这些Normal权限请求,Android不会提示用户Normal权限且用户不能移除那些权限。
Dangerous权限
如果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();
}
参考
《架构文摘》每天一篇架构领域重磅好文,涉及一线互联网公司应用架构(高可用、高性 能、高稳定)、大数据、机器学习等各个热门领域。