從 Android 10 開始,由Contacts Provider組件(在設備的聯繫人應用中看到的數據源)管理的聯繫人相關性相關數據的訪問方式與 Android 9 及更低版本不同。
在 Android 10 之前,應用程序使用 Contacts Provider 來訪問數據並在設備和在線服務之間傳輸數據。 Android 10 對數據可訪問性進行了更改,以確保在所有使用 Contacts Provider 的 Android 10 設備中增加用戶隱私。一方面,底層數據庫不包含聯繫人關聯數據。因此應用程序無法寫入或讀取它。更改包括以下內容:
- Contacts Provider 不會記錄與聯繫人相關性相關的數據,例如聯繫用戶的次數、上次聯繫時間、使用的應用程序、聯繫的人或任何相關的歷史數據。
- Contacts Provider 自動完成 API 中的
MultiAutoCompleteTextView
類不按交互計數器對查詢結果進行排序。 - Android 框架不提供隱式聯繫人排名。 (但是,用戶控制的顯式聯繫人排名(例如加星標的聯繫人)仍然存在)。
要實施這些更改,請執行以下操作之一:
- 使用最新的聯繫人提供程序。
- 更新您的版本(如果您使用的是分叉版本)。
此外,更新任何依賴已棄用的聯繫人提供程序功能的應用程序。不允許使用旨在解決已棄用功能的 API 版本。
對於 Android 9 及更低版本,Contacts Provider 中的聯繫人交互數據尚未刪除。相反,會定期(大約每天一次)清除聯繫人交互數據,以模擬 Android 10 中的等效情況。聯繫人提供程序存儲此信息,但只是暫時的。
API 更改
預計這些更改將對 API 產生很大影響。例如,自動完成排名的效果不佳。對 API 行為的潛在影響包括:
- Contacts Provider 不會在
ContactsContract.Contacts
表列中存儲用戶對聯繫人的偏好或與聯繫人的交互。 - 自動完成 API 不會按交互計數器對結果進行排序。
-
TIMES_CONTACTED
/TIMES_USED
和LAST_TIME_CONTACTED
/LAST_TIME_USED
列不會被更新。 - 在升級到 Android 10 時,這些清除(為
null
或設置為 0,具體取決於受影響的列)。 - 自動完成查詢 API 中的排名會返回按字母順序排序的結果,而不是按親和力信息排序的結果。
- 頻繁聯繫的 API 調用(例如,使用過濾字符串
CONTENT_FREQUENT_URI
)不返回任何結果。
通常,如果任何已棄用的 Contacts Provider 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 | Strequent (加星標+頻繁)CONTENT_STREQUENT_FILTER_URI CONTENT_STREQUENT_URI CONTENT_FREQUENT_URI | 僅返回加星標的聯繫人。沒有頻繁的聯繫返回。 |
ContactsContract.CommonDataKinds.Email ContactsContract.CommonDataKinds.Phone ContactsContract.CommonDataKinds.Callable | 過濾器(也稱為自動完成)API | 結果未按親和力排序。這些按星號和名稱排序。 |
備擇方案
已棄用的 API 字段沒有替代品。不允許採用旨在規避這些限制的變通辦法,無論是以新 API 還是新字段的形式。
執行
您無需執行任何操作即可實施這些更改。它們是在 Android 操作系統平台上增加用戶隱私的計劃的一部分。但是,如果您的應用依賴於已棄用的功能,您可能需要更新您的應用以補償任何更改。此外,如果您使用聯繫人提供程序的分叉版本,則必須更新您的聯繫人提供程序。
無定制
不要自定義或解決聯繫人關聯信息更改。它們內置在框架中,進行任何更改都會使您失去合規性。切勿更改默認設置或提供後門替代方案。