2017-12-13 12 views
1

Ich versuche, für jede Telefonnummer, die allen Kontakten in der Android-Kontaktliste zugeordnet ist, unformatierte Kontakte hinzuzufügen. Wenn bestimmten Kontakten mehrere Telefonnummern zugeordnet sind, zeigt die Android-Kontaktliste den gleichen Kontakt mehrmals an. Ich möchte diese neu hinzugefügten Rohkontakte (basierend auf der Telefonnummer) aggregieren und unter diesem Kontakt anzeigen.Kontakte werden beim Hinzufügen eines unverarbeiteten Kontakts basierend auf der Telefonnummer dupliziert.

Was ich tat, ist, abgefragt ich alle Kontakte im Gerät zur Liste von unten URI ContactsContract.Contacts.CONTENT_URI
erneut abgefragt alle Telefonnummern von jedem der durch die Ausführung über Abfrage zurück Kontakte mit dem URI

ContactsContract.CommonDataKinds.Phone.CONTENT_URI 

Anschließend wird ClsContactList class objects für jeden Kontakt erstellt, der den Anzeigenamen des Kontakts und ein Array von Telefonnummern enthält, die diesem Kontakt zugeordnet sind. Schließlich werden diese Objekte zu einer Liste und für jedes Objekt in der Liste hinzugefügt, die als angehängte Funktion zum Erzeugen eines Rohkontakts bezeichnet wird.

private static void addContact(Account account, ClsContactList ObjContact) { 
    ArrayList<ContentProviderOperation> operationList = new ArrayList<ContentProviderOperation>(); 
    int rawContactInsertIndex = operationList.size(); 
    for (String phoneNumber : ObjContact.PhoneNumbers) { 
     operationList.clear(); 
     //Creating raw contact 
     ContentProviderOperation.Builder builder = ContentProviderOperation.newInsert(RawContacts.CONTENT_URI); 
     builder.withValue(RawContacts.ACCOUNT_NAME, account.name); 
     builder.withValue(RawContacts.ACCOUNT_TYPE, account.type); 
     builder.withValue(ContactsContract.RawContacts.AGGREGATION_MODE, RawContacts.AGGREGATION_MODE_DEFAULT); 
     //builder.withValue(RawContacts.SYNC1, ObjContact.getDisplay_name()); 
     operationList.add(builder.build()); 
     //INSERT NAME 
     builder = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI); 
     builder.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactInsertIndex); 
     builder.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE); 
     builder.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, ObjContact.getDisplay_name()); 
     operationList.add(builder.build()); 

     //INSERT MOBILE 
     builder = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI); 
     builder.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactInsertIndex); 
     builder.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE); 
     builder.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, phoneNumber); // Number of the person 
     //builder.withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE); 
     operationList.add(builder.build()); 

     builder = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI); 
     builder.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactInsertIndex); 
     builder.withValue(ContactsContract.Data.MIMETYPE, "vnd.android.cursor.item/vnd.org.c99.SyncProviderDemo.profile"); 
     builder.withValue(ContactsContract.Data.DATA1, "VOIP Call ("+phoneNumber+")"); 
     builder.withValue(ContactsContract.Data.DATA2, "Dialer App"); 
     builder.withYieldAllowed(true); 
     operationList.add(builder.build()); 
     try { 
      mContentResolver.applyBatch(ContactsContract.AUTHORITY, operationList); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Bitte werfen Sie einen Blick auf den beigefügten Screenshot. Vielen Dank im Voraus.

Raw Kontakte in Kontaktdaten Aktivität

enter image description here

Kontakte in Android-Kontaktliste

enter image description here

Antwort

0

Sie müssen dupliziert wie diese zur Abfrage der gefilterten Daten zu erhalten, indem Sie den MIME-Typ zu vergleichen .

ContactsContract.Data.MIMETYPE = StructuredPostal.CONTENT_ITEM_TYPE

Cursor cursor = cr.query(ContactsContract.Data.CONTENT_URI, 
    null, null, ContacsContract.Data.MIMETYPE + "='" + 
ContactsContract.StructuredPostal.CONTENT_ITEM_TYPE + "'", null); 
+0

Vielen Dank für Ihre Antwort. In meinem Fall ist das Problem die Verdopplung des Kontakts beim Hinzufügen des rohen Kontakts. Wie im beigefügten Screenshot wurde Contact mit dem Namen "Aaaaaa" dupliziert, da er zwei Telefonnummern hat. Hier versuche ich, rohe Kontakte für jede Telefonnummer hinzuzufügen, die mit "Aaaaaa" verknüpft ist. –

Verwandte Themen