從 Android 10 開始,由聯絡人提供者元件(裝置的聯絡人應用程式中看到的資料來源)管理的聯絡人關聯相關資料的存取方式與 Android 9 及更低版本中不同。
在 Android 10 之前,應用程式使用聯絡人提供者來存取資料並在裝置和線上服務之間傳輸資料。 Android 10 在資料可存取性方面進行了更改,以確保在所有使用聯絡人提供者提供者的 Android 10 裝置中增強使用者隱私。其一,底層資料庫不包含聯絡人密切關係資料。因此應用程式無法對其進行寫入或讀取。變化包括以下內容:
- 聯絡人提供者不會記錄與聯絡人關聯相關的數據,例如聯絡使用者的次數、上次聯絡的時間、使用的應用程式、聯絡的人員或任何相關的歷史資料。
- 聯絡人提供者會自動完成 API 中的
MultiAutoCompleteTextView
類別不會依互動計數器對查詢結果進行排序。 - Android 框架不提供隱式聯絡人排名。 (但是,用戶控制的明確聯絡人排名(例如加星號的聯絡人)仍然存在)。
若要實施這些更改,請執行下列操作之一:
- 使用最新的聯絡人提供者。
- 更新您的版本(如果您使用的是分叉版本)。
此外,更新依賴已棄用的聯絡人提供程式功能的所有應用程式。不允許設計用於解決已棄用函數的 API 版本。
對於 Android 9 及更低版本,來自聯絡人提供者提供者的聯絡人互動資料尚未刪除。相反,聯絡人互動資料會定期(大約每天一次)清除,以模擬 Android 10 中的同等情況。聯絡人提供程式會儲存此訊息,但只是暫時的。
API變更
預計這些變更將對 API 產生重大影響。例如,自動完成排名的效果不佳。對 API 行為的潛在影響包括:
- 聯絡人提供者不會儲存使用者對
ContactsContract.Contacts
表格列中的聯絡人的首選項或互動。 - 自動完成 API 不會依照互動計數器對結果進行排序。
-
TIMES_CONTACTED
/TIMES_USED
和LAST_TIME_CONTACTED
/LAST_TIME_USED
欄位不會更新。 - 升級到 Android 10 後,這些內容將被清除(為
null
或設定為 0,取決於受影響的欄位)。 - 自動完成查詢 API 中的排名傳回按字母順序排序的結果,而不是按相似性資訊排序。
- 對頻繁聯絡人的 API 呼叫(例如,使用過濾器字串
CONTENT_FREQUENT_URI
)不會傳回任何結果。
通常,如果任何已棄用的聯絡人提供程式 API 元素使用計數器,則這些計數器(在 Android 10 中使用時)包含 0,並在查詢時傳回 0。來自受影響 API 的更新請求將被忽略。例如, ContactsContract.DataUsageFeedback
類別已被棄用,因此對該類別的更新和刪除呼叫將被忽略。
影響 API 的字段
這些字段在 Android 10 中發生了變化:
-
ContactsContract.ContactOptionsColumns#TIMES_CONTACTED
-
ContactsContract.ContractOptionsColumns.LAST_TIME_CONTACTED
-
ContactsContract.DataUsageStatColumns#TIMES_USED
-
ContactsContract.DataUsageStatColumns#LAST_TIME_USED
-
ContactsContract#CONTENT_STREQUENT_FILTER_URI
-
ContactsContract.Contacts#CONTENT_STREQUENT_URI
-
ContactsContract.Contacts#CONTENT_FREQUENT_URI
-
ContactsContract.Contacts#ENTERPRISE_CONTENT_FILTER_URI
-
ContactsContract.Contacts#CONTENT_FILTER_URI
Android 10 中受影響的欄位可能存在於不同的 API 中,如下表所示。已棄用的 API 欄位傳回所列行為。由於這些已棄用的欄位之一可能會在您的多個 API 中使用,因此請驗證您的用例。
班級 | API欄位 | 10 次退貨 |
---|---|---|
ContactsContract.Contacts ContactsContract.RawContacts ContactsContract.Data ContactsContract.Entity | ContactOptionsColumns TIMES_CONTACTED LAST_TIME_CONTACTED | 這些列始終包含 0,無論它們如何使用。修改它們的嘗試將被忽略。 |
Contacts | markAsContacted() | 沒有操作。 |
ContactsContract.DataUsageFeedback | | 沒有操作。 |
ContactsContract.Contacts | 嚴格(加星號+頻繁)CONTENT_STREQUENT_FILTER_URI CONTENT_STREQUENT_URI CONTENT_FREQUENT_URI | 僅返回加星標的聯絡人。沒有返回頻繁的聯絡人。 |
ContactsContract.CommonDataKinds.Email ContactsContract.CommonDataKinds.Phone ContactsContract.CommonDataKinds.Callable | 過濾(也稱為自動完成)API | 結果未依親和力排序。這些按星號和名稱排序。 |
備擇方案
已棄用的 API 欄位沒有其他替代方案。不允許採用旨在規避這些限制的變通辦法,無論是採用新 API 還是新欄位的形式。
執行
您無需執行任何操作即可實施這些變更。它們是增強 Android 作業系統平台上的用戶隱私計劃的一部分。但是,如果您的應用程式依賴已棄用的功能,您可能需要更新您的應用程式以補償任何變更。此外,如果您使用聯絡人提供者提供者的分叉版本,則必須更新您的聯絡人提供者提供者。
無客製化
不要自訂或解決聯絡人關聯資訊變更。它們內建於框架中,進行任何更改都會導致您不合規。切勿更改預設設定或提供後門替代方案。