Cómo mostrar personalizado tipo contacto dentro de Contacto como WhatsApp android

/** * Account type id */ public static final String ACCOUNT_TYPE = "com.test.app"; /** * Account name */ public static final String ACCOUNT_NAME = "Test"; public static void addContact(Context context, User contact) { ContentResolver resolver = context.getContentResolver(); resolver.delete(RawContacts.CONTENT_URI, RawContacts.ACCOUNT_TYPE + " = ?", new String[] { AccountConstants.ACCOUNT_TYPE }); ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); ops.add(ContentProviderOperation .newInsert( addCallerIsSyncAdapterParameter( RawContacts.CONTENT_URI, true)) .withValue(RawContacts.ACCOUNT_NAME, AccountConstants.ACCOUNT_NAME) .withValue(RawContacts.ACCOUNT_TYPE, AccountConstants.ACCOUNT_TYPE) // .withValue(RawContacts.SOURCE_ID, 12345) // .withValue(RawContacts.AGGREGATION_MODE, // RawContacts.AGGREGATION_MODE_DISABLED) .build()); ops.add(ContentProviderOperation .newInsert( addCallerIsSyncAdapterParameter(Settings.CONTENT_URI, true)) .withValue(RawContacts.ACCOUNT_NAME, AccountConstants.ACCOUNT_NAME) .withValue(RawContacts.ACCOUNT_TYPE, AccountConstants.ACCOUNT_TYPE) .withValue(Settings.UNGROUPED_VISIBLE, 1).build()); ops.add(ContentProviderOperation .newInsert( addCallerIsSyncAdapterParameter(Data.CONTENT_URI, true)) .withValueBackReference(Data.RAW_CONTACT_ID, 0) .withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE) .withValue(StructuredName.GIVEN_NAME, contact.getFullname()) .withValue(StructuredName.FAMILY_NAME, contact.getFullname()) .build()); ops.add(ContentProviderOperation .newInsert( addCallerIsSyncAdapterParameter(Data.CONTENT_URI, true)) .withValueBackReference(Data.RAW_CONTACT_ID, 0) .withValue( ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE) .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, contact.getPhoneNumber()).build()); ops.add(ContentProviderOperation .newInsert( addCallerIsSyncAdapterParameter(Data.CONTENT_URI, true)) .withValueBackReference(Data.RAW_CONTACT_ID, 0) .withValue( ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE) .withValue(ContactsContract.CommonDataKinds.Email.DATA, contact.getEmail()).build()); ops.add(ContentProviderOperation .newInsert( addCallerIsSyncAdapterParameter(Data.CONTENT_URI, true)) .withValueBackReference(Data.RAW_CONTACT_ID, 0) .withValue(Data.MIMETYPE, MIMETYPE) .withValue(Data.DATA1, contact.getFullname()) .withValue(Data.DATA2, contact.getEmail()) .withValue(Data.DATA3, contact.getHomeAddress()).build()); try { ContentProviderResult[] results = resolver.applyBatch( ContactsContract.AUTHORITY, ops); if (results.length == 0) AppLog.d(TAG, "Failed to add."); } catch (Exception e) { AppLog.e(TAG, e.getMessage(), e); } } 

Me gustaría mostrar mi cuenta de aplicación igual que whatsapp

Problema – Actualmente, el código agrega nuevo contacto pero no lo fusiona en el contacto existente basado en el número de teléfono. ¿Hay algo que tenga que hacer antes de agregar el contacto? Me gustaría mostrar mi cuenta de aplicación dentro de Contacto igual que WhatsApp.

He implementado SyncService, SyncAdapter, Authenticator, contacts.xml y otras clases necesarias para el proyecto. Lo único que no funciona es mostrar el contacto dentro de la aplicación de contacto predeterminada en lugar de crear un nuevo contacto.

 <ContactsSource xmlns:android="http://schemas.android.com/apk/res/android" > <ContactsDataKind android:detailColumn="data2" android:detailSocialSummary="true" android:icon="@drawable/ic_launcher" android:mimeType="vnd.android.cursor.item/com.test.app" android:summaryColumn="data3" /> </ContactsSource> 

Tuve el mismo problema en Android 6.1 y como he oído, este problema está presente desde Lollipop. Cada implementación en la web muestra que la coincidencia de contactos debe funcionar según el número de teléfono. Y funciona en sistemas anteriores – lo probé en KitKat y funciona como un encanto. Pero desde Android 5.0 contactos no coinciden de alguna manera.

Afortunadamente, el número de teléfono no es el único parámetro del que depende la coincidencia – también hay displayname. Así que la implementación de trabajo debería tener este aspecto:

 // as displayName pass the retrieved ContactsContract.Contacts.DISPLAY_NAME @Override public void addContact(@Nonnull final String displayName, @Nonnull final String phone) { final ContentResolver resolver = context.getContentResolver(); final ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); ops.add(ContentProviderOperation .newInsert(addCallerIsSyncAdapterParameter(ContactsContract.RawContacts.CONTENT_URI, true)) .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, ACCOUNT_NAME) .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, ACCOUNT_TYPE) .withValue(ContactsContract.RawContacts.AGGREGATION_MODE, ContactsContract.RawContacts.AGGREGATION_MODE_DEFAULT) .build()); ops.add(ContentProviderOperation .newInsert(addCallerIsSyncAdapterParameter(ContactsContract.Data.CONTENT_URI, true)) .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE) .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, phone) .build()); ops.add(ContentProviderOperation .newInsert(addCallerIsSyncAdapterParameter(ContactsContract.Data.CONTENT_URI, true)) .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE) .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, displayName) .build()); ops.add(ContentProviderOperation .newInsert(addCallerIsSyncAdapterParameter(ContactsContract.Data.CONTENT_URI, true)) .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) .withValue(ContactsContract.Data.MIMETYPE, YOUR_MIMETYPE) .withValue(ContactsContract.Data.DATA1, 12345) .withValue(ContactsContract.Data.DATA2, "user") .withValue(ContactsContract.Data.DATA3, "action") .build()); try { resolver.applyBatch(ContactsContract.AUTHORITY, ops); } catch (Exception e) { e.printStackTrace(); } } 

Dejé el número de teléfono en caso de que el contacto no tenga ningún nombre de pantalla – entonces al menos coincidiría con versiones anteriores de Android.

  • Cómo buscar Contactos con dirección (FORMATTED_ADDRESS) con una consulta?
  • Obtener el perfil de usuario / propietario de contacto URI y la imagen de usuario con API 8 en adelante
  • Busque contactos usando el nombre así como la empresa (como en la aplicación predeterminada de contactos de Android 2.3.3)
  • ContentObserver para actualización de contacto manualmente
  • Consultar contactos - SOMETIMES devuelve el cursor vacío
  • Recuperar número de teléfono de contacto de URI en Android
  • Distinto CONTACT_ID de ContactsContract.Data
  • ¿Cómo funcionan las columnas unidas implícitas con los datos de los contactos de Android?
  • ¿Cómo transmitir un contacto desde su aplicación (usando NFC) y guardarlo en la lista de contactos en el dispositivo receptor?
  • Obtener el nombre y el apellido de un contacto en lugar de un solo nombre para mostrar?
  • Obtención de un cursor SINGLE con detalles de nombre completo y números de teléfono
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.