△ 主動為用戶提供全面的隱私保護
Bilibili 視頻鏈接https://www.bilibili.com/video/BV1g3411g7rC/

隱私保護三原則
△ 隱私保護的三個原則

隱私保護最佳實踐

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

關注數據訪問
您需要考慮的第一個最佳實踐是要仔細斟酌應用對用戶數據的訪問。一方面是由於 Android 12 讓用戶更直觀地看到自己的隱私如何被訪問,另一方面則是出於您尊重用戶意願的考量。
應用訪問傳感器時的系統提示
隨着 Android 的透明度越來越高,您也越來越需要關注自己的應用何時對用戶數據進行了訪問。Android 12 讓用戶更清楚地知曉應用何時訪問了麥克風和攝像頭。每當麥克風或攝像頭被訪問時,用戶可以通過從屏幕右上角下拉打開快捷設置,然後點擊對應的指示圖標來實時查看是哪些應用在訪問數據。如果用戶發現自己對此次訪問並不知情,可以很方便地跳轉到應用的權限設置界面並撤銷相關權限。所以需要您仔細審查應用中涉及麥克風、攝像頭訪問的代碼,移除那些意外的訪問操作。例如,您應該確保在用戶觸發需要訪問有關傳感器的功能前,應用不會去獲取這些設備的數據。
應用的隱私數據訪問記錄
我們常常收到用戶的反饋,他們希望了解應用究竟使用了哪些數據。對此我們做出了一些努力,全新的隱私信息中心讓用戶可以通過一個簡單清晰的時間線視圖來了解到過去 24 小時中,哪些應用訪問了設備的麥克風、攝像頭和地理位置數據。另外,用戶還可以查看到應用是否在過去 24 小時裡使用其他運行時權限訪問過相關數據。

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

用戶非常關心您的應用是出於怎樣的原因訪問了隱私數據,所以當用戶在 Play 商店瀏覽應用時,會看到一個專門的數據安全條款,它為用戶提供了直觀易懂的應用數據使用的相關信息,從而幫助用戶在知情的前提下自主決定要安裝哪些應用。這樣一來,用戶會有更多的安全感,並且更能相信開發者們會負責任地使用用戶數據。關於如何在 Play 商店的數據安全條款提供恰當的說明,您可以查看視頻:為 Google Play 中的 "數據安全" 條款做好準備:
應用讀取剪貼板時的通知
相信您一定有過這樣的經驗,好友向您發送了一條消息,比如用戶名和密碼,您常常會複製這些信息,然後粘貼到另一個應用中使用。在這個過程中,這些關鍵數據會被存放在剪貼板中,任何應用都可以讀取這些數據,產生了潛在的隱私泄露風險。
每當有應用從剪貼板讀取數據時,Android 都會通知用戶。每當應用調用 ClipboardManager#getPrimaryClip() 方法時,Android 會判斷寫入和讀取剪貼板數據的是不是同一個應用,當兩者來源不同時,系統會通過一個消息框來提示用戶;當兩者來自同一個應用時,則不會產生這樣的提示。所以我們建議您的應用首先調用 ClipboardManager#getPrimaryClipDescription() 方法來獲取剪貼板中數據的基本信息,並根據其類型判斷是否需要進一步讀取,從而最大限度減少對剪貼板數據的訪問。另外,我們還建議您不要隨意訪問剪貼板,如果有必要,也應該在用戶知情和許可的前提下進行。
為更加透明的隱私訪問做好準備
為了更好支持 Android 12 帶來的隱私透明特性,我們建議您仔細審查應用的代碼是否還存在意外的隱私訪問操作。您可以藉助審計 (auditing) API 來更好地發現潛在的隱私數據讀取操作以及第三方 SDK 對隱私數據的訪問。這個 API 可以在您的應用訪問敏感數據時調用一個應用內的回調函數,並向其提供所訪問的數據類型,這樣您就可以輕鬆地發現應用在何時、何種情況下讀取了隱私數據。

