連絡先プロバイダとアフィニティ情報

連絡先アフィニティ関連データは連絡先プロバイダ コンポーネント(デバイスの連絡帳アプリに表示されるデータのソース)によって管理されています。Android 10 以降、このデータへのアクセス方法が変わりました。

Android 10 より前、アプリは連絡先プロバイダを使用してデータにアクセスし、デバイスとオンライン サービスの間でデータを転送していました。Android 10 では、連絡先プロバイダを使用するすべての Android 10 デバイスでユーザーのプライバシーを強化するために、データのアクセス性に関する変更が行われました。一例として、基になるデータベースには連絡先アフィニティ データが含まれていません。そのため、アプリが読み書きできません。変更内容は次のとおりです。

  • 連絡先プロバイダは、ユーザーが連絡を受けた回数、最後の連絡時間、使用したアプリ、連絡相手など、連絡先アフィニティ関連データを記録しません。
  • 連絡先プロバイダのオートコンプリート API にある MultiAutoCompleteTextView クラスは、インタラクション カウンタによるクエリ結果の並べ替えを行いません。
  • Android フレームワークでは、暗黙的な連絡先ランキングは提供されません(ただし、ユーザーが管理する明示的な連絡先ランキング(スター付きの連絡先など)はそのままです)。

これらの変更を実装するには、次のいずれかを行います。

  • 最新の連絡先プロバイダを使用する。
  • バージョンをアップデートする(フォーク バージョンの場合)。

さらに、サポートが終了した連絡先プロバイダ機能に依存しているアプリをすべてアップデートします。サポートが終了した機能の回避策として設計された API バージョンは使用できません。

Android 9 以前では、連絡先プロバイダからの連絡先インタラクション データは削除されていません。代わりに、Android 10 と同等の状態をシミュレートするために、連絡先インタラクション データは定期的に(1 日に 1 回程度)消去されます。連絡先プロバイダはこの情報を保存しますが、一時的な保存に限られます。

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 クラスはサポートが終了したため、このクラスに対する update 呼び出しと delete 呼び出しは無視されます。

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(オートコンプリート API ともいいます)

CONTENT_FILTER_URI
ENTERPRISE_CONTENT_FILTER_URI

結果はアフィニティで並べ替えられません。スター付きと名前で並べ替えられます。

代替手段

サポートが終了した API フィールドの代替手段はありません。こうした制限を迂回するように設計された回避策は、新しい API や新しいフィールドの形式であっても使用できません。

実装

これらの変更を実装するために、何もする必要はありません。Android OS プラットフォームにおけるユーザーのプライバシー向上の一環です。ただし、サポートが終了した機能にアプリが依存している場合は、変更を補うようにアプリをアップデートすることをおすすめします。また、連絡先プロバイダのフォーク バージョンを使用する場合は、連絡先プロバイダをアップデートする必要があります。

カスタマイズ不可

連絡先のアフィニティ情報の変更は、カスタマイズまたは回避しないでください。フレームワークに組み込まれているため、変更を加えると規約違反になります。デフォルト設定の変更、または不正な代替手段の提供はしないでください。