close

隨着信息化技術的普及,移動應用在迅速改變着人們的生活方式。作為數字生活的載體,智能設備的演進帶動了數據處理技術的不斷成熟,這使得應用對用戶信息的掌控日趨深入。與此同時,人們的隱私保護意識也越來越強,希望在享受移動應用帶來的無限便利之餘,也能保護自己的隱私不受侵犯。因此,人們會更青睞那些能從操作系統層面對用戶和數據提供保護的平台。

本文將向您介紹關於 Android 在隱私方面的變化和最佳實踐,幫助您主動為用戶提供優秀的隱私保護。同時我們還有幾個關於未來 Android 版本的概念構想與您分享。如果您更喜歡通過視頻了解本文內容,請點擊下方:

△ 主動為用戶提供全面的隱私保護


Bilibili 視頻鏈接https://www.bilibili.com/video/BV1g3411g7rC/


隱私保護三原則



△ 隱私保護的三個原則

我們在設計 Android 之初就充分考慮了對用戶隱私權的保護,並且在最近的版本中將這一理念進一步強化,進而在保護用戶信息安全方面取得了更加顯著的進步。我們一如既往地關心用戶的隱私權,這份執着背後是以下三個核心原則:
提升數據訪問透明度: 讓用戶知道應用在什麼時間訪問了哪些數據;
簡化用戶控制隱私訪問的方式: 讓用戶方便地控制應用能訪問更多或更少的用戶數據;
專注最小化數據訪問: 去除不必要的數據訪問,減少應用的權限範圍,避免應用泄露用戶的數據。

隱私保護最佳實踐




△ 集成隱私保護的三個最佳實踐

基於隱私保護三個核心原則,我們會持續為您提供各種各樣的工具和指導,幫助您在應用中高效地集成隱私保護功能。這裡要向您分享的是在移動應用開發中可以考慮的三個最佳實踐,您會了解如何提升隱私訪問的透明度,了解如何在尊重用戶選擇權的前提下提供隱私訪問的選項,以及了解如何通過最小化隱私訪問儘可能減少不必要用戶數據的獲取。

關注數據訪問




您需要考慮的第一個最佳實踐是要仔細斟酌應用對用戶數據的訪問。一方面是由於 Android 12 讓用戶更直觀地看到自己的隱私如何被訪問,另一方面則是出於您尊重用戶意願的考量。



應用訪問傳感器時的系統提示


△ Android 提升了應用訪問麥克風和攝像頭時的透明度

隨着 Android 的透明度越來越高,您也越來越需要關注自己的應用何時對用戶數據進行了訪問。Android 12 讓用戶更清楚地知曉應用何時訪問了麥克風和攝像頭。每當麥克風或攝像頭被訪問時,用戶可以通過從屏幕右上角下拉打開快捷設置,然後點擊對應的指示圖標來實時查看是哪些應用在訪問數據。如果用戶發現自己對此次訪問並不知情,可以很方便地跳轉到應用的權限設置界面並撤銷相關權限。所以需要您仔細審查應用中涉及麥克風、攝像頭訪問的代碼,移除那些意外的訪問操作。例如,您應該確保在用戶觸發需要訪問有關傳感器的功能前,應用不會去獲取這些設備的數據。



應用的隱私數據訪問記錄


我們常常收到用戶的反饋,他們希望了解應用究竟使用了哪些數據。對此我們做出了一些努力,全新的隱私信息中心讓用戶可以通過一個簡單清晰的時間線視圖來了解到過去 24 小時中,哪些應用訪問了設備的麥克風、攝像頭和地理位置數據。另外,用戶還可以查看到應用是否在過去 24 小時裡使用其他運行時權限訪問過相關數據。

△ 24 小時內的隱私訪問情況

建議您對應用中相關的代碼路徑進行仔細審查,確保對每一處隱私數據的訪問都能做合理的解釋說明。由於使用到的第三方 SDK 也會被當作您應用的一部分進行統計,所以需要為它們的隱私訪問提供正當的用例說明。



應用的數據使用說明


△Play 商店新增的數據安全信息

