2015-05-27 19 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 appJak pokazać niestandardowy typ kontaktu wewnątrz kontaktowych, takich jak WhatsApp android

Problem - Obecnie kod jest dodanie nowego kontaktu, ale nie łączenie go do istniejącego kontaktu w oparciu o numer telefonu. Czy jest coś, co muszę zrobić przed dodaniem kontaktu? Chciałbym wyświetlać moje konto aplikacji w aplikacji Kontakt jak w aplikacji Whats.

Zaimplementowałem SyncService, SyncAdapter, Authenticator, contacts.xml i inne klasy wymagane dla projektu. Jedyną rzeczą, która nie działa, jest wyświetlanie kontaktu w domyślnej aplikacji Kontakt, zamiast tworzenia nowego kontaktu.

<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 sekcja ** "Niestandardowe wiersze danych" ** – pskink

+0

Czy można to osiągnąć? Szukam tego samego rozwiązania! – MohanRaj

+0

@Skorpion Szukam tego samego rozwiązania, możesz mi pomóc? – Spynet

Odpowiedz

0

miałem ten sam problem na Androidzie 6.1 i jak słyszałem, ten problem występuje od Lollipop. Każda implementacja w Internecie pokazuje, że dopasowanie kontaktów powinno działać w oparciu o numer telefonu. I działa na wcześniejszych systemach - próbowałem go na KitKat i działa jak urok. Ale ponieważ kontakty z Androidem 5.0 nie pasują w jakiś sposób.

Na szczęście numer telefonu nie jest jedynym parametrem, od którego zależy dopasowanie - istnieje również displayname. Zatem realizacja pracy powinien wyglądać następująco:

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

    } 

opuściłem PhoneNumber w przypadku kontaktu nie ma żadnego DisplayName - wtedy byłoby przynajmniej mecz na wcześniejszych wersjach Androida.

+0

służy do dodawania nowego kontaktu ..... ale chcę zaktualizować istniejący kontakt z moim nowym typem MIME (ikona) .... jak mogę to osiągnąć ??? każda pomoc ... Dziękuję ..... – Ramaraju

+0

To jest rzeczywiście dodanie konta z twoim typem MIME. Zostałby wyświetlony tak jak w przykładzie WhatsApp - jako inny typ konta, ale w ramach tego samego kontaktu – antrd