了解Android M中的权限

介绍

在M版本之前,Android权限模型在安装时对用户是全有或全无的决定。 这意味着,如果用户想使用某个应用程序,那么他们首先必须接受该应用程序中包含的所有权限,或者选择根本不安装它。 这导致许多开发人员在应用程序安装上迷失方向,用户与开发人员之间的信任断开,以及其他隐私问题

旧版安装时间权限对话框

在新的权限模型下,用户将能够在运行时根据需要批准权限,并且可以随时拒绝这些权限。 在本文中,您将了解处理权限的这种变化将如何影响您作为开发人员,以及您的用户将如何体验您的应用程序。

请注意,本文是在Android M正式发布之前撰写的,因此某些信息可能会随正式发布而改变。

1.什么需要权限?

尽管Android M仍需要在AndroidManifest.xml中声明权限,但现在要求用户在运行时批准或拒绝使用该权限。 新版Android的一项重要更改是android.permission.INTERNETandroid.permission.WRITE_EXTERNAL_STORAGE已从危险等级降为正常 。 这意味着您不需要在使用前提示用户。

当请求权限批准时,将基于权限的组提示用户,而不是要求用户批准组中的每个单个权限。 这意味着,如果您的应用程序需要同时发送和接收SMS消息,则只会提示您的用户批准SMS权限组。 下面是从系统设置中看到的Android M Developer Preview 2当前支持的权限组的列表。

当前支持的权限组列表

还应注意,Android具有功能强大的Intent系统,该系统允许开发人员从其他应用程序请求数据。 您无需请求相机许可并开发从头开始使用Camera API的应用程序,而可以要求用户使用已经受信任的相机应用程序拍照以将图像导入您的应用程序。 涉及相机的权限将由相机应用处理。

2.如何寻求许可?

当您需要使用需要许可的功能时,会发生一般的事件流。 您首先需要查看该权限是否已被用户批准。

如果用户尚未批准该权限,则可以向他们显示一个权限请求对话框。 首次向用户显示此权限时,他们将不得不拒绝或批准该权限。

但是,如果他们以前曾拒绝过该许可并再次被要求,则他们可以选择不再要求再次获得该许可。

请求权限流程图

您可以在使用需要该权限的功能之前,通过调用checkSelfPermission来检查以前是否已授予权限。 此方法基于是否授予许可而返回int值。

如果等于PackageManager.PERMISSION_GRANTED ,则可以按预期继续。 但是,如果以前未授予该权限,则可以使用requestPermissions进行请求,传入一个权限字符串数组和一个自定义int请求代码,以跟踪应用程序的逻辑流程。

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 ,将为您的应用程序向用户显示每个对话框,其中每个对话框都是您的应用程序正在请求权限的。 最佳实践是仅根据需要请求权限,而不是在用户首次启动应用程序时进行批量请求。

Android M上的“请求”对话框

完成对话框的用户操作后,将调用onRequestPermissionsResult并可以在Activity对其进行访问。 在这里,您可以启动功能或处理用户拒绝一个或多个权限的情况。

下面显示了如何检查是否已授予许可的示例。 如果用户拒绝了您的功能所需的任何权限,则应禁用该功能,并让用户知道该功能在您的应用程序中不起作用的原因。

@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. Android M上的旧版应用

虽然需要以Android M为目标构建的应用程序才能实现新的权限对话框和方法,但为Android的早期版本构建的应用程序仍会在安装时为用户提供权限列表。 尽管用户可以使用您的应用之前已接受许可,但仍可以随时将其撤消。

由于处理吊销权限的基础结构在面向Android M以下的应用程序中将不可用,因此,如果未授予权限,则所有具有必需权限的功能都将返回null0或空值。 这可能会导致应用程序发生意外行为,因此建议开发人员准备升级其应用程序,以尽快支持新的Android M权限模型。

结论

在本文中,您了解了新的Android M权限模型以及如何在应用程序中支持更新的权限。 我们还介绍了针对旧版本构建的应用程序如何响应新版本的Android。 使用此信息,您应该能够准备好应用程序,以准备下一次Android更新的正式发布。

翻译自: https://code.tutsplus.com/articles/understanding-permissions-in-android-m--cms-24443

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值