介绍
在M版本之前,Android Permissions模式是用户在安装的时候要么拥有全部,要么什么权限都没有。这意味着如果一个用户想要安装一个app,那么他们必须得接受app中包括的所有Permissions,或者选择不安装它。这使得许多开发者在安装app、用户和开发者信任、或其它隐私问题上受到影响。
在新的permissions模式下,用户将可以选择那些他们需要的permissions,并可以在任何时候拒绝那些permissions。本文中,你讲会了解到在处理permissions中的这些变化,它将会影响作为开发者你,并可增强用户黏性。
应该注意到的是,这边文章是发布与官方发布Android M之前,所以,一些信息与官方的可能有点点区别。
1.什么需要permissions?
虽然Android M仍需在AndroidManifest.xml中配置需要用到的permissions,但是用户可以在运行时接受或拒绝那些权限。Android M中最重要的一个改变是android.permission.INTERNET和android.permission.WRITEEXTERNALSTORAGE已经从危险降级到正常。这意味着你不需要在用户使用app之前提示他。
当某个需要的权限被接受时,用户将会被分配到权限组,而不是去被询问是否接受每个单一的权限。这意味着如果你的app需要使用收发短讯,这样你的用户将会被分配到SMS权限组。下面是Android M当前支持的一些权限组。
也应该注意到Android具有健壮的Intent系统。而不需要请求相机权限和从头开始使用相机api来开发一个应用。你可以调用已经可信的相机app来获得图片到你的app。相机中涉及到的权限将会由相机来app处理。
2.如何请求permission
当你需要使用某个permission来实现某个功能时,一般有个通用的事件流。首先,你需要判断该permission是否已经被你的用户接受。
如果用户未接受该permission,你可以用一个对话框给以提示。第一次这么做的时候,他们必须选择拒绝或接受这个permission。
然而,如果之前用户已经拒绝了该permission,现在又被询问时,那么用户应该可以选择不再询问。
在使用需要用到某permission的功能之前,可以调用checkSelfPermission来检测该permission是否已被允许。该方法根据这个permission允许与否返回一个整数。
如果结果等于PackageManager.PERMISSION_GRANTED,便可继续下面的流程。然而,那个permission之前未被允许,可通过requestPermissions来请求相应permission。
int hasLocationPermission = checkSelfPermission( Manifest.permission.ACCESS_FINE_LOCATION );
int hasSMSPermission = checkSelfPermission( Manifest.permission.SEND_SMS );
List<String> permissions = new ArrayList<String>();
if( hasLocationPermission != PackageManager.PERMISSION_GRANTED ) {
permissions.add( Manifest.permission.ACCESS_FINE_LOCATION );
}
if( hasSMSPermission != PackageManager.PERMISSION_GRANTED ) {
permissions.add( Manifest.permission.SEND_SMS );
}
if( !permissions.isEmpty() ) {
requestPermissions( permissions.toArray( new String[permissions.size()] ), REQUEST_CODE_SOME_FEATURES_PERMISSIONS );
}
requestPermissions被调用时,将会弹出对话框寻求用户获得用户组权限。最佳实践是,每次只请求需要用到的permissions,而不是用户第一次打开应用时就询问所有的permissions。
当你的用户遇到对话框时,onRequestPermissionsResult就被调用并可以在Activity中来获取它。这是,便可开启相应的功能或处理当用户拒绝某个或多个permissions时的情况。
下面是一个关于如何检查某个permission是否已经被允许或拒绝的例子。如果用户已经拒绝了某个功能的permission,那么你应该禁用这个功能,并且让用户知道你的app中该功能不起效的原因。
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch ( requestCode ) {
case REQUEST_CODE_SOME_FEATURES_PERMISSIONS: {
for( int i = 0; i < permissions.length; i++ ) {
if( grantResults[i] == PackageManager.PERMISSION_GRANTED ) {
Log.d( "Permissions", "Permission Granted: " + permissions[i] );
} else if( grantResults[i] == PackageManager.PERMISSION_DENIED ) {
Log.d( "Permissions", "Permission Denied: " + permissions[i] );
}
}
}
break;
default: {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
}
3.Legacy Apps on Android M
为Android M构建app时需要实现新permissions对话框与方法,为之前版本的Android构建应用仍然会在安装app的时候询问用户permissions。被用户运行的permissions可在任何时候被取消。
建议开发者尽可能早地将app更新到支持新的Android M的permission模式。
总结
在本文中,你已经了解了Android M的新权限模式和如何将应该更新到支持新的permissions。文章也讨论了为以前版本的Android构建的app如何响应新版的。结合这些信息,你应该能够准备将你的app更新到下个Android版本。