サービスに関する最新情報

Android で連絡先を追加、編集する、より信頼性の高い方法

所要時間: 6 分
Roxanna Aliabadi Walker のプロフィールを表示
Roxanna Aliabadi Walker Android プロダクト マネージャー

変更点

今後の Android リリースを対象とするアプリは、WRITE_CONTACTS 権限を使用して連絡先に直接書き込むことができなくなります。代わりに、標準の連絡先インテント(ACTION_INSERT、ACTION_EDIT、ACTION_INSERT_OR_EDIT)を使用できます。完全なリファレンス実装については、インテントを使用して連絡先を変更する方法に関するデベロッパー ガイドをご覧ください。

今後リリースされる Android を搭載したデバイスでは、これら 3 つの連絡先インテントは一貫して動作し、権限はまったく必要ありません。アプリが次期 Android リリース以降をターゲットとし、連絡先に直接書き込もうとすると、その書き込みは拒否され、SecurityException または権限拒否が発生します。連絡先の作成と変更のために広範なアクセスを必要とする少数のアプリ向けに、新しい特別なアプリ アクセス権限 MANAGE_CONTACTS が Android 17 QPR2(2026 年第 4 四半期)で導入されます。Google Play は本日、MANAGE_CONTACTS を含む、連絡先へのアクセスに関する更新されたガイドラインを公開します。

目的

現在、アプリで連絡先を 1 件でも保存する必要がある場合は、WRITE_CONTACTS をリクエストしている可能性があります。しかし、この権限は広範なアクセスを許可するものであり、アプリはユーザーの操作なしでも、バックグラウンドでデバイス全体の連絡先に広範な変更を加えることができます。ほとんどのアプリでは、このような広範な権限は必要ありません。

代替手段は存在するものの、エコシステム全体でより標準化する必要があるというご意見をいただいています。以前は、連絡先インテントの動作はデバイスごとに異なっていました。一部のエディタでは、連絡先の写真など、渡されたデータが削除されました。一部のデバイスでは、戻るボタンを押すと意図せず連絡先が保存されたり、[新しい連絡先を作成] オプションが見つけにくかったりしました。そのため、許可を求めるのが合理的な選択でした。Google は、今後の Android バージョンですべてのこうした問題を修正し、そのバージョンを搭載するデバイスが同じ標準に準拠することを義務付ける予定です。

代わりに使用するもの

連絡先を追加または編集する: 連絡先インテントを使用する

これらのインテント(ACTION_INSERT、ACTION_EDIT、ACTION_INSERT_OR_EDIT)を使用すると、システムが面倒な処理を代行し、クリーンで標準化された連絡先エディタ エクスペリエンスを提供します。新しいエントリ用のクイック ハーフシート フォームが開くか、ユーザーが既存の連絡先を簡単に検索して情報を追加できるようになります。ユーザーは、このエディタをシームレスに全画面表示に拡大して、詳細を入力できます。アプリに直接書き込み権限を付与する必要はありません。以下の UX モックアップをご覧ください。

Figure01_01_Quick_Insert_Half_Sheet_Prefilled.png
スクリーンショット 2 - タイトル: 連絡先の新規作成のフルシート モック: アバター セレクタ、名前、電話番号、メールの各フィールドを含む全画面表示の連絡先エディタを示す、Android ユーザー インターフェースの仮のスクリーンショット。デザインには「UX not Final」というラベルが付いています。

図 1: 新しい連絡先を作成する  *UX は最終版ではありません*

Figure02_01_Add_To_Existing_0_Search_State_Half_Sheet.png
スクリーンショット 2 - タイトル: 「既存の連絡先に情報を追加する」の全画面モック: アバター セレクタ、名前、電話番号、メールアドレスのフィールドを含む全画面の連絡先エディタを示す、Android ユーザー インターフェースの仮のスクリーンショット。全画面デザインでは、セカンダリ フィールドに段階的開示チップが使用されています。デザインには「UX は最終的なものではありません」というラベルが付いています。

図 2: 既存の連絡先に情報を追加する *UX は最終版ではありません*


注: デバイス メーカーによって、OS のスタイルに合わせてユーザー エクスペリエンスが変更される場合がありますが、動作は一貫しています。


