Android 11使用户能够为位置,麦克风和摄像头指定更精细的权限。此版本还提供支持,以帮助开发人员审核数据访问并将数据访问与应用程序中的特定功能相关联

One-time permissions


在Android 11中,只要您的应用请求与位置,麦克风或摄像头相关的权限,面向用户的权限对话框都会包含一个名为Only this time的选项,如图1所示。如果用户在对话框中选择此选项,则您的应用被授予了临时的一次性许可。您的应用仅在以下情况之一成立时才能访问相关数据:
    自用户授予一次性权限以来,您的应用程序活动就一直可见。
    当用户授予许可并且此后一直在运行前台服务时,您的应用程序便可见。只要前台服务保持运行,即使用户将您的应用程序移至后台,您的应用程序仍将保留该权限
如果两个条件都不成立,则无论目标SDK版本如何,都需要再次询问用户权限

30新特性 android sdk android r新特性_安卓

 

                                                                        图1.包含“仅此时间”选项的“权限”对话框

WebView location access


如果您的应用程序包含WebView实例,则用户可以允许连续访问WebView对象本身中的位置,但将您的应用程序的位置权限限制为仅此一次。在这种情况下,请显示说明Web权限和应用程序级系统权限之间差异的屏幕或对话框。

 

Permission dialog visibility


Android 11不鼓励在特定权限组中重复请求权限。如果用户在应用程序在设备上的安装期间内两次点击“拒绝”以获取特定权限,则此操作表示“不再询问”相应的权限组。

系统还定义了用于响应模仿“拒绝”选项的动作的行为:

如果用户按下“后退”按钮以退出权限对话框,则这不算作“拒绝”操作。
如果使用requestPermissions()将用户从您的应用中转到系统设置,然后按返回按钮,则此操作算作“拒绝”操作

Data access auditing


注意:本节中显示的方法名称在以后的Developer Preview版本中可能会发生变化。

为了使您的应用及其依赖项如何访问用户的私有数据更加透明,Android 11引入了数据访问审核。通过从此过程中获得见解,您可以更好地识别和纠正潜在的意外数据访问。您的应用程序可以注册AppOpsManager.AppOpsCollector的实例,该实例可以在每次以下事件之一发生时执行操作:
    您应用的代码可访问私人数据。为了帮助您确定应用程序的哪个逻辑部分调用了事件,您可以按功能审核数据访问。
    依赖库或SDK中的代码访问私有数据。

在发生数据请求的线程上调用数据访问审核。这意味着,如果您应用中的第三方SDK或库调用了访问私有数据的API,则数据访问审核将允许您的AppOpsCollector检查有关该调用的信息。通常,此收集器对象可以通过查看应用程序的当前状态(例如当前线程的堆栈跟踪)来判断调用是来自您的应用程序还是来自SDK

 

Log access of data


若要使用AppOpsManager.AppOpsCollector的实例执行数据访问审核,请在要审核数据访问的组件中实现回调逻辑,例如在活动的onCreate()方法中。

在特定情况下,将调用onAsyncNoted()和onSelfNoted()方法:

    如果在应用程序的API调用期间未进行数据访问,则会调用onAsyncNoted()。最常见的示例是您的应用程序注册了侦听器,并且每次调用侦听器的回调时都会进行数据访问。传递给onAsyncNoted()的AsyncNotedOp参数包含一个名为getMessage()的方法。此方法提供有关数据访问的更多信息。对于位置回调,该消息包含侦听器的系统标识哈希。
    当应用将自己的UID传递到noteOp()时,在极少数情况下会调用onSelfNoted()。

 

Audit data access by feature


您的应用可能有几种主要用例,例如允许用户捕获照片并与他们的联系人共享这些照片。如果您开发了这样的多功能应用程序,则可以在私有数据审核中定义功能上下文。 FeatureId上下文在传递给对onNoted()的调用的对象中返回。这可以帮助您更轻松地将数据访问追溯到代码的逻辑部分。

要在您的应用程序中定义功能上下文,请完成以下各节中的步骤。

Create feature contexts
在访问数据的活动(例如,请求位置或访问用户的联系人列表的活动)的onCreate()方法中,调用createFeatureContext(),并传入功能的逻辑名称。

Include feature contexts in access logs
更新您的AppOpsManager.AppOpsCollector回调,以便您的应用程序日志包含您定义的功能的名称

注意:如果功能ID的返回值为null,则表示当前Context对象与您应用的默认功能相关联。