2012-02-23 16 views
7

मैंने this प्रश्न और उत्तर देखा, लेकिन फोन की जानकारी (और यहां तक ​​कि ईमेल) जोड़ना अभी भी संपर्क जानकारी को ठीक से एकत्र नहीं करता है (जब मैं लोग ऐप की जांच करता हूं, तो मैं एक ही नाम के तहत कई प्रविष्टियां देख सकता हूं)।प्रोग्रामेटिक रूप से उन्हें जोड़ते समय आप संपर्कों को सही तरीके से कैसे प्राप्त करते हैं?

यहां कोड है जिसका उपयोग मैं परीक्षण करने के लिए करता हूं।

//get the account 
Account acct = null; 
Account[] accounts = AccountManager.get(getContext()).getAccounts(); 
for (Account acc : accounts){ 
    acct = acc; 
}//assuming there's only one account in there (in my case I know there is) 

//loop a few times, creating a new contact each time. In theory, if they have the same name they should aggregate 
for(int i=0; i<3; i++){ 
    ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); 
    ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI) 
       .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, acct.type) 
       .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, acct.name) 
       .withValue(ContactsContract.RawContacts.AGGREGATION_MODE, ContactsContract.RawContacts.AGGREGATION_MODE_DEFAULT) 
       .build()); 
    ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) 
       .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) 
       .withValue(ContactsContract.Data.MIMETYPE, 
         ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE) 
       .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, "ContactName") 
       .build()); 
    ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) 
       .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) 
       .withValue(ContactsContract.Data.MIMETYPE, 
         ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE) 
       .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, "1234567890") 
       .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, 1) 
       .build()); 
    ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) 
       .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) 
       .withValue(ContactsContract.Data.MIMETYPE, 
         ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE) 
       .withValue(ContactsContract.CommonDataKinds.Email.DATA, "[email protected]") 
       .withValue(ContactsContract.CommonDataKinds.Email.TYPE, 1) 
       .build()); 

    try{   
     getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); 
    } 
    catch (Exception e) { 
     Log.e("Contacts", "Something went wrong during creation! " + e); 
     e.printStackTrace(); 
    } 
} 
+0

क्या आपने पाया है कि जेनरेट किए गए संपर्कों को कैसे लिंक किया जाए, भले ही उनके नाम अलग हों? –

+0

@androiddeveloper क्षमा करें मैंने इस पर काम करना बंद कर दिया और कभी भी अच्छा जवाब नहीं मिला – Matt

+0

ठीक है, मुझे लगता है कि मुझे यह आपके नमूने का उपयोग करके काम कर रहा है, इसलिए मैंने एक उत्तर पोस्ट किया है। बात यह है कि इसने मुझे उन प्रश्नों के बारे में सोचा जो मुझे नहीं पता। –

उत्तर

8

वे स्वचालित रूप से एकत्रित नहीं कर रहे हैं, तो आप उन्हें मैन्युअल रूप से AggregationExceptions मेज पर एक पंक्ति जोड़कर समेकित कर सकते हैं। सुनिश्चित करें कि आप उन दस्तावेज़ों में नोटिस करते हैं जिन्हें सम्मिलित करने की अनुमति नहीं है। आपको इसके बजाय एक अद्यतन करना है। यह मुझे दो बार पकड़ा गया है। निम्नलिखित कोड आईडी के 1 और 2 के साथ दो कच्चे संपर्कों कुल चाहिए:

ContentValues cv = new ContentValues(); 
cv.put(AggregationExceptions.TYPE, AggregationExceptions.TYPE_KEEP_TOGETHER); 
cv.put(AggregationExceptions.RAW_CONTACT_ID1, 1); 
cv.put(AggregationExceptions.RAW_CONTACT_ID2, 2); 
getContentResolver().update(AggregationExceptions.CONTENT_URI, cv, null, null); 
+0

तो क्या हर बार जब मैं कोई संपर्क जोड़ूं तो मुझे इसे लागू करने की आवश्यकता होगी? जिस कार्यक्रम पर मैं काम कर रहा हूं वह बड़ी संख्या में संपर्क जोड़ देगा (कुछ या जिनमें से सभी पहले से मौजूद हो सकते हैं), तो इसका मतलब यह होगा कि प्रत्येक संपर्क के लिए मुझे जोड़ना होगा, मुझे सभी संपर्कों की आईडी को उसी के साथ देखना होगा नाम और इस अपवाद को जोड़ें? – Matt

+0

जहां तक ​​मुझे पता है कि यह बहुत गंभीर है। मेरा मानना ​​है कि वे या तो स्वचालित रूप से एकत्रित हो गए हैं, या आपको उन्हें मजबूर करना होगा। – Samuel

+0