インテントとともに、エクストラと呼ばれるオプションのデータ ペイロードを渡すことで、作成プロセスをさらに効率化できます。

  • EXTRA_ACCOUNT は、連絡先を保存するアカウントを提案します。これは、アプリが連絡先を同期する場合に役立ちます。このエクストラは以前から存在していましたが、サポートはデバイスによって異なっていました。今後の Android リリース以降、サポートはデバイス間で標準化されます。
  • EXTRA_PHOTO_URI は、連絡先の写真を事前入力するために写真を渡します。エディタが URI の読み取り権限を処理します。これは、今後の Android リリースで新たに導入されるもので、エコシステム全体でサポートされる予定です。

以前: WRITE_CONTACTS を使用して直接書き込む(アプリが今後の Android リリースを対象とするようになると、SecurityException または権限拒否が発生します。)

 

// Requires android.permission.WRITE_CONTACTS
fun saveContactDirectly(context: Context, name: String, phone: String, account: Account) {
    val ops = arrayListOf(
        ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
            .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, account.type)
            .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, account.name)
            .build(),
        ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
            .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
            .withValue(
                ContactsContract.Data.MIMETYPE,
                ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE
            )
            .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, name)
            .build(),
        ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
            .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
            .withValue(
                ContactsContract.Data.MIMETYPE,
                ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE
            )
            .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, phone)
            .build()
    )
    context.contentResolver.applyBatch(ContactsContract.AUTHORITY, ops)
}

 

 

変更後: 連絡先エディタを開く(権限は不要)

 

fun saveContactWithEditor(
    context: Context,
    name: String,
    phone: String,
    account: Account,
    photoUri: Uri
) {
    val intent = Intent(Intent.ACTION_INSERT, ContactsContract.Contacts.CONTENT_URI).apply {
        putExtra(ContactsContract.Intents.Insert.NAME, name)
        putExtra(ContactsContract.Intents.Insert.PHONE, phone)
        // Suggest which account the contact is saved to
        putExtra(ContactsContract.Intents.Insert.EXTRA_ACCOUNT, account)
        // New in the upcoming Android release: pre-fill the contact photo
        putExtra(ContactsContract.Intents.Insert.EXTRA_PHOTO_URI, photoUri)
        clipData = ClipData.newRawUri("", photoUri)
        addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
    }
    context.startActivity(intent)
}

 

以前: 既存の連絡先を直接更新する

 

// Requires android.permission.WRITE_CONTACTS
fun addPhoneDirectly(context: Context, rawContactId: Long, phone: String) {
    val values = ContentValues().apply {
        put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId)
        put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
        put(ContactsContract.CommonDataKinds.Phone.NUMBER, phone)
    }
    context.contentResolver.insert(ContactsContract.Data.CONTENT_URI, values)
}

更新する連絡先を選択するか、新しい連絡先を作成するかをユーザーが選択できるようにした後

fun addPhoneWithEditor(context: Context, phone: String) {
    val intent = Intent(Intent.ACTION_INSERT_OR_EDIT).apply {
        type = ContactsContract.Contacts.CONTENT_ITEM_TYPE
        putExtra(ContactsContract.Intents.Insert.PHONE, phone)
    }
    context.startActivity(intent)
}

更新する連絡先がすでにわかっている場合は、その連絡先の URI を指定して ACTION_EDIT を使用します。

fun editKnownContact(context: Context, contactUri: Uri, phone: String) {
    val intent = Intent(Intent.ACTION_EDIT, contactUri).apply {
        putExtra(ContactsContract.Intents.Insert.PHONE, phone)
    }
    context.startActivity(intent)
}

 

連絡先を選択する: 連絡先選択ツールを使用する

ユーザーが選択した連絡先のみを読み取る必要がある場合は、Android 17 以降で利用可能な連絡先選択ツールを使用します。権限は必要ありません。

通話アプリとメッセージ アプリ: ユーザー ディレクトリを使用する

一部のアプリでは、連絡先に「…で通話」または「…でメッセージ」アクションを追加して、ユーザーが電話アプリや連絡帳アプリから通話やチャットを開始できるようにしています。アプリで現在、ユーザーの連絡先に追加のエントリを書き込むことでこの処理を行っている場合は、Android QPR2(2026 年第 4 四半期)で導入される People Directory に移行してください。これは、ユーザーの連絡先を編集することなく、アプリ内でユーザーが互いに連絡を取る方法をアプリが公開する新しいシステム ディレクトリです。

