聯繫人提供者和關聯信息

從 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_USEDLAST_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 中發生了變化:

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

update
delete

無操作。
ContactsContract.Contacts Strequent (加星標+頻繁)
CONTENT_STREQUENT_FILTER_URI
CONTENT_STREQUENT_URI
CONTENT_FREQUENT_URI
僅返回加星標的聯繫人。沒有頻繁的聯繫返回。
ContactsContract.CommonDataKinds.Email
ContactsContract.CommonDataKinds.Phone
ContactsContract.CommonDataKinds.Callable
過濾器(也稱為自動完成)API

CONTENT_FILTER_URI
ENTERPRISE_CONTENT_FILTER_URI

結果未按親和力排序。這些按星號名稱排序。

備擇方案

已棄用的 API 字段沒有替代品。不允許採用旨在規避這些限制的變通辦法,無論是以新 API 還是新字段的形式。

執行

您無需執行任何操作即可實施這些更改。它們是在 Android 操作系統平台上增加用戶隱私的計劃的一部分。但是,如果您的應用依賴於已棄用的功能,您可能需要更新您的應用以補償任何更改。此外,如果您使用聯繫人提供程序的分叉版本,則必須更新您的聯繫人提供程序。

無定制

不要自定義或解決聯繫人關聯信息更改。它們內置在框架中,進行任何更改都會使您失去合規性。切勿更改默認設置或提供後門替代方案。