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 或藍牙 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 為目標版本後,應用程式會保留該權限。不過,使用者隨時可以在系統設定中撤銷這項權限。
已從 UI 中移除權限群組
自 Android 10 起,應用程式無法在 UI 中查詢權限分組方式。