変更点
今後の 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 モックアップをご覧ください。
図 1: 新しい連絡先を作成する *UX は最終版ではありません*
図 2: 既存の連絡先に情報を追加する *UX は最終版ではありません*
注: デバイス メーカーによって、OS のスタイルに合わせてユーザー エクスペリエンスが変更される場合がありますが、動作は一貫しています。
インテントとともに、エクストラと呼ばれるオプションのデータ ペイロードを渡すことで、作成プロセスをさらに効率化できます。
EXTRA_ACCOUNTは、連絡先を保存するアカウントを提案します。これは、アプリが連絡先を同期する場合に役立ちます。このエクストラは以前から存在していましたが、サポートはデバイスによって異なっていました。今後の Android リリース以降、サポートはデバイス間で標準化されます。EXTRA_PHOTO_URIは、連絡先の写真を事前入力するために写真を渡します。エディタが URI の読み取り権限を処理します。これは、今後の Android リリースで新たに導入されるもので、エコシステム全体でサポートされる予定です。
以前:
// 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 を指定して 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 を指定できます。
- 連絡先インテントは、デバイスの連絡帳アプリによって処理され、古いバージョンでも動作します。ほとんどのアプリは、これらのインテントを使用するすべてのデバイスで問題なく動作します。最新バージョンでのみ解決される特定の整合性の問題がアプリに影響する場合は、マニフェストで
-
サービスに関する最新情報Google I/O 2026 で、Google は Android がオペレーティング システムからインテリジェンス システムに移行することを発表しました。また、システムでインテリジェントなエクスペリエンスをネイティブに構築し、Google の AI のパワーをアプリに組み込む方法もご紹介しました。
Jingyu Shi • 所要時間: 2 分 -
サービスに関する最新情報今年の Google I/O では、反復的な変更にとどまらず、アプリの構築方法の根本的な転換を目指します。Google の最新ツールは、エージェントの時代に合わせて構築されており、Android デベロッパーの生産性を高める機能と、コードベースにデプロイする AI エージェントを強化する機能を備えています。
Matthew Warner • 所要時間: 8 分 -
サービスに関する最新情報本日、The Android Show で発表されたとおり、Android はオペレーティング システムからインテリジェンス システムへと移行し、アプリのエンゲージメントを高める機会をさらに創出します。
Matthew McCullough • 所要時間: 4 分
Android 開発に関する最新の分析情報を毎週メールでお届けします。