您也可以通過權限 intent API 來向用戶說明為什麼您的應用需要訪問地理位置、攝像頭和麥克風,從而幫助他們理解和判斷是否要給予這些權限。您通過此 API 提供的這些信息將會在隱私訪問信息面板及應用的權限管理界面中向用戶展示。
上面的代碼展示了您添加權限 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 的更多內容,請參閱:使用隱私信息中心提高用戶透明度。
綜上所述,在開發應用時,對於數據訪問需要注意以下幾點:

尊重用戶選擇
我們要分享的第二個最佳實踐關乎着用戶的選擇。Android 用戶可以自行掌控哪些應用可以訪問他們的敏感數據,以及這些數據被應用訪問的程度。對於開發者來說,掌握好這個度非常重要。
研究表明,用戶對應用需要訪問數據的原因了解得越充分,那麼他們認可這些訪問的可能性就越大。您需要通過提供安全的默認參數來平衡用戶的掌控權和應用的訪問權限,所以您應該向用戶提供一些易於理解的選項,並尊重他們的意志。
更細緻的位置權限選項

△選擇大致位置能讓應用減少訪問用戶的位置信息
我們在 Android 12 中引入了粒度更細的位置權限選項,使得用戶可以自行決定是否只向應用提供粗略的位置信息。我們建議您仔細檢查應用中所有需要訪問位置信息的用例,如果精確的定位不是必須的,請改為申請 ACCESS_COARSE_LOCATION 權限。
無論何種情況下,您都應該具體地向用戶說明為什麼需要訪問位置信息,並且按照具體的精度需求逐漸向用戶申請更精確定位信息的訪問權限。同時,您需要考慮到用戶僅允許應用獲取粗略位置的情況,不能因為位置信息不精確就拒絕讓用戶繼續使用。
如下示例代碼包含了兩個功能,其中一個是只需要訪問大概位置,而另一個則是需要獲取精確定位。當用戶給予應用獲取大致位置的權限時,您需要通過 shouldShowRequestPermissionRationale API 來檢查是否需要向用戶顯示必要的權限申請說明。如果返回了 true,則需要展示您的說明,同時顯示申請大致位置的彈框 (請求 ACCESS_COARSE_LOCATION 權限)。
△請求 ACCESS_COARSE_LOCATION 權限
△處理請求的結果
當用戶以後用到需要獲取精確定位的功能時,您就可以通過向用戶顯示申請更精確位置信息的彈框來獲得 ACCESS_FINE_LOCATION 權限了。您同樣需要確保用戶了解您的位置用例後再發起請求。
△請求 ACCESS_FINE_LOCATION 權限
全局權限開關
Android 12 中引入了這樣兩個開關,分別對應攝像頭和麥克風的全局訪問:

這兩個開關允許用戶迅速切斷整台設備上所有應用對攝像頭或者麥克風的訪問。如果用戶在應用中使用了某個需要訪問攝像頭、麥克風的功能,那麼系統將會向用戶詢問是否需要立即開放傳感器的訪問。這組開關與直接拒絕訪問權限是不同的,因為獲取訪問權的整個過程是由系統來處理的,提醒用戶啟用設備也是由系統展示的,應用無需進行任何額外的操作。
此外值得一提的是,我們在這次更新中還增加了對運動傳感器採樣率的限制 (200Hz 以內)。
通知顯示權限
我們常常聽到用戶關於設備上通知過多的抱怨,所以我們在新版本中,要求應用需要向用戶申請通知顯示權限,只有當用戶希望或允許收到通知時,應用才可以向用戶發送通知。

如果您的應用需要向用戶發送通知,請記得在清單文件中添加 POST_NOTIFICATIONS 權限的聲明。下面的代碼展示了如何申請通知的權限:
在訪問數據前,讓用戶充分了解您讀取數據的原因;
做好用戶和系統拒絕權限時的操作,當用戶二次拒絕時,您應該尊重用戶的意願;
按需逐級獲取隱私數據,不要一次性申請所有權限;
當用戶拒絕或是撤銷某項權限時,您需要讓應用能無縫回退到無需權限即可運行的狀態。

