Android 10 (API 級別 29) 推出了多項功能和行為變更,進一步保護使用者隱私。這些異動旨在提升使用者對個人資料的透明度和掌控權,以及他們提供給應用程式的功能。這些功能可能表示應用程式依附的特定行為或資料,可能會與舊版平台有所不同。如果應用程式採用目前處理使用者資料的最佳做法,應盡量減少對應用程式造成的影響。
本頁面會列出各項變更的摘要。
主要異動
本節包含 Android 10 中與隱私權相關的主要異動。
外部儲存空間存取權僅適用於應用程式檔案和媒體
根據預設,指定 Android 10 以上版本為目標的應用程式會限定存取外部儲存空間,或限定範圍儲存空間。這類應用程式可以在外部儲存空間裝置中查看下列類型的檔案,不需要要求任何與儲存空間相關的使用者權限:
- 使用
getExternalFilesDir()
存取應用程式專屬目錄中的檔案。 - 應用程式從媒體商店建立的相片、影片和音訊片段。
如要進一步瞭解限定範圍儲存空間,以及如何共用、存取及修改儲存在外部儲存空間裝置上的檔案,請參閱「管理外部儲存空間中的檔案」和「存取及修改媒體檔案」的相關指南。
必須授予相關權限,才能在背景存取裝置位置資訊
為了支援使用者進一步控管應用程式的位置資訊存取權,Android 10 推出了 ACCESS_BACKGROUND_LOCATION
權限。
與 ACCESS_FINE_LOCATION
和 ACCESS_COARSE_LOCATION
權限不同,ACCESS_BACKGROUND_LOCATION
權限只會影響應用程式在背景執行的位置存取權。除非符合下列任一條件,否則系統會將應用程式視為在背景存取位置資訊:
- 系統會顯示屬於該應用程式的活動。
應用程式正在執行前景服務,且該服務類型宣告為
location
前景服務類型。如要在應用程式中宣告服務的前景服務類型,請將應用程式的
targetSdkVersion
或compileSdkVersion
設為29
以上版本。進一步瞭解前景服務如何繼續執行需要存取位置資訊的使用者啟動的動作。
如果應用程式會建立及監控地理圍欄,並以 Android 10 (API 級別 29) 以上版本為目標,您必須宣告 ACCESS_BACKGROUND_LOCATION
權限。
指定 Android 9 以下版本時自動授予存取權
如果應用程式在 Android 10 以上版本執行,但指定 Android 9 (API 級別 28) 以下版本,則平台會套用下列行為:
- 如果應用程式為
ACCESS_FINE_LOCATION
或ACCESS_COARSE_LOCATION
宣告<uses-permission>
元素,系統會在安裝期間自動為ACCESS_BACKGROUND_LOCATION
新增<uses-permission>
元素。 - 如果您的應用程式要求
ACCESS_FINE_LOCATION
或ACCESS_COARSE_LOCATION
,系統會自動將ACCESS_BACKGROUND_LOCATION
新增至要求。
裝置升級至 Android 10 後存取
如果使用者授予應用程式存取裝置位置資訊的權限 (ACCESS_COARSE_LOCATION
或 ACCESS_FINE_LOCATION
),之後將裝置從 Android 9 升級至 Android 10 時,系統會自動更新已授予應用程式的位置相關權限。升級後,應用程式收到的一組權限取決於目標 SDK 版本及其定義的權限,如下表所示:
目標平台版本 | 已授予粗略或精細的 權限? |
要在資訊清單中定義 背景權限嗎? |
已更新預設權限狀態 |
---|---|---|---|
Android 10 | 可 | 可 | 前景與背景存取權 |
Android 10 | 可 | 否 | 僅限前景 |
Android 10 | 否 | (已由系統忽略) | 無使用權限 |
Android 9 以下版本 | 可 | 系統在裝置升級時自動新增 | 前景與背景存取權 |
Android 9 以下版本 | 否 | (已由系統忽略) | 無使用權限 |
請注意,即使系統會自動更新應用程式對裝置位置資訊的存取權,使用者還是可以變更此層級存取權。舉例來說,使用者可能會減少應用程式對前景的存取權,或完全撤銷存取權。在嘗試存取裝置的位置資訊 (尤其是在前景服務中) 之前,應用程式應檢查使用者是否仍允許應用程式接收此位置資訊。
在 Android 10 裝置上更新目標 API 級別時已撤銷存取權
假設應用程式已安裝在搭載 Android 10 的裝置上。在這種情況下,如果您將應用程式更新為指定 Android 10,裝置就會撤銷 ACCESS_BACKGROUND_LOCATION
權限。
如要進一步瞭解如何在應用程式於背景執行時擷取裝置的位置資訊,請參閱定期接收位置資訊更新指南。
從背景啟動活動的限制
從 Android 10 開始,系統會從背景啟動活動設下限制。這項行為變更有助於盡量減少對使用者的干擾,並讓使用者進一步掌控螢幕上顯示的內容。只要應用程式基於使用者互動的直接啟動活動,應用程式很可能不會受到這些限制的影響。
如要進一步瞭解從背景啟動活動時建議使用的替代做法,請參閱如何在應用程式中通知使用者有時效性事件的相關指南。
ID 和資料
本節列出與裝置 ID 和資料搭配使用的特定異動。
移除聯絡人興趣相似目標對象
從 Android 10 開始,平台不會追蹤聯絡人相依性資訊。因此,如果您的應用程式針對使用者的聯絡人進行搜尋,結果就不會依照互動頻率排序。
ContactsProvider
指南內含一則通知,說明搭載 Android 10 起的所有裝置上已過時的特定欄位和方法。
MAC 位址隨機化
在搭載 Android 10 以上版本的裝置上,根據預設,系統會傳輸隨機 MAC 位址。
如果您的應用程式處理的是企業用途,該平台會為與 MAC 位址相關的多項作業提供 API:
- 取得隨機 MAC 位址:裝置擁有者應用程式和設定檔擁有者應用程式可呼叫
getRandomizedMacAddress()
,擷取指派給特定網路的隨機 MAC 位址。 - 取得實際的原廠 MAC 位址:裝置擁有者應用程式可以呼叫
getWifiMacAddress()
,擷取裝置的實際硬體 MAC 位址。這個方法適合用於追蹤多組裝置。
/proc/net 檔案系統存取權的限制
在搭載 Android 10 以上版本的裝置上,應用程式無法存取 /proc/net
,包括裝置網路狀態的相關資訊。需要存取這類資訊的應用程式 (例如 VPN) 應使用 NetworkStatsManager
或 ConnectivityManager
類別。
無法重設裝置 ID 的限制
從 Android 10 開始,應用程式必須具備 READ_PRIVILEGED_PHONE_STATE
特殊權限,才能存取裝置的無法重設 ID,包括 IMEI 和序號。
受影響的方法如下:
Build
TelephonyManager
如果應用程式未具備權限,而您仍嘗試索取無法重設的 ID 相關資訊,平台的回應會根據目標 SDK 版本而有所不同:
- 如果應用程式指定 Android 10 以上版本,就會發生
SecurityException
。 - 如果應用程式指定的是 Android 9 (API 級別 28) 以下版本,則如果應用程式具備
READ_PHONE_STATE
權限,這個方法就會傳回null
或預留位置資料。否則會發生SecurityException
。
許多用途都不需要無法重設的裝置 ID。舉例來說,如果應用程式使用無法重設的裝置 ID 進行廣告追蹤或分析,請針對這些特定用途使用 Android 廣告 ID。詳情請參閱「專屬 ID 的最佳做法」。
有限存取剪貼簿資料
除非您的應用程式是預設的輸入法編輯器 (IME),或者應用程式目前是焦點,否則應用程式無法在 Android 10 以上版本存取剪貼簿資料。
USB 裝置序號保護
如果應用程式指定 Android 10 或以上版本,則使用者必須授予應用程式存取 USB 裝置或配件的權限,應用程式才能讀取序號。
如要進一步瞭解如何使用 USB 裝置,請參閱「設定 USB 主機」指南。
攝影機和連線
本節列出相機中繼資料和連線 API 的特定變更。
攝影機詳細資料和中繼資料的存取權限制
Android 10 會變更 getCameraCharacteristics()
方法預設傳回的資訊廣度。請特別注意,應用程式必須具備 CAMERA
權限,才能存取這個方法的傳回值中包含的潛在裝置特定中繼資料。
如要進一步瞭解這些變更,請參閱「需要權限的相機欄位」一節。
啟用及停用 Wi-Fi 的限制
指定 Android 10 以上版本的應用程式無法啟用或停用 Wi-Fi。WifiManager.setWifiEnabled()
方法一律會傳回 false
。
如果需要提示使用者啟用及停用 Wi-Fi,請使用設定面板。
直接存取所設 Wi-Fi 網路的限制
為保護使用者隱私,只有系統應用程式和裝置政策控制器 (DPC) 只能手動設定 Wi-Fi 網路清單。指定的 DPC 可以是裝置擁有者或設定檔擁有者。
如果應用程式指定 Android 10 以上版本,且並非系統應用程式或 DPC,以下方法就不會傳回有用的資料:
getConfiguredNetworks()
方法一律會傳回空白清單。每個會傳回整數值 (
addNetwork()
和updateNetwork()
) 的網路作業方法一律會傳回 -1。每個傳回布林值的網路作業 (
removeNetwork()
、reassociate()
、enableNetwork()
、disableNetwork()
、reconnect()
和disconnect()
) 一律會傳回false
。
如果應用程式需要連線到 Wi-Fi 網路,請使用下列替代方法:
- 如要觸發連至 Wi-Fi 網路的即時本機連線,請在標準
NetworkRequest
物件中使用WifiNetworkSpecifier
。 - 如要新增 Wi-Fi 網路以決定是否為使用者提供網際網路存取權,請使用
WifiNetworkSuggestion
物件。您可以分別呼叫addNetworkSuggestions()
和removeNetworkSuggestions()
,新增及移除自動連線網路選取對話方塊中顯示的網路。這些方法不需要任何位置存取權。
某些電話、藍牙、Wi-Fi API 需要 FINE 位置存取權
如果應用程式指定 Android 10 以上版本為目標,就必須具備 ACCESS_FINE_LOCATION
權限,才能在 Wi-Fi、Wi-Fi Aware 或 Bluetooth API 中使用多種方法。以下各節列出受影響的類別和方法。
電話通訊系統
TelephonyManager
getCellLocation()
getAllCellInfo()
requestNetworkScan()
requestCellInfoUpdate()
getAvailableNetworks()
getServiceState()
TelephonyScanManager
requestNetworkScan()
TelephonyScanManager.NetworkScanCallback
onResults()
PhoneStateListener
onCellLocationChanged()
onCellInfoChanged()
onServiceStateChanged()
Wi-Fi
WifiManager
startScan()
getScanResults()
getConnectionInfo()
getConfiguredNetworks()
WifiAwareManager
WifiP2pManager
WifiRttManager
藍牙
BluetoothAdapter
startDiscovery()
startLeScan()
BluetoothAdapter.LeScanCallback
BluetoothLeScanner
startScan()
權限
本節說明 Android 權限模型的更新內容。
限制存取畫面內容
為了保護使用者的畫面內容,Android 10 會變更 READ_FRAME_BUFFER
、CAPTURE_VIDEO_OUTPUT
和 CAPTURE_SECURE_VIDEO_OUTPUT
權限的範圍,以防止在靜音的情況下存取裝置螢幕內容。自 Android 10 起,這些權限僅具備簽章存取權。
需要存取裝置畫面內容的應用程式應使用 MediaProjection
API,此 API 會顯示提示,要求使用者提供同意聲明。
對舊版應用程式的使用者導向權限檢查
如果應用程式指定 Android 5.1 (API 級別 22) 以下版本,當使用者首次在搭載 Android 10 以上版本的裝置上使用應用程式時,會看到權限畫面,如圖 1 所示。使用者可以透過這個畫面,在安裝時撤銷系統先前授予應用程式的權限。
體能活動辨識
如果應用程式需要偵測使用者的步數或分類使用者的體能活動 (例如步行、騎腳踏車或在車上移動),Android 10 導入了 android.permission.ACTIVITY_RECOGNITION
執行階段權限。方便使用者瞭解裝置感應器資料在「設定」中的使用情形。
除非使用者授予您的應用程式這項權限,否則 Google Play 服務中的部分程式庫 (例如 Activity Recognition API 和 Google Fit API) 不會提供結果。
在需要宣告這項權限的內建感應器是步驟計數器和步數偵測工具感應器。
如果您的應用程式指定 Android 9 (API 級別 28) 以下版本,系統會視需要自動將 android.permission.ACTIVITY_RECOGNITION
權限授予應用程式,前提是應用程式必須符合下列各項條件:
- 資訊清單檔案包含
com.google.android.gms.permission.ACTIVITY_RECOGNITION
權限。 - 資訊清單檔案不包含
android.permission.ACTIVITY_RECOGNITION
權限。
如果系統自動授予 android.permission.ACTIVITY_RECOGNITION
權限,則在您將應用程式更新為以 Android 10 為目標後,應用程式仍會保留該權限。不過,使用者隨時可以在系統設定中撤銷這項權限。
已從使用者介面中移除權限群組
自 Android 10 起,應用程式無法在 UI 中查詢權限分組方式。