アプリの移行方法の例

これらの代替手段が実際にどのように機能するかを確認するために、さまざまな種類のアプリが連絡先へのアクセスにどのようにアプローチできるかを示す例をいくつかご紹介します。

アプリタイプの例(これらに限定されません)。推奨される移行パス
ソーシャル、P2P 決済、ライドシェアリング アプリアプリでユーザーが友だちを見つけたり、割り勘にしたり、移動状況を共有したりできるようにする場合、連絡先へのアクセス許可はまったく必要ありません。1 回限りの連絡先の選択には連絡先選択ツールを使用し、ユーザーがプロフィールで [連絡先に保存] をタップしたときに EXTRA_PHOTO_URI を指定して ACTION_INSERT を起動します。
名刺スキャナーとイベント ネットワーキング アプリアプリがバッジや QR コードをスキャンして新しい連絡先を保存する場合や、既存の同僚のエントリに仕事用の電話番号を追加する場合は、ACTION_INSERT または ACTION_INSERT_OR_EDIT を使用します。標準化されたハーフシート エディタは、解析されたフィールド(名前、会社、電話番号、メールアドレス、写真)を事前入力するため、ユーザーはバックグラウンド権限を付与することなく、1 回のタップで確認して保存できます。
VoIP 通話、メッセージ アプリWRITE_CONTACTS にリクエストしてカスタムの「...で通話」または「...でメッセージ」行をユーザーのアドレス帳に挿入するのではなく、People Directory を通じて到達可能性メタデータを公開し、ユーザーがチャット スレッドから新しい連絡先を追加するときに ACTION_INSERT を使用します。
エンタープライズ CRM とクラウド同期アプリアプリがクラウドまたは企業アカウントと双方向のバックグラウンド連絡先同期を継続的に実行する場合(すべてのレコードに対してインテント UI をユーザーに表示することが不可能な場合)、アプリは MANAGE_CONTACTS  を宣言する資格があります。

確認する変更点

  • カスタム データ型はエディタではサポートされていません。標準の ContactsContract.CommonDataKinds タイプ以外の MIME タイプを含む Insert.DATA 行を渡すと、それらの MIME タイプはエディタによって無視されます。
  • SHOW_OR_CREATE_CONTACT はシステム エディタで処理されません。デバイスにプリインストールされている連絡帳アプリは、引き続きこのインテントを処理できます。デバイス間で一貫した動作を実現するには、ACTION_INSERT_OR_EDIT を使用します。
  • デフォルトでは書き込みが失敗します。今後の Android リリースをターゲットにすると、MANAGE_CONTACTS を使用しない直接書き込みは SecurityException or permission denial になります。テストします。

MANAGE_CONTACTS は必要ですか?

おそらく、そうではありません。ユーザーのリクエストに応じてアプリが連絡先を保存または編集する場合は、上記のインテントで対応できます。権限は不要で、Google Play Console での申告も必要ありません。

MANAGE_CONTACTS は、連絡先の管理を主な目的とするアプリで、インテントでは不十分な場合に使用します。次に例を示します。

アプリの要件MANAGE_CONTACTSが必要ですか?
チャット、名刺、注文から連絡先を保存します。いいえ。ACTION_INSERT を使用してください。
既存の連絡先に電話番号またはメールアドレスを追加します。いいえ。ACTION_INSERT_OR_EDIT または ACTION_EDIT を使用します。
ユーザーが招待、共有、支払いの対象となる連絡先を選択できるようにします。いいえ。連絡先選択ツールを使用します。
連絡先に通話またはメッセージのアクションを追加します。いいえ、People Directory を使用します
独自のブランドの連絡先編集画面がある。いいえ。カスタム インターフェースだけでは、
専用の連絡先管理アプリまたはダイヤラー代替アプリである。おそらくはい
アドレス帳のエントリを一括更新する発信者番号 / スパム対策アプリ。おそらくはい
バックグラウンドで連絡先を企業アカウントまたはクラウド アカウントと同期します。おそらくはい
連絡先の一括バックアップ/復元、またはデバイス間のスマートフォン転送を実行します。おそらくはい
個々の連絡先にカスタムの着信音を設定します。おそらくはい

仕組み:

  • MANAGE_CONTACTS は特別なアプリアクセス権限です。これはランタイム ダイアログではありません。ユーザーは、[設定] > [特別なアプリアクセス] > [連絡先の管理] でこの機能をオンにします。
// Opens Settings > Apps > Special app access > Manage contacts
val intent = Intent(Settings.ACTION_MANAGE_CONTACTS, Uri.fromParts("package", packageName, null))
context.startActivity(intent)
  • 連絡先、アカウント、People Directory データの読み取り、追加、編集、削除が含まれます。READ_CONTACTS をリクエストする必要もありません。
  • MANAGE_CONTACTS を使用して Google Play で公開するには、インテントではアプリのコア機能に不十分な理由を説明する申告を Google Play Console で送信します。

移行手順

  • 連絡先の書き込みを見つけます。コード内で WRITE_CONTACTS、ContactsContract.RawContacts.CONTENT_URI、ContactsContract.Data.CONTENT_URI、applyBatch(ContactsContract.AUTHORITY, …) を検索します。
  • ユーザー主導の書き込みをインテントに置き換えます。新しい連絡先の場合は ACTION_INSERT、更新の場合は ACTION_EDIT または ACTION_INSERT_OR_EDIT に置き換えます。
  • Insert.DATA では、標準のデータ型のみを使用します。通話またはメッセージのアクションを People Directory に移動します。
  • 上記の表を使用して、MANAGE_CONTACTS が本当に必要かどうかを判断します。 該当する場合は、Google Play Console での申告を計画してください。
  • コードパスで必要なくなったら、マニフェストから WRITE_CONTACTS を削除 します。

タイムライン

日付結果
2026 年 10 月 21 日Google Play が MANAGE_CONTACTS ポリシーを発表
2026 年(Android 17 四半期プラットフォーム リリース 2)MANAGE_CONTACTS 権限が利用可能になる
2027(今後の Android リリース)WRITE_CONTACTS は、今後の Android リリースをターゲットとするアプリに書き込みアクセス権を付与しなくなります。連絡先インテントはデバイス間で標準化されている
2027 年(次回の Android リリースより前ではない)Google Play Console で、MANAGE_CONTACTS を使用するアプリに申告の提出を求める
2027 年(次回の Android リリースより前ではない)Google Play のポリシーに準拠する必要があります

よくある質問

  • これはすべてのアプリに影響しますか?
    • WRITE_CONTACTS のサポート終了の変更は、今後の Android リリース以降を対象とするアプリにのみ適用されます。古いバージョンをターゲットとするアプリは、現在の動作を維持します。ただし、新しい標準化された連絡先エディタは、ターゲット SDK に関係なく、新しい OS で実行されているすべてのアプリで利用できます。
  • アプリでインテントを使用して連絡先を削除できますか?
    • いいえ。連絡先を削除するためのインテントはありません。ユーザーは連絡帳アプリで連絡先を削除します。MANAGE_CONTACTS を持つアプリは、連絡先を直接削除できます。
  • 独自の連絡先編集画面がすでにあります。このままにしておいてもよいですか?
    • アプリが MANAGE_CONTACTS の対象である場合にのみ適用されます。カスタム デザインを維持したいという理由だけでは、この権限にアクセスする理由としては認められません。
  • MANAGE_CONTACTS は READ_CONTACTS に代わるものですか?
    • MANAGE_CONTACTS には読み取りアクセス権が含まれているため、両方をリクエストする必要はありませんが、多くのアプリは READ_CONTACTS の対象となり、連絡先を変更する必要はまったくありません。これらのアプリは引き続き READ_CONTACTS をリクエストできます。
  • 古い Android バージョンを使用しているユーザーはどうなりますか?
    • 連絡先インテントは、デバイスの連絡帳アプリによって処理され、古いバージョンでも動作します。ほとんどのアプリは、これらのインテントを使用するすべてのデバイスで問題なく動作します。最新バージョンでのみ解決される特定の整合性の問題がアプリに影響する場合は、マニフェストで WRITE_CONTACTS 権限を保持し、適切な maxSdkVersion を指定できます。
作成者:
続きを読む