La politique de Google Play concernant les autorisations de contacts signifie que, à partir du 27 janvier 2027, les applications ciblées vers Android 17 (API niveau 37) ou ultérieures ne peuvent demander que READ_CONTACTS if the Android Contact Picker cannot support a core feature, and must justify it with a Play Console declaration. For most Capacitor apps that read contacts to invite a friend, share a file or fill in a phone number, the fix is to switch to the Contact Picker and remove the permission. This guide explains the policy, shows how to do that with @capgo/capacitor-contacts, et couvre ce que faire si vous avez vraiment besoin du livre d'adresses complet.
Ce que la politique dit
Google a annoncé la politique le 15 avril 2026, dans le cadre d'une mise à jour de la vie privée. Les points clés, d'après les pages d'aide de Google Play Console :
- Portée : les applications ciblées vers Android 17 (API 37) ou supérieures et qui demandent
READ_CONTACTS. - Règle : vous pouvez demander
READ_CONTACTSsi le sélectionneur de contacts Android n'est pas suffisant pour une fonctionnalité de base de votre application. - Déclaration : les applications qui gardent la permission doivent remplir une déclaration dans Google Play Console en décrivant les fonctionnalités qui en ont besoin et pourquoi le sélectionneur n'est pas suffisant.
- Calendrier : Play Console a commencé à demander aux applications qui déclarent
READ_CONTACTSEn septembre 2026. La conformité est obligatoire le 27 janvier 2027. Google mentionne une extension de 30 jours de service auto dans le console Play. - Exemptions : private apps and enterprise device management apps are out of scope.
- Data : Les données de contacts sont personnelles et sensibles en vertu de la politique de données utilisateur, et vous ne pouvez pas publier les données de contacts non publiques sans autorisation des personnes qu'elles décrivent.
Utilisations qui peuvent conserver READ_CONTACTS
Google liste les fonctionnalités de base telles que les applications de gestion de contacts, les appels et les SMS, l'historique des appels et la détection des appels, les CRM, les fonctionnalités d'accessibilité, les assistants personnels, la correspondance d'amis, la sauvegarde et la restauration, et les claviers ou l'autocomplétion.
Utilisations qui devraient passer à l'outil de sélection
Inviter ou faire référence à quelqu'un, partager des fichiers, collaborer ou choisir un contact pour envoyer de l'argent. Si c'est pourquoi votre application lit les contacts, la déclaration ne sera pas acceptée. Utilisez l'outil de sélection.
Quels changements sur Android 17
Android 17 ships a new system Contact Picker. Apps get a temporary, read-only session URI that only exposes the contacts and fields the user selected, without any permission. For apps targeting Android 17, the system automatically upgrades the classic Intent.ACTION_PICK Sur les versions Android plus anciennes, la sélection d'une ligne de données spécifique (par exemple un numéro de téléphone) à l'aide du sélectionneur de contacts a toujours renvoyé une URI que l'application pouvait lire sans
On older Android versions, picking a specific data row (for example a phone number) through the contacts picker has always returned a URI the app can read without READ_CONTACTS. C'est ce qui rend possible un flux sans autorisation sur toutes les versions d'Android.
Pourquoi « choisir un contact » nécessitait-il jadis READ_CONTACTS.
Beaucoup de plugins Capacitor mettent en œuvre "choisir un contact" en ouvrant le sélecteur pour un contact complet, puis en interrogeant l'annuaire pour les numéros de téléphone et les adresses e-mail de ce contact. Cette deuxième requête nécessite READ_CONTACTSMême les applications qui ne voulaient déclarer qu'un seul numéro de téléphone ont fini par déclarer la permission, exactement ce que la politique cible.
La solution consiste à demander au sélecteur le champ spécifique dont vous avez besoin, afin que l'URI de résultat porte déjà les données.
Choisissez un téléphone, un e-mail ou une adresse sans READ_CONTACTS
@capgo/capacitor-contacts a ajouté une property option dans la version 8.1.0. Lorsque cette option est activée, Android ouvre le sélecteur contre la table des numéros de téléphone, des e-mails ou des adresses postales et lit la ligne sélectionnée à partir de l'URI concédé. READ_CONTACTS n'est plus nécessaire sur aucune version d'Android. Sur iOS, le sélecteur système ne nécessite jamais une autorisation contacts.
bun add @capgo/capacitor-contacts
bunx cap sync
import { CapacitorContacts, ContactProperty } from '@capgo/capacitor-contacts';
export async function pickPhoneNumber(): Promise<string | undefined> {
const { contacts } = await CapacitorContacts.pickContacts({
property: ContactProperty.PhoneNumber,
});
const picked = contacts[0];
return picked?.phoneNumbers?.[0]?.value;
}
export async function pickEmail(): Promise<string | undefined> {
const { contacts } = await CapacitorContacts.pickContacts({
property: ContactProperty.EmailAddress,
});
return contacts[0]?.emailAddresses?.[0]?.value;
}
Avec property, le résultat contient le contact id, displayName et la propriété sélectionnée uniquement. La sélection multiple est ignorée, la sélection de propriété retourne toujours une valeur. Si l'utilisateur annule, vérifiez une tableau vide.
The plugin ne déclare pas READ_CONTACTS ou WRITE_CONTACTS Dans son propre manifeste, votre manifeste fusionné reste donc propre si vous utilisez uniquement la sélection de propriétés.
When you still need READ_CONTACTS
Ces méthodes de plugin lisent l'annuaire et continuent à exiger la permission :
pickContacts()oupickContact()oupropertyLorsque vous souhaitez l'ensemble du dossier de contactgetContacts(),getContactById(),countContacts()getGroups(),getGroupById(),getAccounts()
If your app is a CRM, a backup tool or a friend matching feature, that is a legitimate core use. Add the permission yourself and file the declaration:
<!-- android/app/src/main/AndroidManifest.xml -->
<uses-permission android:name="android.permission.READ_CONTACTS" />
import { CapacitorContacts } from '@capgo/capacitor-contacts';
const perm = await CapacitorContacts.requestPermissions({ permissions: ['readContacts'] });
if (perm.readContacts === 'granted' || perm.readContacts === 'limited') {
const { contacts } = await CapacitorContacts.getContacts({
fields: ['displayName', 'phoneNumbers'],
limit: 200,
offset: 0,
});
console.log(contacts.length);
}
La politique cible READ_CONTACTSÉcrire des contacts avec WRITE_CONTACTS ou createContact, updateContactById, deleteContactByIdCe n'est pas l'objet de cette politique, mais ajoutez-l’uniquement si vous utilisez ces méthodes.
Plan de migration pour une application Capacitor
-
Effectuez une analyse du manifeste fusionné. Construisez votre version de production et ouvrez
android/app/build/intermediates/merged_manifest/(ou utilisez la vue Merged Manifest de Android Studio). Certains plugins ajoutentREAD_CONTACTSsans que vous vous en rendiez compte. Si un plugin l'ajoute et que vous n'en avez pas besoin, supprimez-l’avectools:node="remove":<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <uses-permission android:name="android.permission.READ_CONTACTS" tools:node="remove" /> </manifest> -
Listez tous les endroits où vous touchez les contacts. Pour chacun, décidez : un sélecteur avec une propriété, ou un livre d'adresses complet.
-
Remplacez les flux d'invitation et de partage par
pickContacts({ property }). -
Keep the permission only for core featureset préparez le texte de déclaration : quelle fonctionnalité, pourquoi un sélecteur n'est pas suffisant, un vidéo si la fonctionnalité est difficile à trouver.
-
Envoyez une mise en production native. Manifest and plugin changes need a new Play release. If you build in CI, Capgo Éditeur peut produire des builds Android signés, et le Générateur de clés de signature Android peut produire des builds Android signés, et le
-
Le générateur de clés Android Une fois le nouveau plugin natif en ligne, les ajustements de formulation et de flux autour du sélecteur peuvent être déployés. Capgo live updates.
Migrer depuis un autre plugin de contacts
Si vous utilisez @capacitor-community/contacts (8.0.0 à la date de rédaction), son Android pickContact La demande de groupe de permission de contacts avant d'ouvrir le sélecteur, puis lit le contact complet du carnet d'adresses. Il n'y a pas de propriété mode. Les noms de méthode diffèrent (getContact vs getContactById, objets de projection vs un fields tableau). Notre comparaison du plugin de contacts de la communauté et du plugin Capgo map chaque appel.
Si vous utilisez toujours un plugin de contacts Cordova à l'intérieur de Capacitor, maintenant est un bon moment pour le remplacer. Voir migrer de Cordova à Capacitor.
Troubleshooting
Le sélectionneur retourne un contact sans numéro de téléphone. Vous avez appelé pickContacts() without property et l'application n'a pas READ_CONTACTS. Seul id et displayName (chez Android 17+, les champs attribués par le picker) reviennent. Ajoutez property.
(et sur Android 17+, champs autorisés par le sélecteur) reviennent. Ajoutez Le console Play dit toujours que l'application déclare READ_CONTACTS. tools:node="remove"Une bibliothèque l'ajoute. Vérifiez le manifeste fusionné et supprimez-l’avec
La déclaration a été rejetée. Invites, referrals and sharing are listed as cases for the picker. Rework the feature or show clearly why the full list is core (for example friend matching that runs against the whole address book).
iOS demande l'autorisation d'accès aux contacts. Vous appelez une méthode qui lit l'annuaire d'adresses. Il n'est jamais nécessaire de le choisir. Supprimer NSContactsUsageDescription Si vous n'avez choisi que cela.
Dates clés
| Date | Ce qui se passe |
|---|---|
| 15 avril 2026 | Politique annoncée |
| Septembre 2026 | Play Console prompts apps declaring READ_CONTACTS à déposer une déclaration |
| 27 janvier 2027 | La conformité est obligatoire pour les applications ciblant Android 17 (API 37) ou ultérieur |
Vérifiez la page d'aide du Console Google Play avant de soumettre, Google peut mettre à jour les délais et les formulations.