Como acessar os contatos do catálogo de endereços

Às vezes, você quer permitir que os usuários do app selecionem um dos contatos para enviar mensagens por e-mail ou aplicativo de chat, ou ajudar a descobrir quais contatos já fizeram parte de uma plataforma social.

Como usar a API Contact Picker

Para acessar contatos do catálogo de endereços, você precisa usar a API Contact Picker, que permite que os usuários selecionem entradas na lista de contatos e compartilhem detalhes limitados das entradas selecionadas com seu app. Várias propriedades, como name, email, tel, address e icon estão disponíveis. Para saber mais sobre as propriedades com suporte, chame navigator.contacts.getProperties(). Para permitir que o usuário selecione vários contatos, transmita {multiple: true} como o segundo parâmetro de navigator.contacts.select().

Compatibilidade com navegadores

  • x
  • x
  • x
  • x

Origem

A API Contact Picker está disponível na versão 80 do Chrome para Android.

A forma clássica

Como usar um formulário normal

O método substituto é usar um formulário normal que permita ao usuário inserir os detalhes do contato.

Compatibilidade com navegadores

  • 1
  • 12
  • 1
  • ≤4

Origem

Aprimoramento progressivo

Se a API Contact Picker tiver suporte, oculte os campos de formulário estáticos e mostre um botão do seletor.

const button = document.querySelector('button');
const name = document.querySelector('.name');
const address = document.querySelector('.address');
const email = document.querySelector('.email');
const tel = document.querySelector('.tel');
const pre = document.querySelector('pre');
const autofills = document.querySelectorAll('.autofill');

if ('contacts' in navigator) {
  button
.hidden = false;
 
for (const autofill of autofills) {
    autofill
.parentElement.style.display = 'none';
 
}
  address
.parentElement.style.display = 'block';
  button
.addEventListener('click', async () => {
   
const props = ['name', 'email', 'tel', 'address'];
   
const opts = { multiple: false };
   
try {
     
const [contact] = await navigator.contacts.select(props, opts);
      name
.value = contact.name;
      address
.value = contact.address;
      tel
.value = contact.tel;
      email
.value = contact.email;
   
} catch (err) {
      pre
.textContent = `${err.name}: ${err.message}`;
   
}
 
});
}

Leia mais

Demonstração

<!DOCTYPE html>
<html lang="en">
 
<head>
   
<meta charset="utf-8" />
   
<meta name="viewport" content="width=device-width, initial-scale=1" />
    <link
      rel="icon"
      href="data:image/svg+xml,
<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>🎉</text></svg>"
    />
   
<title>How to access contacts from the address book</title>
 
</head>
 
<body>
   
<h1>How to access contacts from the address book</h1>

   
<p>Ship your order as a present to a friend.</p>
   
<button hidden type="button">Open address book</button>
   
<pre></pre>

   
<label> Name <input class="name" autocomplete="name"></label>

   
<label hidden>Address <input class="address" required></label>

   
<label>Street <input class="autofill" autocomplete="address-line1" required></label>

   
<label>City <input class="autofill" autocomplete="address-level2" required></label>

   
<label>State / Province / Region (optional) <input class="autofill" autocomplete="address-level1"></label>

   
<label>ZIP / Postal code (optional) <input class="autofill" autocomplete="postal-code"></label>

   
<label>Country <input class="autofill" autocomplete="country"></label>

   
<label>Email<input class="email" autocomplete="email"></label>

   
<label>Telephone<input class="tel" autocomplete="tel"></label>
 
</body>
</html>

        html
{
 
box-sizing: border-box;
 
font-family: system-ui, sans-serif;
 
color-scheme: dark light;
}

*, *:before, *:after {
 
box-sizing: inherit;
}

body
{
 
margin: 1rem;
}

input
{
 
display: block;
 
margin-block-end: 1rem;
}
       

       
const button = document.querySelector('button');
const name = document.querySelector('.name')
const address = document.querySelector('.address')
const email = document.querySelector('.email')
const tel = document.querySelector('.tel')
const pre = document.querySelector('pre')
const autofills = document.querySelectorAll('.autofill')

if ('contacts' in navigator) {
  button
.hidden = false;
 
for (const autofill of autofills) {
    autofill
.parentElement.style.display = 'none'
 
}
  address
.parentElement.style.display = 'block';
  button
.addEventListener('click', async () => {
   
const props = ['name', 'email', 'tel', 'address'];
   
const opts = {multiple: false};
   
try {
     
const [contact] = await navigator.contacts.select(props, opts);
      name
.value = contact.name;
      address
.value = contact.address;
      tel
.value = contact.tel
      email
.value = contact.email;
   
} catch (err) {
      pre
.textContent = `${err.name}: ${err.message}`
   
}
 
});
}