यह सिर्फ मूर्खतापूर्ण लगता है कि फ़ोन के आसपास क्या करना है और मैन्युअल रूप से करना है। मैं सोच रहा हूं कि जिस तरह से मैं संपर्क जोड़ रहा हूं, वहां कुछ गड़बड़ होनी चाहिए। – Matt

1

यहाँ जोड़ने सहित एक संशोधित नमूना है, और प्रत्येक के लिए अलग-अलग डेटा के साथ, साबित होता है कि यह काम करता है:

Account acct = null; 
    Account[] accounts = AccountManager.get(this).getAccounts(); 
    for (Account acc : accounts) { 
     acct = acc; 
    } 
    //loop a few times, creating a new contact each time. In theory, if they have the same name they should aggregate 
    final ArrayList<Uri> newlyCreatedContactsUris = new ArrayList<>(); 
    for (int i = 0; i < 2; i++) { 
     ArrayList<ContentProviderOperation> ops = new ArrayList<>(); 
     ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI) 
       .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, acct == null ? null : acct.type) 
       .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, acct == null ? null : acct.name) 
       .withValue(ContactsContract.RawContacts.AGGREGATION_MODE, ContactsContract.RawContacts.AGGREGATION_MODE_DEFAULT) 
       .build()); 
     ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) 
       .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) 
       .withValue(ContactsContract.Data.MIMETYPE, 
         ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE) 
       .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, "ContactName" + i) 
       .build()); 
     ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) 
       .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) 
       .withValue(ContactsContract.Data.MIMETYPE, 
         ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE) 
       .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, Integer.toString(123456789 * (i + 1))) 
       .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, 1) 
       .build()); 
     ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) 
       .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) 
       .withValue(ContactsContract.Data.MIMETYPE, 
         ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE) 
       .withValue(ContactsContract.CommonDataKinds.Email.DATA, "email" + i + "@address.com") 
       .withValue(ContactsContract.CommonDataKinds.Email.TYPE, 1) 
       .build()); 

     try { 
      final ContentProviderResult[] contentProviderResults = getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); 
      newlyCreatedContactsUris.add(contentProviderResults[0].uri); 
      Log.d("AppLog", "done creating new contacts data"); 
     } catch (Exception e) { 
      Log.e("AppLog", "Something went wrong during creation! " + e); 
      e.printStackTrace(); 
     } 
    } 
    //Note: seems we can only link 2 contacts data together, not more 
    ArrayList<ContentProviderOperation> mergeOps = new ArrayList<>(); 
    mergeOps.add(ContentProviderOperation.newUpdate(ContactsContract.AggregationExceptions.CONTENT_URI) 
      .withValue(AggregationExceptions.TYPE, AggregationExceptions.TYPE_KEEP_TOGETHER) 
      .withValue(AggregationExceptions.RAW_CONTACT_ID1, newlyCreatedContactsUris.get(0).getLastPathSegment()) 
      .withValue(AggregationExceptions.RAW_CONTACT_ID2, newlyCreatedContactsUris.get(1).getLastPathSegment()) 
      .build()); 
    try { 
     final ContentProviderResult[] contentProviderResults2 = getApplicationContext().getContentResolver().applyBatch(ContactsContract.AUTHORITY, mergeOps); 
     Log.d("AppLog", "done merging"); 
    } catch (RemoteException e) { 
     e.printStackTrace(); 
    } catch (OperationApplicationException e) { 
     e.printStackTrace(); 
    } 

और परिणाम:

enter image description here

क्या मैं के बारे में निश्चित नहीं हूँ है:

+०१२३५१६४१०
  1. मौजूदा संपर्क डेटा कैसे प्राप्त करें और फिर निर्णय लें कि कौन सा विलय करना है? मैंने देखा है कि निर्मित संपर्क ऐप संपर्कों को मर्ज कर सकता है, लेकिन कभी-कभी उन्हें विलय नहीं किया जाता है जब मुख्य संपर्क मर्ज किए गए नाम का नाम लेगा। मैं यह कैसे करूंगा?
  2. संपर्क ऐप में कैसे आते हैं, यूआई का उपयोग करके एक ही चीज़ करने के विपरीत, अन-लिंक करने का कोई विकल्प नहीं है?
  3. यह कैसे तय करता है कि कौन सी जानकारी को प्रतिस्थापित करना है, जो जोड़ना है, इत्यादि ...?
  4. स्वचालित रूप से संपर्कों को मर्ज करने के नियम क्या हैं? ऐसा लगता है कि समान संपर्क नाम पर्याप्त है, लेकिन यह गलत मामलों में कर सकता है (क्योंकि अलग-अलग व्यक्तियों का नाम भी हो सकता है, यहां तक ​​कि अंतिम नाम भी शामिल है)।
  5. क्या कच्चे संपर्क आईडी के लिए "getLastPathSegment" का उपयोग करने का यह सही तरीका है?
संबंधित मुद्दे

 संबंधित मुद्दे