用戶非常關心您的應用是出於怎樣的原因訪問了隱私數據,所以當用戶在 Play 商店瀏覽應用時,會看到一個專門的數據安全條款,它為用戶提供了直觀易懂的應用數據使用的相關信息,從而幫助用戶在知情的前提下自主決定要安裝哪些應用。這樣一來,用戶會有更多的安全感,並且更能相信開發者們會負責任地使用用戶數據。關於如何在 Play 商店的數據安全條款提供恰當的說明,您可以查看視頻:為 Google Play 中的 "數據安全" 條款做好準備:

https://www.bilibili.com/video/BV1xv4y137dL/


應用讀取剪貼板時的通知


△應用讀取剪貼板時的通知消息

相信您一定有過這樣的經驗,好友向您發送了一條消息,比如用戶名和密碼,您常常會複製這些信息,然後粘貼到另一個應用中使用。在這個過程中,這些關鍵數據會被存放在剪貼板中,任何應用都可以讀取這些數據,產生了潛在的隱私泄露風險。

每當有應用從剪貼板讀取數據時,Android 都會通知用戶。每當應用調用 ClipboardManager#getPrimaryClip() 方法時,Android 會判斷寫入和讀取剪貼板數據的是不是同一個應用,當兩者來源不同時,系統會通過一個消息框來提示用戶;當兩者來自同一個應用時,則不會產生這樣的提示。所以我們建議您的應用首先調用 ClipboardManager#getPrimaryClipDescription() 方法來獲取剪貼板中數據的基本信息,並根據其類型判斷是否需要進一步讀取,從而最大限度減少對剪貼板數據的訪問。另外,我們還建議您不要隨意訪問剪貼板,如果有必要,也應該在用戶知情和許可的前提下進行。



為更加透明的隱私訪問做好準備


為了更好支持 Android 12 帶來的隱私透明特性,我們建議您仔細審查應用的代碼是否還存在意外的隱私訪問操作。您可以藉助審計 (auditing) API 來更好地發現潛在的隱私數據讀取操作以及第三方 SDK 對隱私數據的訪問。這個 API 可以在您的應用訪問敏感數據時調用一個應用內的回調函數,並向其提供所訪問的數據類型,這樣您就可以輕鬆地發現應用在何時、何種情況下讀取了隱私數據。

△添加數據訪問操作的回調函數

您也可以通過權限 intent API 來向用戶說明為什麼您的應用需要訪問地理位置、攝像頭和麥克風,從而幫助他們理解和判斷是否要給予這些權限。您通過此 API 提供的這些信息將會在隱私訪問信息面板及應用的權限管理界面中向用戶展示。

<!-- 添加一個 activity,它可以在啟動時向用戶說明為什麼您的應用會讀取某種類型的數據 --><!-- 如果您的應用要針對 Android 12 構建,還必須標註 android:exported 屬性 --><activity android:name="DataAccessRationaleActivity" android:permission="android.permission.START_VIEW_PERMISSION_USAGE" android:exported="true"><!-- VIEW_PERMISSION_USAGE 會在應用的權限管理界面顯示一個可勾選的圖標;VIEW_PERMISSION_USAGE_FOR_PERIOD 會在系統的隱私訪問面板顯示一個可勾選的圖標。--> <intent-filter> <action android:name="android.intent.action.VIEW_PERMISSION_USAGE"/> <action android:name="android.intent.action.VIEW_PERMISSION_USAGE_FOR_PERIOD"/> </intent-filter></activity>
△添加權限 intent

上面的代碼展示了您添加權限 intent 時需要進行的配置。這段代碼在您的應用中添加了一個 activity,它可以在啟動時告知用戶為什麼要訪問數據。您需要把 android:permission 屬性設置為 START_VIEW_PERMISSION_USAGE。如果您的應用是針對 Android 12 進行構建的,那麼還需要添加 android:exported="true" 屬性。接着添加一個 intent-filter 標籤,隨後根據您的需要,分別將 android.intent.action.VIEW_PERMISSION_USAGE (在應用的權限管理界面顯示) 和 android.intent.action.VIEW_PERMISSION_USAGE_FOR_PERIOD (在隱私訪問面板顯示) 添加到這個標籤里。這樣一來,用戶就可以在您的應用名稱旁看到一個與應用的 intent-filter 對應的圖標。如果需要詳細了解數據訪問審計 API 和權限 intent 的更多內容,請參閱:使用隱私信息中心提高用戶透明度。

綜上所述,在開發應用時,對於數據訪問需要注意以下幾點:

