2015-05-27 28 views
5
/** 
    * 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); 
     } 
    } 

I would like to show my app account same as whats appCome mostrare tipo personalizzato contatto all'interno di contatto come WhatsApp Android

Problema - Attualmente il codice è l'aggiunta di un nuovo contatto, ma non la fusione in contatto esistente in base al numero di telefono. C'è qualcosa che devo fare prima di aggiungere il contatto? Vorrei mostrare il mio account di app all'interno di Contatti come l'App di Whats.

Ho implementato SyncService, SyncAdapter, Authenticator, contacts.xml e altre classi richieste per il progetto. L'unica cosa che non funziona è mostrare il contatto all'interno dell'app Contatti predefinita invece di creare un nuovo contatto.

<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> 
+0

http://developer.android.com/guide/topics/providers/contacts-provider.html sezione ** "Righe di dati personalizzate" ** – pskink

+0

Potrebbe essere possibile ottenere ciò? Sto cercando la stessa soluzione! – MohanRaj

+0

@Scorpion Sto cercando la stessa soluzione, puoi aiutarmi? – Spynet

risposta

0

Ho avuto lo stesso problema su Android 6.1 e, come ho sentito, questo problema è presente dal Lollipop. Ogni implementazione sul web mostra che la corrispondenza dei contatti dovrebbe funzionare in base al numero di telefono. E funziona su sistemi precedenti: l'ho provato su KitKat e funziona come un fascino. Ma dal momento che i contatti Android 5.0 non corrispondono in qualche modo.

Fortunatamente il numero di telefono non è l'unico parametro da cui dipende la corrispondenza, c'è anche il nome visualizzato. Così l'attuazione di lavoro dovrebbe essere simile a questo:

// 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(); 
     } 

    } 

ho lasciato la phoneNumber nel caso in cui il contatto non ha alcun displayname - allora sarebbe almeno match di versioni di Android precedenti.

+0

questo è per aggiungere un nuovo contatto ..... ma voglio aggiornare il contatto esistente con il mio nuovo mimetype (icona) .... come posso ottenerlo ??? qualsiasi aiuto ... Grazie ..... – Ramaraju

+0

In realtà sta aggiungendo un account con il tuo mimetype. Sarebbe mostrato proprio come l'esempio di whatsapp - come un altro tipo di account ma all'interno dello stesso contatto – antrd