Contact Picker es una característica de Android que un desarrollador puede usar para pedir a los usuarios que seleccionen un contacto en particular. Luego, el desarrollador puede consultar los detalles relacionados con el contacto seleccionado y realizar la acción requerida. A continuación se muestra un video de muestra para tener una idea de lo que vamos a hacer en este artículo. Tenga en cuenta que vamos a implementar este proyecto utilizando el lenguaje Java .
Para que el usuario seleccione un contacto y proporcione a su aplicación acceso a toda la información de contacto, podemos usar la acción ACTION_PICK y pasar ContactsContract.Contacts.CONTENT_URI al Intent que se usará para crear la aplicación. Aquí está el constructor para Intent –
Intención (acción de string, Uri uri)
El resultado Intent se entrega a su devolución de llamada onActivityResult(int requestCode, int resultCode, Intent data) y contiene el contenido: URI que apunta al contacto seleccionado. La respuesta le otorga a su aplicación permisos temporales para leer ese contacto mediante la API del proveedor de contactos, incluso si su aplicación no incluye el permiso READ_CONTACTS . Podemos consultar el nombre para mostrar, tiene un número de teléfono, una identificación y muchos otros detalles relacionados con la tabla de contactos de Android utilizando el URI devuelto.
Notas:
- El número de teléfono o la dirección de correo electrónico del contacto no se pueden obtener mediante la tabla de contactos, ya que el número de contacto no está almacenado en esta tabla.
- Aunque la documentación establece que no requerimos el permiso READ_CONTACTS cuando usamos ACTION_PICK. Ha habido un error informado por algunos desarrolladores que afirman que en algunas versiones de Android, se requiere el permiso READ_CONTACTS cuando se usa ACTION_PICK . Verifique el problema .
Proyecto de ejemplo
Cree un nuevo proyecto en Android Studio. Seleccione Teléfono y tableta y elija Actividad vacía de las plantillas. En la siguiente pantalla, se le pedirá que proporcione detalles relacionados con su proyecto. Puede nombrar la aplicación y empaquetar lo que quiera. Aquí hemos llamado a la aplicación ContactPicker y al paquete com.geekforgeeks.android.contactpicker. Elija el idioma como Java y seleccione SDK mínimo para API 21 . Haga clic en finalizar.
Manifiesto de Android
Necesitaremos el permiso READ_CONTACTS . Necesitamos declarar este permiso en main/AndroidManifest.xml
AndroidManifest.xml
XML
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.geekforgeeks.android.contactpicker"> <!-- add READ_CONTACTS permission here --> <uses-permission android:name="android.permission.READ_CONTACTS"/> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.ContactPicker"> <activity android:name=".ContactPickerActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
Diseño
El diseño constará de dos botones. El primer botón abrirá la aplicación de contactos y el segundo botón mostrará el nombre del contacto seleccionado. A continuación se muestra una imagen del diseño final.
strings.xml
Antes de crear un diseño, agregue las siguientes strings en su res/values/strings.xml .
XML
<resources> <string name="app_name">ContactPicker</string> <!-- add the following constants --> <string name="contact_pick_text">Pick Contact</string> <string name="contact_name_text">Contact Name</string> </resources>
actividad_contacto_recogedor.xml
Ahora elimine todos los contenidos de res/layout/activity_contact_picker.xml y agregue esto.
XML
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".ContactPickerActivity"> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> <Button android:id="@+id/contact_pick" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/contact_pick_text" /> <Button android:id="@+id/contact_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/contact_name_text" /> </LinearLayout> </androidx.constraintlayout.widget.ConstraintLayout>
Actividad
Primero debemos solicitar el permiso READ_CONTACTS . Agregue un método hasContactsPermission() y requestContactsPermission() en java/com/geekforgeeks/android/contactpicker/ContactPickerActivity.java. Para obtener más detalles relacionados con cómo solicitar permiso, visite aquí .
Java
public class ContactPickerActivity extends AppCompatActivity { private static final int REQUEST_READ_CONTACTS_PERMISSION = 0; @Override protected void onCreate(Bundle savedInstanceState) { ... } private boolean hasContactsPermission() { return ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED; } // Request contact permission if it // has not been granted already private void requestContactsPermission() { if (!hasContactsPermission()) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, REQUEST_READ_CONTACTS_PERMISSION); } } }
En el método onCreate(Bundle SavedInstanceState) necesitamos hacer 4 cosas:
- Recupera ambos botones por id.
- Cree la intención de abrir la aplicación de contactos.
- Agregue un oyente al botón mPickContact que inicia la aplicación de contactos.
- Llame al método requestContactsPermission() .
Java
public class ContactPickerActivity extends AppCompatActivity { ... private static final int REQUEST_CONTACT = 1; private Button mContactPick; private Button mContactName; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_contact_picker); // Intent to pick contacts final Intent pickContact = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); mContactPick = findViewById(R.id.contact_pick); mContactName = findViewById(R.id.contact_name); mContactPick.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { startActivityForResult(pickContact, REQUEST_CONTACT); } }); requestContactsPermission(); } ... }
Agregue otro método updateButton (habilitación booleana) que habilitará o deshabilitará ambos botones dependiendo de si la aplicación tiene permiso de lectura de contactos o no. Esto evitará cualquier bloqueo en la aplicación.
Java
public class ContactPickerActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { ... updateButton(hasContactsPermission()); } public void updateButton(boolean enable) { mContactPick.setEnabled(enable); mContactName.setEnabled(enable); } ... }
Anular onRequestPermissionsResult(int requestCode, String[] permisos, int[] grantResults) que Android invocará automáticamente cuando nuestro usuario acepte o niegue el permiso de la aplicación para leer contactos. Es necesario hacerlo ya que dependiendo del resultado, debemos habilitar y deshabilitar ambos botones.
Java
public class ContactPickerActivity extends AppCompatActivity { ... @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_READ_CONTACTS_PERMISSION && grantResults.length > 0) { updateButton(grantResults[0] == PackageManager.PERMISSION_GRANTED); } } ... }
Para el paso final, invalide onActivityResult(int requestCode, int resultCode, Intent data) que Android invocará automáticamente. Comprobamos si el método se invoca para la constante REQUEST_CONTACT que pasamos a la intención. También verificamos si los datos devueltos no están vacíos. Recuperamos los datos y consultamos los campos que queremos recuperar. El resultado se obtiene en forma de cursor. Extraemos los datos requeridos del cursor y salimos.
Java
public class ContactPickerActivity extends AppCompatActivity { ... @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode != Activity.RESULT_OK) return; if (requestCode == REQUEST_CONTACT && data != null) { Uri contactUri = data.getData(); // Specify which fields you want // your query to return values for String[] queryFields = new String[]{ContactsContract.Contacts.DISPLAY_NAME}; // Perform your query - the contactUri // is like a "where" clause here Cursor cursor = this.getContentResolver() .query(contactUri, queryFields, null, null, null); try { // Double-check that you // actually got results if (cursor.getCount() == 0) return; // Pull out the first column of // the first row of data // that is your contact's name cursor.moveToFirst(); String name = cursor.getString(0); mContactName.setText(name); } finally { cursor.close(); } } } ... }
ContactPickerActivity
Aquí está el ContactPickerActivity.java completo
Java
package com.geekforgeeks.android.contactpicker; import android.Manifest; import android.app.Activity; import android.content.Intent; import android.content.pm.PackageManager; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.provider.ContactsContract; import android.view.View; import android.widget.Button; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; public class ContactPickerActivity extends AppCompatActivity { private static final int REQUEST_READ_CONTACTS_PERMISSION = 0; private static final int REQUEST_CONTACT = 1; private Button mContactPick; private Button mContactName; @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_READ_CONTACTS_PERMISSION && grantResults.length > 0) { updateButton(grantResults[0] == PackageManager.PERMISSION_GRANTED); } } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode != Activity.RESULT_OK) return; if (requestCode == REQUEST_CONTACT && data != null) { Uri contactUri = data.getData(); // Specify which fields you want your // query to return values for String[] queryFields = new String[]{ContactsContract.Contacts.DISPLAY_NAME}; // Perform your query - the contactUri // is like a "where" clause here Cursor cursor = this.getContentResolver() .query(contactUri, queryFields, null, null, null); try { // Double-check that you // actually got results if (cursor.getCount() == 0) return; // Pull out the first column // of the first row of data // that is your contact's name cursor.moveToFirst(); String name = cursor.getString(0); mContactName.setText(name); } finally { cursor.close(); } } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_contact_picker); // Intent to pick contacts final Intent pickContact = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); mContactPick = findViewById(R.id.contact_pick); mContactName = findViewById(R.id.contact_name); mContactPick.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { startActivityForResult(pickContact, REQUEST_CONTACT); } }); requestContactsPermission(); updateButton(hasContactsPermission()); } public void updateButton(boolean enable) { mContactPick.setEnabled(enable); mContactName.setEnabled(enable); } private boolean hasContactsPermission() { return ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED; } // Request contact permission if it // has not been granted already private void requestContactsPermission() { if (!hasContactsPermission()) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, REQUEST_READ_CONTACTS_PERMISSION); } } }
Producción:
Publicación traducida automáticamente
Artículo escrito por anujanonymous y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA