理解 Android M 中的Permissions

出处:理解 Android M 中的Permissions


介绍

在M版本之前,Android Permissions模式是用户在安装的时候要么拥有全部,要么什么权限都没有。这意味着如果一个用户想要安装一个app,那么他们必须得接受app中包括的所有Permissions,或者选择不安装它。这使得许多开发者在安装app、用户和开发者信任、或其它隐私问题上受到影响。

在新的permissions模式下,用户将可以选择那些他们需要的permissions,并可以在任何时候拒绝那些permissions。本文中,你讲会了解到在处理permissions中的这些变化,它将会影响作为开发者你,并可增强用户黏性。

Screenshot_2015-07-20-06-30-05

应该注意到的是,这边文章是发布与官方发布Android M之前,所以,一些信息与官方的可能有点点区别。

1.什么需要permissions?

虽然Android M仍需在AndroidManifest.xml中配置需要用到的permissions,但是用户可以在运行时接受或拒绝那些权限。Android M中最重要的一个改变是android.permission.INTERNET和android.permission.WRITEEXTERNALSTORAGE已经从危险降级到正常。这意味着你不需要在用户使用app之前提示他。

当某个需要的权限被接受时,用户将会被分配到权限组,而不是去被询问是否接受每个单一的权限。这意味着如果你的app需要使用收发短讯,这样你的用户将会被分配到SMS权限组。下面是Android M当前支持的一些权限组。

permissiongroups-2

也应该注意到Android具有健壮的Intent系统。而不需要请求相机权限和从头开始使用相机api来开发一个应用。你可以调用已经可信的相机app来获得图片到你的app。相机中涉及到的权限将会由相机来app处理。

2.如何请求permission

当你需要使用某个permission来实现某个功能时,一般有个通用的事件流。首先,你需要判断该permission是否已经被你的用户接受。

如果用户未接受该permission,你可以用一个对话框给以提示。第一次这么做的时候,他们必须选择拒绝或接受这个permission。

然而,如果之前用户已经拒绝了该permission,现在又被询问时,那么用户应该可以选择不再询问。

permissions

在使用需要用到某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。

allowdialog

 

当你的用户遇到对话框时,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版本。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值