只有在必要時才訪問隱私數據。不必要的數據訪問不僅會讓用戶感到困惑,還會增加隱私泄露的風險;
注意引入第三方庫時添加的權限聲明。您可以通過合併 manifest 來查看引入的第三方庫聲明了哪些權限。別讓引入的 SDK 和第三方庫導致您應用被下架!這篇文章為您提供了更多的參考信息;
切勿過度訪問用戶數據。對用戶隱私數據的讀取如果超過了用戶使用的需要,就是對用戶知情權和控制權的侵犯。

尊重用戶選擇




我們要分享的第二個最佳實踐關乎着用戶的選擇。Android 用戶可以自行掌控哪些應用可以訪問他們的敏感數據,以及這些數據被應用訪問的程度。對於開發者來說,掌握好這個度非常重要。

研究表明,用戶對應用需要訪問數據的原因了解得越充分,那麼他們認可這些訪問的可能性就越大。您需要通過提供安全的默認參數來平衡用戶的掌控權和應用的訪問權限,所以您應該向用戶提供一些易於理解的選項,並尊重他們的意志。


更細緻的位置權限選項


△選擇大致位置能讓應用減少訪問用戶的位置信息

我們在 Android 12 中引入了粒度更細的位置權限選項,使得用戶可以自行決定是否只向應用提供粗略的位置信息。我們建議您仔細檢查應用中所有需要訪問位置信息的用例,如果精確的定位不是必須的,請改為申請 ACCESS_COARSE_LOCATION 權限。

無論何種情況下,您都應該具體地向用戶說明為什麼需要訪問位置信息,並且按照具體的精度需求逐漸向用戶申請更精確定位信息的訪問權限。同時,您需要考慮到用戶僅允許應用獲取粗略位置的情況,不能因為位置信息不精確就拒絕讓用戶繼續使用。

如下示例代碼包含了兩個功能,其中一個是只需要訪問大概位置,而另一個則是需要獲取精確定位。當用戶給予應用獲取大致位置的權限時,您需要通過 shouldShowRequestPermissionRationale API 來檢查是否需要向用戶顯示必要的權限申請說明。如果返回了 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_LOCATION 權限已獲授權。}

△處理請求的結果

當用戶以後用到需要獲取精確定位的功能時,您就可以通過向用戶顯示申請更精確位置信息的彈框來獲得 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 權限已獲授權。}
△處理請求的結果

全局權限開關


Android 12 中引入了這樣兩個開關,分別對應攝像頭和麥克風的全局訪問:

△麥克風和攝像頭的全局開關

這兩個開關允許用戶迅速切斷整台設備上所有應用對攝像頭或者麥克風的訪問。如果用戶在應用中使用了某個需要訪問攝像頭、麥克風的功能,那麼系統將會向用戶詢問是否需要立即開放傳感器的訪問。這組開關與直接拒絕訪問權限是不同的,因為獲取訪問權的整個過程是由系統來處理的,提醒用戶啟用設備也是由系統展示的,應用無需進行任何額外的操作。

此外值得一提的是,我們在這次更新中還增加了對運動傳感器採樣率的限制 (200Hz 以內)。


通知顯示權限


我們常常聽到用戶關於設備上通知過多的抱怨,所以我們在新版本中,要求應用需要向用戶申請通知顯示權限,只有當用戶希望或允許收到通知時,應用才可以向用戶發送通知。

△限制通知權限能降低通知消息的干擾

如果您的應用需要向用戶發送通知,請記得在清單文件中添加 POST_NOTIFICATIONS 權限的聲明。下面的代碼展示了如何申請通知的權限:

// 請求權限後向用戶發送通知requestPermissions( Context, arrayOf(Manifest.permission.POST_NOTIFICATIONS), REQUEST_CODE)
△請求通知權限
您可以通過 Notification.areNotificationsEnabled API 或者PermissionChecker 來檢查應用是否已經獲得了通知權限。申請通知權限的方法與申請其他權限相同,您不需要做額外的調整。

這裡給您補充了一些需要注意的事項:

在訪問數據前,讓用戶充分了解您讀取數據的原因;

做好用戶和系統拒絕權限時的操作,當用戶二次拒絕時,您應該尊重用戶的意願;

按需逐級獲取隱私數據,不要一次性申請所有權限;

