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); } }
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.
- ¿Por qué se censuran algunos contactos de las aplicaciones de Android?
- Cómo actualizar sólo los contactos en lugar de agregar en el adaptador de sincronización
- Leer todos los datos de contacto
- Android editar contacto
- ¿Cuál es la diferencia entre los contactos y los contactos crudos?
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>
- Android Contacts.CONTENT_STREQUENT_URI lanza SQLiteException en Android 4.1.2 y 4.4.2
- ¿Cómo encontrar y recopilar toda la información disponible en un contacto de dar en cualquier teléfono de Android?
- Obtener contactos de Android con funcionalidad de tipo a filtro, restringida a una cuenta específica
- Cómo crear un contacto programáticamente
- Consulta de contacto Android para obtener ACCOUNT_TYPE y ACCOUNT_NAME
- ¿Diferencia entre términos android?
- Visualización de contactos sólo con números de teléfono utilizando la intención ACTION_PICK en el dispositivo Android
- ¿Cómo puedo cargar una foto de contacto?
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.
- No se pudo resolver la dependencia androide activa en Gradle cuando Active Android se incluye en la biblioteca
- Cómo obtener el tipo mime en Cordova getPicture