最大程度減少權限使用
第三個最佳實踐是最大程度減少權限的使用。一方面您應當對用戶的意願和選擇保持尊重,另一方面您還可以使用 Android 的替代 API,在簡化敏感數據訪問的同時提供更好的隱私控制。以下幾個方案可以幫助您最大限度減少數據訪問。
使用新的附近設備訪問權限
可穿戴設備在最近幾年發展迅猛,大量的應用需要與這些設備進行交互。在以前,應用必須先申請位置訪問權限才能與配套設備進行藍牙連接。開發者們向我們反饋了這種不恰當的設計,尤其是當應用只需要獲取藍牙訪問權限而不需要獲得設備位置的時候。過度的權限申請也使得用戶對應用的行為正當性產生懷疑,這些反饋敦促着我們改進權限的對應關係。

構建目標為 API 30 及以前版本 Android 的應用,需要同時申請 BLUETOOTH_ADMIN 和 BLUETOOTH 權限,以及位置權限才能實現發現、配對和連接外部設備。比如下方的代碼是您的應用在較早設備上需要進行的權限聲明:
當您切換到構建 API 31 的應用時,可以在上述權限聲明的基礎上添加一個 maxSDKVersion 屬性:
△兼容新舊設備的前提下申請藍牙有關權限
隨後,您需要添加 BLUETOOTH_SCAN 權限聲明,並且使用 neverForLocation 標記來向系統說明您不會使用這個權限來推算設備的位置信息。同時您需要聲明 BLUETOOTH_CONNECT 權限來與藍牙設備交互、通過 BLUETOOTH_ADVERTISE 來將當前設備信息廣播給附近的藍牙設備。
為應用設置智能應用休眠功能
△Android 11 引入的權限自動重置功能
2021 年,在權限自動重置功能的基礎上,我們推出了智能應用休眠功能。Android 會自動將長期沒有使用的應用進行休眠,從而優化設備存儲、改善性能和提高安全性。系統不僅會撤銷用戶此前的授權,還會強制停止應用,收回內存、存儲空間及其他臨時資源。
當應用進入休眠後,系統會阻止應用在後台運行任務,或者接收推送通知。而結束應用休眠的方式也非常簡單,用戶只需要啟動應用即可。與權限自動重置類似,應用進入休眠時,用戶會收到相應的通知,同時用戶也可以在設置中選擇關閉休眠。
用好分區存儲策略
Android 10 的發布首次引入了分區存儲機制,它為隱私保護提供了一種新的存儲方案。隨着後續幾個版本的迭代更新,其他應用不再能訪問某個應用的外部目錄了。您也可以在不請求任何權限的基礎上添加和編輯本應用的文件,或是在用戶知情同意的前提下編輯第三方應用產生的文件。而如果您將文件添加到共享存儲目錄中,則無需任何權限申請操作。
未來我們會發布一個照片選擇器 (Photo Picker),它可以無需任何請求即可讀取用戶選擇的照片或視頻。您可以在其中選擇設備本地存儲的照片或視頻,也可以訪問到來自 Google Photos 等雲提供商的照片或視頻。這個新的選擇器會替換以前申請權限的訪問方式,簡化應用的權限聲明。
通過 Google Play 系統更新,Android 11 及以後的設備都可以使用這個新的照片選擇器。下面是一個使用這款新照片選擇器的例子:
新的存儲權限劃分策略
請注意,MANAGE_EXTERNAL_STORAGE 權限可以用於那些核心功能就是要與大量的文件進行交互的應用。但此權限受限於 Google Play 關於使用 "所有文件訪問權限" 的政策。關於此權限的使用,請參閱管理存儲設備上的所有文件:
以上這些建議概括如下幾點:
開發者可降級權限
一些應用可能不再需要某些之前由用戶授予過的權限,這些權限曾用於開啟某項特定功能或保留舊的 Android 版本中的敏感權限。在 Android 13 中,我們提供了新的 API,讓您的應用通過降級以前被授予的運行時權限來保護用戶隱私。
您可以通過下方二維碼或在文章底部私信,向我們提交反饋,分享您喜歡的內容、發現的問題。您的反饋對我們非常重要,感謝您的支持!

推薦閱讀

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