當用戶拒絕或是撤銷某項權限時,您需要讓應用能無縫回退到無需權限即可運行的狀態。

最大程度減少權限使用




第三個最佳實踐是最大程度減少權限的使用。一方面您應當對用戶的意願和選擇保持尊重,另一方面您還可以使用 Android 的替代 API,在簡化敏感數據訪問的同時提供更好的隱私控制。以下幾個方案可以幫助您最大限度減少數據訪問。



使用新的附近設備訪問權限


可穿戴設備在最近幾年發展迅猛,大量的應用需要與這些設備進行交互。在以前,應用必須先申請位置訪問權限才能與配套設備進行藍牙連接。開發者們向我們反饋了這種不恰當的設計,尤其是當應用只需要獲取藍牙訪問權限而不需要獲得設備位置的時候。過度的權限申請也使得用戶對應用的行為正當性產生懷疑,這些反饋敦促着我們改進權限的對應關係。

△訪問附近設備的權限

構建目標為 API 30 及以前版本 Android 的應用,需要同時申請 BLUETOOTH_ADMIN 和 BLUETOOTH 權限,以及位置權限才能實現發現、配對和連接外部設備。比如下方的代碼是您的應用在較早設備上需要進行的權限聲明:

<!-- 在較早的設備上申請藍牙有關權限 --><uses-permission android:name="android.permission.BLUETOOTH"/><uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/><uses-permissionandroid:name="android.permission.ACCESS_COARSE_LOCATION"/>
△在較早的設備上申請藍牙有關權限

當您切換到構建 API 31 的應用時,可以在上述權限聲明的基礎上添加一個 maxSDKVersion 屬性:

<!-- 在較早的設備上申請藍牙有關權限 --><uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" /><uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" /><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" android:maxSdkVersion="30" /> <!-- 請求掃描附近藍牙設備的權限 --><uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" /><!-- 請求與已經配對的藍牙設備通信的權限 --><uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /><!-- 請求使用當前設備可供發現的權限 --><uses-permissionandroid:name="android.permission.BLUETOOTH_ADVERTISE"/>

△兼容新舊設備的前提下申請藍牙有關權限

隨後,您需要添加 BLUETOOTH_SCAN 權限聲明,並且使用 neverForLocation 標記來向系統說明您不會使用這個權限來推算設備的位置信息。同時您需要聲明 BLUETOOTH_CONNECT 權限來與藍牙設備交互、通過 BLUETOOTH_ADVERTISE 來將當前設備信息廣播給附近的藍牙設備。


為應用設置智能應用休眠功能

在 2020 年發布 Android 11時,我們同時推出了自動重置權限的功能,並且通過 Google Play 服務的更新將這項功能帶到了運行 Android 6 及以後版本系統的設備上。當某個應用有數月沒有被使用時,Android 會自動撤銷該應用的某些授權。從這項更新發布以後的情況分析,僅 14 天內已經有 850 萬應用的權限因長久未使用被撤銷了。所以建議您總是要先檢查權限是否還存在,避免因為系統撤銷權限而產生錯誤。

△Android 11 引入的權限自動重置功能

2021 年,在權限自動重置功能的基礎上,我們推出了智能應用休眠功能。Android 會自動將長期沒有使用的應用進行休眠,從而優化設備存儲、改善性能和提高安全性。系統不僅會撤銷用戶此前的授權,還會強制停止應用,收回內存、存儲空間及其他臨時資源。

當應用進入休眠後,系統會阻止應用在後台運行任務,或者接收推送通知。而結束應用休眠的方式也非常簡單,用戶只需要啟動應用即可。與權限自動重置類似,應用進入休眠時,用戶會收到相應的通知,同時用戶也可以在設置中選擇關閉休眠。


用好分區存儲策略


Android 10 的發布首次引入了分區存儲機制,它為隱私保護提供了一種新的存儲方案。隨着後續幾個版本的迭代更新,其他應用不再能訪問某個應用的外部目錄了。您也可以在不請求任何權限的基礎上添加和編輯本應用的文件,或是在用戶知情同意的前提下編輯第三方應用產生的文件。而如果您將文件添加到共享存儲目錄中,則無需任何權限申請操作。

使用照片選擇器

