保護 Android 用戶隱私,從這些事做起
隨著信息化技術(shù)的普及,移動應(yīng)用在迅速改變著人們的生活方式。作為數(shù)字生活的載體,智能設(shè)備的演進帶動了數(shù)據(jù)處理技術(shù)的不斷成熟,這使得應(yīng)用對用戶信息的掌控日趨深入。與此同時,人們的隱私保護意識也越來越強,希望在享受移動應(yīng)用帶來的無限便利之余,也能保護自己的隱私不受侵犯。因此,人們會更青睞那些能從操作系統(tǒng)層面對用戶和數(shù)據(jù)提供保護的平臺。本文將向您介紹關(guān)于 Android 在隱私方面的變化和最佳實踐,幫助您主動為用戶提供優(yōu)秀的隱私保護。同時我們還有幾個關(guān)于未來 Android 版本的概念構(gòu)想與您分享。
隱私保護三原則
△ 隱私保護的三個原則
我們在設(shè)計 Android 之初就充分考慮了對用戶隱私權(quán)的保護,并且在最近的版本中將這一理念進一步強化,進而在保護用戶信息安全方面取得了更加顯著的進步。我們一如既往地關(guān)心用戶的隱私權(quán),這份執(zhí)著背后是以下三個核心原則:
- 提升數(shù)據(jù)訪問透明度: 讓用戶知道應(yīng)用在什么時間訪問了哪些數(shù)據(jù);
- 簡化用戶控制隱私訪問的方式: 讓用戶方便地控制應(yīng)用能訪問更多或更少的用戶數(shù)據(jù);
- 專注最小化數(shù)據(jù)訪問: 去除不必要的數(shù)據(jù)訪問,減少應(yīng)用的權(quán)限范圍,避免應(yīng)用泄露用戶的數(shù)據(jù)。
隱私保護最佳實踐
△ 集成隱私保護的三個最佳實踐
基于隱私保護三個核心原則,我們會持續(xù)為您提供各種各樣的工具和指導(dǎo),幫助您在應(yīng)用中高效地集成隱私保護功能。這里要向您分享的是在移動應(yīng)用開發(fā)中可以考慮的三個最佳實踐,您會了解如何提升隱私訪問的透明度,了解如何在尊重用戶選擇權(quán)的前提下提供隱私訪問的選項,以及了解如何通過最小化隱私訪問盡可能減少不必要用戶數(shù)據(jù)的獲取。
關(guān)注數(shù)據(jù)訪問
您需要考慮的第一個最佳實踐是要仔細斟酌應(yīng)用對用戶數(shù)據(jù)的訪問。一方面是由于 Android 12 讓用戶更直觀地看到自己的隱私如何被訪問,另一方面則是出于您尊重用戶意愿的考量。
應(yīng)用訪問傳感器時的系統(tǒng)提示
△ Android 提升了應(yīng)用訪問麥克風(fēng)和攝像頭時的透明度
隨著 Android 的透明度越來越高,您也越來越需要關(guān)注自己的應(yīng)用何時對用戶數(shù)據(jù)進行了訪問。Android 12 讓用戶更清楚地知曉應(yīng)用何時訪問了麥克風(fēng)和攝像頭。每當(dāng)麥克風(fēng)或攝像頭被訪問時,用戶可以通過從屏幕右上角下拉打開快捷設(shè)置,然后點擊對應(yīng)的指示圖標來實時查看是哪些應(yīng)用在訪問數(shù)據(jù)。如果用戶發(fā)現(xiàn)自己對此次訪問并不知情,可以很方便地跳轉(zhuǎn)到應(yīng)用的權(quán)限設(shè)置界面并撤銷相關(guān)權(quán)限。所以需要您仔細審查應(yīng)用中涉及麥克風(fēng)、攝像頭訪問的代碼,移除那些意外的訪問操作。例如,您應(yīng)該確保在用戶觸發(fā)需要訪問有關(guān)傳感器的功能前,應(yīng)用不會去獲取這些設(shè)備的數(shù)據(jù)。
應(yīng)用的隱私數(shù)據(jù)訪問記錄
我們常常收到用戶的反饋,他們希望了解應(yīng)用究竟使用了哪些數(shù)據(jù)。對此我們做出了一些努力,全新的隱私信息中心讓用戶可以通過一個簡單清晰的時間線視圖來了解到過去 24 小時中,哪些應(yīng)用訪問了設(shè)備的麥克風(fēng)、攝像頭和地理位置數(shù)據(jù)。另外,用戶還可以查看到應(yīng)用是否在過去 24 小時里使用其他運行時權(quán)限訪問過相關(guān)數(shù)據(jù)。
△ 24 小時內(nèi)的隱私訪問情況
建議您對應(yīng)用中相關(guān)的代碼路徑進行仔細審查,確保對每一處隱私數(shù)據(jù)的訪問都能做合理的解釋說明。由于使用到的第三方 SDK 也會被當(dāng)作您應(yīng)用的一部分進行統(tǒng)計,所以需要為它們的隱私訪問提供正當(dāng)?shù)挠美f明。
應(yīng)用的數(shù)據(jù)使用說明
△ Play 商店新增的數(shù)據(jù)安全信息
用戶非常關(guān)心您的應(yīng)用是出于怎樣的原因訪問了隱私數(shù)據(jù),所以當(dāng)用戶在 Play 商店瀏覽應(yīng)用時,會看到一個專門的數(shù)據(jù)安全條款,它為用戶提供了直觀易懂的應(yīng)用數(shù)據(jù)使用的相關(guān)信息,從而幫助用戶在知情的前提下自主決定要安裝哪些應(yīng)用。這樣一來,用戶會有更多的安全感,并且更能相信開發(fā)者們會負責(zé)任地使用用戶數(shù)據(jù)。
應(yīng)用讀取剪貼板時的通知
△ 應(yīng)用讀取剪貼板時的通知消息
相信您一定有過這樣的經(jīng)驗,好友向您發(fā)送了一條消息,比如用戶名和密碼,您常常會復(fù)制這些信息,然后粘貼到另一個應(yīng)用中使用。在這個過程中,這些關(guān)鍵數(shù)據(jù)會被存放在剪貼板中,任何應(yīng)用都可以讀取這些數(shù)據(jù),產(chǎn)生了潛在的隱私泄露風(fēng)險。
每當(dāng)有應(yīng)用從剪貼板讀取數(shù)據(jù)時,Android 都會通知用戶。每當(dāng)應(yīng)用調(diào)用 ClipboardManager#getPrimaryClip() 方法時,Android 會判斷寫入和讀取剪貼板數(shù)據(jù)的是不是同一個應(yīng)用,當(dāng)兩者來源不同時,系統(tǒng)會通過一個消息框來提示用戶;當(dāng)兩者來自同一個應(yīng)用時,則不會產(chǎn)生這樣的提示。所以我們建議您的應(yīng)用首先調(diào)用 ClipboardManager#getPrimaryClipDescription() 方法來獲取剪貼板中數(shù)據(jù)的基本信息,并根據(jù)其類型判斷是否需要進一步讀取,從而最大限度減少對剪貼板數(shù)據(jù)的訪問。另外,我們還建議您不要隨意訪問剪貼板,如果有必要,也應(yīng)該在用戶知情和許可的前提下進行。
為更加透明的隱私訪問做好準備
為了更好支持 Android 12 帶來的隱私透明特性,我們建議您仔細審查應(yīng)用的代碼是否還存在意外的隱私訪問操作。您可以借助審計 (auditing) API 來更好地發(fā)現(xiàn)潛在的隱私數(shù)據(jù)讀取操作以及第三方 SDK 對隱私數(shù)據(jù)的訪問。這個 API 可以在您的應(yīng)用訪問敏感數(shù)據(jù)時調(diào)用一個應(yīng)用內(nèi)的回調(diào)函數(shù),并向其提供所訪問的數(shù)據(jù)類型,這樣您就可以輕松地發(fā)現(xiàn)應(yīng)用在何時、何種情況下讀取了隱私數(shù)據(jù)。
△ 添加數(shù)據(jù)訪問操作的回調(diào)函數(shù)
您也可以通過權(quán)限 intent API 來向用戶說明為什么您的應(yīng)用需要訪問地理位置、攝像頭和麥克風(fēng),從而幫助他們理解和判斷是否要給予這些權(quán)限。您通過此 API 提供的這些信息將會在隱私訪問信息面板及應(yīng)用的權(quán)限管理界面中向用戶展示。
<!-- 添加一個 activity,它可以在啟動時向用戶說明為什么您的應(yīng)用會讀取某種類型的數(shù)據(jù) -->
<!-- 如果您的應(yīng)用要針對 Android 12 構(gòu)建,還必須標注 android:exported 屬性 -->
<activity android:name="DataAccessRationaleActivity"
android:permission="android.permission.START_VIEW_PERMISSION_USAGE"
android:exported="true">
<!-- VIEW_PERMISSION_USAGE 會在應(yīng)用的權(quán)限管理界面顯示一個可勾選的圖標;VIEW_PERMISSION_USAGE_FOR_PERIOD 會在系統(tǒng)的隱私訪問面板顯示一個可勾選的圖標。-->
<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>
△ 添加權(quán)限 intent
上面的代碼展示了您添加權(quán)限 intent 時需要進行的配置。這段代碼在您的應(yīng)用中添加了一個 activity,它可以在啟動時告知用戶為什么要訪問數(shù)據(jù)。您需要把 android:permission 屬性設(shè)置為 START_VIEW_PERMISSION_USAGE。如果您的應(yīng)用是針對 Android 12 進行構(gòu)建的,那么還需要添加 android:exported="true" 屬性。接著添加一個 intent-filter 標簽,隨后根據(jù)您的需要,分別將 android.intent.action.VIEW_PERMISSION_USAGE (在應(yīng)用的權(quán)限管理界面顯示) 和 android.intent.action.VIEW_PERMISSION_USAGE_FOR_PERIOD (在隱私訪問面板顯示) 添加到這個標簽里。這樣一來,用戶就可以在您的應(yīng)用名稱旁看到一個與應(yīng)用的 intent-filter 對應(yīng)的圖標。如果需要詳細了解數(shù)據(jù)訪問審計 API 和權(quán)限 intent 的更多內(nèi)容。
綜上所述,在開發(fā)應(yīng)用時,對于數(shù)據(jù)訪問需要注意以下幾點:
- 只有在必要時才訪問隱私數(shù)據(jù)。不必要的數(shù)據(jù)訪問不僅會讓用戶感到困惑,還會增加隱私泄露的風(fēng)險;
- 注意引入第三方庫時添加的權(quán)限聲明。您可以通過合并 manifest 來查看引入的第三方庫聲明了哪些權(quán)限。別讓引入的 SDK 和第三方庫導(dǎo)致您應(yīng)用被下架!這篇文章為您提供了更多的參考信息;
- 切勿過度訪問用戶數(shù)據(jù)。對用戶隱私數(shù)據(jù)的讀取如果超過了用戶使用的需要,就是對用戶知情權(quán)和控制權(quán)的侵犯。
尊重用戶選擇
我們要分享的第二個最佳實踐關(guān)乎著用戶的選擇。Android 用戶可以自行掌控哪些應(yīng)用可以訪問他們的敏感數(shù)據(jù),以及這些數(shù)據(jù)被應(yīng)用訪問的程度。對于開發(fā)者來說,掌握好這個度非常重要。
研究表明,用戶對應(yīng)用需要訪問數(shù)據(jù)的原因了解得越充分,那么他們認可這些訪問的可能性就越大。您需要通過提供安全的默認參數(shù)來平衡用戶的掌控權(quán)和應(yīng)用的訪問權(quán)限,所以您應(yīng)該向用戶提供一些易于理解的選項,并尊重他們的意志。
更細致的位置權(quán)限選項
△ 選擇大致位置能讓應(yīng)用減少訪問用戶的位置信息
我們在 Android 12 中引入了粒度更細的位置權(quán)限選項,使得用戶可以自行決定是否只向應(yīng)用提供粗略的位置信息。我們建議您仔細檢查應(yīng)用中所有需要訪問位置信息的用例,如果精確的定位不是必須的,請改為申請 ACCESS_COARSE_LOCATION 權(quán)限。
無論何種情況下,您都應(yīng)該具體地向用戶說明為什么需要訪問位置信息,并且按照具體的精度需求逐漸向用戶申請更精確定位信息的訪問權(quán)限。同時,您需要考慮到用戶僅允許應(yīng)用獲取粗略位置的情況,不能因為位置信息不精確就拒絕讓用戶繼續(xù)使用。
如下示例代碼包含了兩個功能,其中一個是只需要訪問大概位置,而另一個則是需要獲取精確定位。當(dāng)用戶給予應(yīng)用獲取大致位置的權(quán)限時,您需要通過 shouldShowRequestPermissionRationale API 來檢查是否需要向用戶顯示必要的權(quán)限申請說明。如果返回了 true,則需要展示您的說明,同時顯示申請大致位置的彈框 (請求 ACCESS_COARSE_LOCATION 權(quán)限)。
// 請求 ACCESS_COARSE_LOCATION 權(quán)限
requestPermissions(
Context,
arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION),
REQUEST_CODE
)
△ 請求 ACCESS_COARSE_LOCATION 權(quán)限
if (grantResults[1] == PackageManager.PERMISSION_GRANTED) {
// ACCESS_COARSE_LOCATION 權(quán)限已獲授權(quán)。
}
△ 處理請求的結(jié)果
當(dāng)用戶以后用到需要獲取精確定位的功能時,您就可以通過向用戶顯示申請更精確位置信息的彈框來獲得 ACCESS_FINE_LOCATION 權(quán)限了。您同樣需要確保用戶了解您的位置用例后再發(fā)起請求。
// 請求 ACCESS_FINE_LOCATION 權(quán)限
requestPermissions(
Context,
arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),
REQUEST_CODE
)
△ 請求 ACCESS_FINE_LOCATION 權(quán)限
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// ACCESS_FINE_LOCATION 權(quán)限已獲授權(quán)。
}
△ 處理請求的結(jié)果
全局權(quán)限開關(guān)
Android 12 中引入了這樣兩個開關(guān),分別對應(yīng)攝像頭和麥克風(fēng)的全局訪問:
△ 麥克風(fēng)和攝像頭的全局開關(guān)
這兩個開關(guān)允許用戶迅速切斷整臺設(shè)備上所有應(yīng)用對攝像頭或者麥克風(fēng)的訪問。如果用戶在應(yīng)用中使用了某個需要訪問攝像頭、麥克風(fēng)的功能,那么系統(tǒng)將會向用戶詢問是否需要立即開放傳感器的訪問。這組開關(guān)與直接拒絕訪問權(quán)限是不同的,因為獲取訪問權(quán)的整個過程是由系統(tǒng)來處理的,提醒用戶啟用設(shè)備也是由系統(tǒng)展示的,應(yīng)用無需進行任何額外的操作。
此外值得一提的是,我們在這次更新中還增加了對運動傳感器采樣率的限制 (200Hz 以內(nèi))。
通知顯示權(quán)限
我們常常聽到用戶關(guān)于設(shè)備上通知過多的抱怨,所以我們在新版本中,要求應(yīng)用需要向用戶申請通知顯示權(quán)限,只有當(dāng)用戶希望或允許收到通知時,應(yīng)用才可以向用戶發(fā)送通知。
△ 限制通知權(quán)限能降低通知消息的干擾
如果您的應(yīng)用需要向用戶發(fā)送通知,請記得在清單文件中添加 POST_NOTIFICATIONS 權(quán)限的聲明。下面的代碼展示了如何申請通知的權(quán)限:
// 請求權(quán)限后向用戶發(fā)送通知
requestPermissions(
Context,
arrayOf(Manifest.permission.POST_NOTIFICATIONS),
REQUEST_CODE
)
△ 請求通知權(quán)限
您可以通過 Notification.areNotificationsEnabled API 或者 PermissionChecker 來檢查應(yīng)用是否已經(jīng)獲得了通知權(quán)限。申請通知權(quán)限的方法與申請其他權(quán)限相同,您不需要做額外的調(diào)整。這里給您補充了一些需要注意的事項:
- 在訪問數(shù)據(jù)前,讓用戶充分了解您讀取數(shù)據(jù)的原因;
- 做好用戶和系統(tǒng)拒絕權(quán)限時的操作,當(dāng)用戶二次拒絕時,您應(yīng)該尊重用戶的意愿;
- 按需逐級獲取隱私數(shù)據(jù),不要一次性申請所有權(quán)限;
- 當(dāng)用戶拒絕或是撤銷某項權(quán)限時,您需要讓應(yīng)用能無縫回退到無需權(quán)限即可運行的狀態(tài)。
?最大程度減少權(quán)限使用
第三個最佳實踐是最大程度減少權(quán)限的使用。一方面您應(yīng)當(dāng)對用戶的意愿和選擇保持尊重,另一方面您還可以使用 Android 的替代 API,在簡化敏感數(shù)據(jù)訪問的同時提供更好的隱私控制。以下幾個方案可以幫助您最大限度減少數(shù)據(jù)訪問。
使用新的附近設(shè)備訪問權(quán)限
可穿戴設(shè)備在最近幾年發(fā)展迅猛,大量的應(yīng)用需要與這些設(shè)備進行交互。在以前,應(yīng)用必須先申請位置訪問權(quán)限才能與配套設(shè)備進行藍牙連接。開發(fā)者們向我們反饋了這種不恰當(dāng)?shù)脑O(shè)計,尤其是當(dāng)應(yīng)用只需要獲取藍牙訪問權(quán)限而不需要獲得設(shè)備位置的時候。過度的權(quán)限申請也使得用戶對應(yīng)用的行為正當(dāng)性產(chǎn)生懷疑,這些反饋敦促著我們改進權(quán)限的對應(yīng)關(guān)系。
△ 訪問附近設(shè)備的權(quán)限
構(gòu)建目標為 API 30 及以前版本 Android 的應(yīng)用,需要同時申請 BLUETOOTH_ADMIN 和 BLUETOOTH 權(quán)限,以及位置權(quán)限才能實現(xiàn)發(fā)現(xiàn)、配對和連接外部設(shè)備。比如下方的代碼是您的應(yīng)用在較早設(shè)備上需要進行的權(quán)限聲明:
<!-- 在較早的設(shè)備上申請藍牙有關(guān)權(quán)限 -->
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
△ 在較早的設(shè)備上申請藍牙有關(guān)權(quán)限
當(dāng)您切換到構(gòu)建 API 31 的應(yīng)用時,可以在上述權(quán)限聲明的基礎(chǔ)上添加一個 maxSDKVersion 屬性:
<!-- 在較早的設(shè)備上申請藍牙有關(guān)權(quán)限 -->
<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" />
<!-- 請求掃描附近藍牙設(shè)備的權(quán)限 -->
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" />
<!-- 請求與已經(jīng)配對的藍牙設(shè)備通信的權(quán)限 -->
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<!-- 請求使用當(dāng)前設(shè)備可供發(fā)現(xiàn)的權(quán)限 -->
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
△ 兼容新舊設(shè)備的前提下申請藍牙有關(guān)權(quán)限
隨后,您需要添加 BLUETOOTH_SCAN 權(quán)限聲明,并且使用 neverForLocation 標記來向系統(tǒng)說明您不會使用這個權(quán)限來推算設(shè)備的位置信息。同時您需要聲明 BLUETOOTH_CONNECT 權(quán)限來與藍牙設(shè)備交互、通過 BLUETOOTH_ADVERTISE 來將當(dāng)前設(shè)備信息廣播給附近的藍牙設(shè)備。
為應(yīng)用設(shè)置智能應(yīng)用休眠功能
在 2020 年發(fā)布 Android 11 時,我們同時推出了自動重置權(quán)限的功能,并且通過 Google Play 服務(wù)的更新將這項功能帶到了運行 Android 6 及以后版本系統(tǒng)的設(shè)備上。當(dāng)某個應(yīng)用有數(shù)月沒有被使用時,Android 會自動撤銷該應(yīng)用的某些授權(quán)。從這項更新發(fā)布以后的情況分析,僅 14 天內(nèi)已經(jīng)有 850 萬應(yīng)用的權(quán)限因長久未使用被撤銷了。所以建議您總是要先檢查權(quán)限是否還存在,避免因為系統(tǒng)撤銷權(quán)限而產(chǎn)生錯誤。
△ Android 11 引入的權(quán)限自動重置功能
2021 年,在權(quán)限自動重置功能的基礎(chǔ)上,我們推出了智能應(yīng)用休眠功能。Android 會自動將長期沒有使用的應(yīng)用進行休眠,從而優(yōu)化設(shè)備存儲、改善性能和提高安全性。系統(tǒng)不僅會撤銷用戶此前的授權(quán),還會強制停止應(yīng)用,收回內(nèi)存、存儲空間及其他臨時資源。
當(dāng)應(yīng)用進入休眠后,系統(tǒng)會阻止應(yīng)用在后臺運行任務(wù),或者接收推送通知。而結(jié)束應(yīng)用休眠的方式也非常簡單,用戶只需要啟動應(yīng)用即可。與權(quán)限自動重置類似,應(yīng)用進入休眠時,用戶會收到相應(yīng)的通知,同時用戶也可以在設(shè)置中選擇關(guān)閉休眠。
用好分區(qū)存儲策略
Android 10 的發(fā)布首次引入了分區(qū)存儲機制,它為隱私保護提供了一種新的存儲方案。隨著后續(xù)幾個版本的迭代更新,其他應(yīng)用不再能訪問某個應(yīng)用的外部目錄了。您也可以在不請求任何權(quán)限的基礎(chǔ)上添加和編輯本應(yīng)用的文件,或是在用戶知情同意的前提下編輯第三方應(yīng)用產(chǎn)生的文件。而如果您將文件添加到共享存儲目錄中,則無需任何權(quán)限申請操作。
使用照片選擇器
未來我們會發(fā)布一個照片選擇器 (Photo Picker),它可以無需任何請求即可讀取用戶選擇的照片或視頻。您可以在其中選擇設(shè)備本地存儲的照片或視頻,也可以訪問到來自 Google Photos 等云提供商的照片或視頻。這個新的選擇器會替換以前申請權(quán)限的訪問方式,簡化應(yīng)用的權(quán)限聲明。
通過 Google Play 系統(tǒng)更新,Android 11 及以后的設(shè)備都可以使用這個新的照片選擇器。下面是一個使用這款新照片選擇器的例子:
// 要發(fā)送的 intent
val intent = Intent(MediaStore.ACTION_PICK_IMAGES).apply {
putExtra(MediaStore.EXTRA_PICK_IMAGES_MAX, 15)
putExtra(Intent.EXTRA_MIME_TYPES, arrayOf("image/*", "video/*"))
}
// 處理返回的 intent
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
// 遍歷所有的 URI 結(jié)果
for (i in 0 until data.clipData.itemCount) {
val uri = data.clipData.getItemAt(i).uri
val inputStream = contentResolver.openInputStream(uri)
}
}
△ 獲取照片選擇器的 intent
如果您需要在應(yīng)用中喚起這個選擇器,需要啟動 ACTION_PICK_IMAGES Intent,然后指定可選取媒體的最大數(shù)量和支持的文件類型。當(dāng)用戶選中文件后,可以通過 clipData 屬性讀取各個文件的 URI,然后使用 ContentResolver 來讀取文件內(nèi)容。為了能夠兼容更早前的設(shè)備,我們還計劃發(fā)布一個支持庫,讓應(yīng)用在支持時使用新的照片選擇器,不支持時使用存儲訪問框架簡化對文件元數(shù)據(jù)、內(nèi)容的讀取。
新的存儲權(quán)限劃分策略
此外,我們還在努力通過新的存儲空間功能為用戶帶來更清晰、為開發(fā)者帶來更精準的存儲權(quán)限劃分粒度。比如在下個版本中引入的 READ_IMAGES 權(quán)限允許您讀取共享存儲空間上的所有圖片和視頻文件,而 READ_AUDIO 可用于讀取所有的音頻文件 (包括 .m3u 播放列表)。借助分區(qū)存儲,您應(yīng)用訪問自己分區(qū)內(nèi)的文件時不需要申請訪問權(quán)限;位于共享存儲空間的非媒體文件仍然可以通過存儲訪問框架獲得。如果要在您的 manifest 中包括這些變化,您可以參照這個例子:
<!-- 在 API 31 和更早的設(shè)備上請求權(quán)限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="31"/>
<!-- 請求圖片和視頻訪問權(quán)限 -->
<uses-permission android:name="android.permission.READ_IMAGES"/>
<!-- 請求音頻訪問權(quán)限 -->
<uses-permission android:name="android.permission.READ_AUDIO"/>
<!-- 請求所有共享文件訪問權(quán)限(僅用于受允許的用例) -->
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
△ 聲明使用新的權(quán)限
請注意,MANAGE_EXTERNAL_STORAGE 權(quán)限可以用于那些核心功能就是要與大量的文件進行交互的應(yīng)用。但此權(quán)限受限于 Google Play 關(guān)于使用 "所有文件訪問權(quán)限" 的政策。關(guān)于此權(quán)限的使用,請參閱管理存儲設(shè)備上的所有文件:https://developer.android.google.cn/training/data-storage/manage-all-files
以上這些建議概括如下幾點:
- 盡可能減少位置數(shù)據(jù)訪問,并且盡量只在應(yīng)用處于前臺時訪問粗略的位置信息;
- 使用新的藍牙權(quán)限來更好地提供隱私保護;
- 盡可能通過新的照片選擇器來避免請求共享存儲空間。
開發(fā)者可降級權(quán)限
一些應(yīng)用可能不再需要某些之前由用戶授予過的權(quán)限,這些權(quán)限曾用于開啟某項特定功能或保留舊的 Android 版本中的敏感權(quán)限。在 Android 13 中,我們提供了新的 API,讓您的應(yīng)用通過降級以前被授予的運行時權(quán)限來保護用戶隱私。
感謝您的閱讀,希望我們可以共同構(gòu)建一個能夠讓用戶安心使用的操作系統(tǒng)和應(yīng)用生態(tài)。