随着信息技术的普及,移动应用正迅速改变着人们的生活方式。作为数字生活的载体,智能设备的演进带动了数据处理技术的不断成熟,使得应用对用户信息的掌控更加深入。与此同时,人们的隐私保护意识也越来越强,希望在享受移动应用带来的无限便利的同时保护自己的隐私不被侵犯。因此,人们会更喜欢能够从操作系统层面保护用户和数据的平台。本文将为您介绍Android隐私的变化和最佳实践,帮助您主动为用户提供出色的隐私保护。我们还有一些关于未来Android版本的概念想法要与您分享。隐私保护三原则△隐私保护三原则我们在Android设计之初就充分考虑了对用户隐私权的保护,并在最新版本中进一步强化了这一理念,在保护用户信息安全方面取得了很大的成绩。更显着的进步。我们一如既往地关心用户的隐私。这种奉献的背后是以下三个核心原则:提高数据访问透明度:让用户知道应用程序在什么时间访问了哪些数据;简化用户控制隐私访问的方式:让用户方便地控制应用程序可以访问更多或更少的用户数据;专注于最小化数据访问:去除不必要的数据访问,减少应用程序权限范围,防止应用程序泄露用户数据。隐私保护最佳实践△集成隐私保护的三大最佳实践基于隐私保护的三大核心原则,我们将持续为您提供各种工具和指导,帮助您在您的应用中高效集成隐私保护功能。我想在这里与大家分享的是移动应用程序开发中可以考虑的三个最佳实践。您将学习如何提高隐私访问的透明度,如何在尊重用户选择的同时提供隐私访问的选项,以及如何通过最小化隐私访问来减少不必要的用户数据的获取。关注数据访问您需要考虑的第一个最佳实践是仔细考虑您的应用程序对用户数据的访问。一方面是因为Android12让用户更直观的看到自己的隐私是如何被访问的,另一方面也是因为你们有尊重用户意愿的考虑。应用访问传感器时系统提示△Android提高应用访问麦克风和摄像头时的透明度随着Android变得越来越透明,你也越来越需要注意你的应用何时访问用户数据。Android12让用户更容易知道应用程序何时访问了麦克风和摄像头。每当访问麦克风或摄像头时,用户可以从屏幕右上角下拉打开快捷方式设置,然后点击相应的指示图标即可实时查看哪些应用正在访问数据。如果用户发现自己并不知道此次访问,可以轻松跳转到应用的权限设置界面,撤销相关权限。因此,您需要仔细审查应用程序中涉及麦克风和摄像头访问的代码,并去除那些非预期的访问操作。例如,您应该确保您的应用程序不会从这些设备获取数据,直到用户触发需要访问传感器的功能。应用程序隐私数据访问记录我们经常收到用户的反馈,他们想知道应用程序使用了哪些数据。我们为此做出了一些努力,新的隐私仪表板让用户可以通过简单明了的时间轴视图了解过去24小时内哪些应用访问了设备的麦克风、摄像头和地理位置数据。此外,用户可以使用其他运行时权限查看该应用在过去24小时内是否访问过数据。△24小时内的隐私访问建议您仔细审查应用中的相关代码路径,确保每一次访问隐私数据都能得到合理解释。由于使用的第三方SDK也算作您应用的一部分,因此需要提供其隐私访问的合法用例。应用数据使用说明△Play商店新增数据安全信息用户很关心你的应用为什么会访问隐私数据,所以用户在Play商店浏览应用时,会看到专门的数据安全条款,为用户提供直观、有关应用程序数据使用情况的易于理解的信息,从而帮助用户就安装哪些应用程序做出明智的决定。通过这种方式,用户会感到更安全,也更有信心开发人员会负责任地使用用户数据。App读取剪贴板时的通知△App读取剪贴板时的Notificationmessage相信你一定有过这样的体验。朋友给你发了一条消息,比如用户名和密码,你经常复制这些信息并粘贴到另一个应用程序中使用。在此过程中,这些关键数据将被存储在剪贴板中,任何应用程序都可以读取这些数据,从而存在隐私泄露的潜在风险。每当应用程序从剪贴板读取数据时,Android都会通知用户。每当应用程序调用ClipboardManager#getPrimaryClip()方法时,Android将判断是否是同一个应用程序写入和读取剪贴板数据。当两个来源不同时,系统会通过消息框提示用户;当两者都来自同一个应用时,不会产生这样的提示。因此,我们建议您的应用首先调用ClipboardManager#getPrimaryClipDescription()方法获取剪贴板数据的基本信息,并根据其类型判断是否需要进一步读取,尽量减少对剪贴板数据的访问.此外,我们还建议您不要随意访问剪贴板,如有必要,应在用户知情和允许的情况下进行。为更透明的隐私访问做准备为了更好地支持Android12带来的隐私透明特性,我们建议您仔细检查您的应用程序的代码以防止意外的隐私访问操作。您可以使用审计API更好地检测潜在的私有数据读取操作和第三方SDK对私有数据的访问。该API可以在您的应用访问敏感数据时调用应用内回调函数,并提供访问的数据类型,方便您发现您的应用何时以及在何种情况下读取隐私数据。△增加数据访问操作的回调函数。你也可以通过权限意图API向用户解释为什么你的应用需要访问地理位置、摄像头和麦克风,帮助用户理解和判断是否授予这些权限。您通过本API提供的信息将在应用的隐私访问信息面板和权限管理界面向用户展示。△添加权限intent上面的代码就是添加权限intent时需要做的配置。此代码向您的应用程序添加一个活动,该活动在启动时会告诉用户访问数据的原因。您需要将android:permission属性设置为START_VIEW_PERMISSION_USAGE。如果您的应用是为Android12构建的,您还需要添加android:exported="true"属性。然后添加一个intent-filter标签,然后根据自己的需要,给这个添加android.intent.action.VIEW_PERMISSION_USAGE(显示在应用的权限管理界面)和android.intent.action.VIEW_PERMISSION_USAGE_FOR_PERIOD(显示在隐私访问面板)在选项卡中。这将允许用户在您的应用程序名称旁边看到一个图标,该图标对应于您应用程序的intent-filter。如果您需要了解更多有关数据访问审计API和权限意图的信息。综上所述,在开发应用程序时,数据访问需要注意以下几点:只在必要时访问私有数据。不必要的数据访问不仅会混淆用户,还会增加隐私泄露的风险;注意引入第三方库时添加的权限声明。可以通过manifest合并查看导入的第三方库声明了哪些权限。不要让导入的SDK和第三方库导致您的应用被下架!这篇文章为您提供了更多信息;不要过度访问用户数据。如果超出用户的需求读取用户隐私数据,则属于侵犯用户的知情权和控制权。尊重用户选择我们将分享的第二个最佳实践是关于用户选择的。Android用户可以控制哪些应用程序可以访问他们的敏感数据,以及应用程序访问这些数据的程度。对于开发者来说,掌握这个学位是非常重要的。研究表明,用户越了解应用程序需要访问数据的原因,他们就越有可能批准该访问。您需要通过提供安全的默认参数来平衡用户控制和应用程序访问,因此您应该为用户提供一些易于理解并尊重他们意愿的选项。更细化的位置权限选项△选择粗略位置可以让应用减少对用户位置信息的访问我们在Android12中引入了更细化的位置权限选项,允许用户决定是否只向应用提供粗略位置信息。我们建议您在应用程序中仔细查看需要访问位置信息的所有用例。如果不需要精确定位,请改为申请ACCESS_COARSE_LOCATION权限。在任何情况下,您都应具体向用户说明为何需要获取位置信息,并根据具体的准确性要求逐步向用户申请获取更精确的位置信息。同时,你需要考虑到用户只允许应用获取一个大概的位置,不能因为位置信息不准确而拒绝让用户继续使用应用。下面的示例代码包含两个函数,一个只需要获取大概位置,另一个需要获取精确位置。当用户授予app获取大概位置的权限时,需要检查是否需要通过shouldShowRequestPermissionRationaleAPI向用户展示必要的权限请求说明。如果它返回true,则需要显示您的描述并显示应用程序大致位置的弹出框(请求ACCESS_COARSE_LOCATION权限)。//申请ACCESS_COARSE_LOCATION权限requestPermissions(Context,arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION),REQUEST_CODE)△申请ACCESS_COARSE_LOCATION权限if(grantResults[1]==PackageManager.PERMISSION_GRANTED){//ACCESS_COARSE_LOCA权限已授权。}△请求处理结果当用户以后使用需要获取精确位置的功能时,可以通过向用户展示一个弹框来获取ACCESS_FINE_LOCATION权限,申请更精确的位置信息。您还需要确保用户在发出请求之前了解您的位置用例。//申请ACCESS_FINE_LOCATION权限requestPermissions(Context,arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),REQUEST_CODE)△申请ACCESS_FINE_LOCATION权限if(grantResults[0]==PackageManager.PERMISSION_GRANTED){//ACCESS_FINE_LOCATION权限已授权。}△请求处理结果。全局权限开关Android12引入了两个这样的开关,分别对应摄像头和麦克风的全局访问权限:Cameraormicrophoneaccess。如果用户在应用中使用了需要访问摄像头和麦克风的功能,系统会立即询问用户是否开启对传感器的访问。这组开关不同于直接拒绝访问权限,因为获取访问权限的整个过程都是由系统处理的,提醒用户启用设备也是由系统显示的,app不需要执行任何操作额外的操作。另外值得一提的是,我们在本次更新中还对运动传感器采样率(200Hz以内)进行了限制。通知显示权限我们经常听到用户抱怨设备上的通知太多,所以在新版本中,应用需要向用户申请通知显示权限。只有当用户想要或允许通知时,应用程序才能向用户发送通知。△限制通知权限可以减少通知消息的干扰。如果您的应用程序需要向用户发送通知,请记得在清单文件中添加POST_NOTIFICATIONS权限的声明。以下代码展示了如何申请通知权限://申请权限后向用户发送通知requestPermissions(Context,arrayOf(Manifest.permission.POST_NOTIFICATIONS),REQUEST_CODE)△申请通知权限可以通过Notification.areNotificationsEnabledAPI或PermissionChecker查看申请情况是否已获得通知权限。申请通知权限的方法与申请其他权限相同,无需额外调整。这里有几点需要注意:在访问数据之前,让用户充分理解你读取数据的原因;做好用户和系统拒绝权限时的工作,当用户第二次拒绝时,应尊重用户的权限意愿;按需逐级获取隐私数据,不要一次性申请所有权限;当用户拒绝或撤销某个权限时,你需要让应用无缝回退到无需权限即可运行的状态。?最小化权限的使用第三个最佳实践是最小化权限的使用。虽然您应该尊重用户的意愿和选择,但您也可以使用Android的替代API来提供更好的隐私控制,同时简化对敏感数据的访问。以下是一些可以帮助您最大限度地减少数据访问的场景。使用新的附近设备访问可穿戴设备在过去几年中发展迅速,大量应用程序需要与这些设备进行交互。以前,应用程序必须先请求位置访问权限,然后才能与配套设备建立蓝牙连接。开发人员已向我们报告了这种不当设计,尤其是当应用程序只需要获取蓝牙访问权限而不需要设备位置时。过高的权限应用也会让用户怀疑应用行为的合法性。这些反馈促使我们完善权限之间的对应关系。△访问附近设备的权限构建一个针对API30及更早Android版本的应用,需要申请BLUETOOTH_ADMIN和BLUETOOTH权限,以及location权限,实现发现、配对、连接外部设备。例如,下面的代码是您的应用程序需要在早期设备上进行的权限声明:△当你在较早的设备上申请蓝牙相关权限时切换到构建API31应用,可以在上述权限声明的基础上增加一个maxSDKVersion属性:△在兼容新旧设备的前提下申请蓝牙相关权限。然后,你需要添加BLUETOOTH_SCAN权限声明,并使用neverForLocation标签来向系统说明你不会使用这个权限来计算设备的位置信息。同时需要声明与蓝牙设备交互的BLUETOOTH_CONNECT权限,通过BLUETOOTH_ADVERTISE向附近的蓝牙设备广播当前设备信息。为应用设置智能应用休眠当我们在2020年发布Android11时,我们引入了自动重置权限的功能,并且通过对GooglePlay服务的更新,我们将此功能带到了运行Android6及更高版本的设备上。当某个应用程序几个月未被使用时,Android会自动撤销某些授权。从本次更新发布后的情况分析,短短14天内,已有850万个应用因长期不活跃而被撤销权限。因此,建议您始终先检查权限是否还存在,避免系统撤销权限导致的错误。△Android11引入的权限自动重置功能2021年,基于权限自动重置功能,我们推出了智能应用休眠功能。Android会自动休眠您长时间未使用的应用程序,以优化设备存储、提高性能并提高安全性。系统不仅会撤销用户之前的授权,还会强行停止应用,回收内存、存储空间等临时资源。当应用程序进入休眠状态时,系统会阻止应用程序在后台运行任务或接收推送通知。结束应用休眠的方式也很简单,用户只需要启动应用即可。与权限自动重置类似,当应用进入休眠时,用户会收到相应的通知,用户也可以在设置中选择关闭休眠。用好分区存储策略Android10的发布首次引入了分区存储机制,为隐私保护提供了全新的存储解决方案。随着后续几个版本的迭代更新,其他应用已经无法访问一个应用的外部目录。您也可以在不请求任何许可的情况下添加和编辑本应用程序的文件,或在用户知情同意的情况下编辑第三方应用程序生成的文件。但是,如果您将文件添加到共享存储目录,则无需申请权限。使用图片选择器未来我们会发布一个图片选择器(PhotoPicker),它可以读取用户选择的照片或视频,无需任何请求。您可以在此处选择本地存储在设备上的照片或视频,也可以访问来自Google相册等云提供商的照片或视频。这个新的选择器将取代之前申请权限的访问方式,简化应用的权限声明。这个新的照片选择器可通过GooglePlay系统更新在Android11及更高版本的设备上使用。这是使用这个新照片选择器的示例://intentvaltosendintent=Intent(MediaStore.ACTION_PICK_IMAGES).apply{putExtra(MediaStore.EXTRA_PICK_IMAGES_MAX,15)putExtra(Intent.EXTRA_MIME_TYPES,arrayOf("image/*","video/*"))}//处理返回的intentoverridefunonActivityResult(requestCode:Int,resultCode:Int,data:Intent){//遍历所有URI结果for(iin0untildata.clipData.itemCount){valuri=data.clipData.getItemAt(i).urivalinputStream=contentResolver.openInputStream(uri)}}△获取图片选择器的intent如果需要在应用中调用选择器,需要启动ACTION_PICK_IMAGESIntent,然后指定你可以选择媒体的最大数量和支持的文件类型。当用户选择一个文件时,可以通过clipData属性读取每个文件的URI,然后使用ContentResolver读取文件的内容。为了与早期设备兼容,我们还计划发布一个支持库,让应用程序在支持时使用新的照片选择器,在不支持时使用存储访问框架来简化读取文件元数据和内容。新的存储权限划分策略此外,我们还在努力通过新的存储空间功能为用户和开发者带来更清晰的存储权限划分粒度。例如,下个版本引入的READ_IMAGES权限可以让你读取共享存储空间上的所有图片和视频文件,READ_AUDIO可以用来读取所有音频文件(包括.m3u播放列表)。使用分区存储,您的应用在访问属于自己分区的文件时无需申请访问权限;位于共享存储空间的非媒体文件仍然可以通过存储访问框架获取。如果你想在你的清单中包含这些更改,你可以按照这个例子:△声明使用新权限请注意,MANAGE_EXTERNAL_STORAGE权限可用于核心功能是与大量文件进行交互的应用程序。但是,此权限受GooglePlay关于使用“所有文件访问权限”的政策的约束。该权限的使用请参考管理存储设备上的所有文件:https://developer.android.google.cn/training/data-storage/manage-all-files以上建议总结如下:最小化位置数据访问,尽量只在应用处于前台时访问粗略的位置信息;使用新的蓝牙权限提供更好的隐私保护;新的照片选择器,以避免尽可能请求共享存储空间。开发人员可以降级权限某些应用程序可能不再需要用户先前授予的某些权限来启用特定功能或保留旧Android版本的敏感权限。在Android13中,我们提供了新的API,允许您的应用通过降级之前授予的运行时权限来保护用户隐私。感谢您的阅读,希望我们能够携手共建一个让用户安心使用的操作系统和应用生态。