未來我們會發布一個照片選擇器 (Photo Picker),它可以無需任何請求即可讀取用戶選擇的照片或視頻。您可以在其中選擇設備本地存儲的照片或視頻,也可以訪問到來自 Google Photos 等雲提供商的照片或視頻。這個新的選擇器會替換以前申請權限的訪問方式,簡化應用的權限聲明。


照片選擇器 (Photo Picker)
https://developer.android.google.cn/about/versions/13/features/photopicker

通過 Google Play 系統更新,Android 11 及以後的設備都可以使用這個新的照片選擇器。下面是一個使用這款新照片選擇器的例子:

// 要發送的 intentval intent = Intent(MediaStore.ACTION_PICK_IMAGES).apply { putExtra(MediaStore.EXTRA_PICK_IMAGES_MAX, 15) putExtra(Intent.EXTRA_MIME_TYPES, arrayOf("image/*", "video/*"))} // 處理返回的 intentoverride fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { // 遍歷所有的 URI 結果 for (i in 0 until data.clipData.itemCount) { val uri = data.clipData.getItemAt(i).uri val inputStream = contentResolver.openInputStream(uri) }}
△獲取照片選擇器的 intent

如果您需要在應用中喚起這個選擇器,需要啟動 ACTION_PICK_IMAGES Intent,然後指定可選取媒體的最大數量和支持的文件類型。當用戶選中文件後,可以通過 clipData 屬性讀取各個文件的 URI,然後使用ContentResolver 來讀取文件內容。為了能夠兼容更早前的設備,我們還計劃發布一個支持庫,讓應用在支持時使用新的照片選擇器,不支持時使用存儲訪問框架簡化對文件元數據、內容的讀取。
存儲訪問框架
https://developer.android.google.cn/guide/topics/providers/document-provider

新的存儲權限劃分策略

此外,我們還在努力通過新的存儲空間功能為用戶帶來更清晰、為開發者帶來更精準的存儲權限劃分粒度。比如在下個版本中引入的 READ_IMAGES 權限允許您讀取共享存儲空間上的所有圖片和視頻文件,而 READ_AUDIO 可用於讀取所有的音頻文件 (包括 .m3u 播放列表)。

藉助分區存儲,您應用訪問自己分區內的文件時不需要申請訪問權限;位於共享存儲空間的非媒體文件仍然可以通過存儲訪問框架獲得。如果要在您的 manifest 中包括這些變化,您可以參照這個例子:
<!-- 在 API 31 和更早的設備上請求權限 --><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="31"/> <!-- 請求圖片和視頻訪問權限 --><uses-permission android:name="android.permission.READ_IMAGES"/><!-- 請求音頻訪問權限 --><uses-permission android:name="android.permission.READ_AUDIO"/> <!-- 請求所有共享文件訪問權限(僅用於受允許的用例) --><uses-permissionandroid:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
△聲明使用新的權限

請注意,MANAGE_EXTERNAL_STORAGE 權限可以用於那些核心功能就是要與大量的文件進行交互的應用。但此權限受限於 Google Play 關於使用 "所有文件訪問權限" 的政策。關於此權限的使用,請參閱管理存儲設備上的所有文件:

https://developer.android.google.cn/training/data-storage/manage-all-files

以上這些建議概括如下幾點:

儘可能減少位置數據訪問,並且儘量只在應用處於前台時訪問粗略的位置信息;
使用新的藍牙權限來更好地提供隱私保護;
儘可能通過新的照片選擇器來避免請求共享存儲空間。

開發者可降級權限


一些應用可能不再需要某些之前由用戶授予過的權限,這些權限曾用於開啟某項特定功能或保留舊的 Android 版本中的敏感權限。在 Android 13 中,我們提供了新的 API,讓您的應用通過降級以前被授予的運行時權限來保護用戶隱私。

感謝您的閱讀,希望我們可以共同構建一個能夠讓用戶安心使用的操作系統和應用生態。

您可以通過下方二維碼或在文章底部私信,向我們提交反饋,分享您喜歡的內容、發現的問題。您的反饋對我們非常重要,感謝您的支持!



推薦閱讀



如頁面未加載,請刷新重試

點擊屏末|閱讀原文|即刻了解使用 "存儲訪問框" 打開文件更多相關內容

對方塊的大小和顏色同時進行

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 鑽石舞台 的頭像
    鑽石舞台

    鑽石舞台

    鑽石舞台 發表在 痞客邦 留言(0) 人氣()