2010-06-20 15 views
45

से संपर्क नाम पुनर्प्राप्त करें मैं आने वाले टेलीफोन नंबर से जुड़े संपर्क का नाम पुनर्प्राप्त करना चाहता हूं। जैसा कि मैं आने वाले कॉलर के नाम के साथ स्ट्रिंग वाले ब्रोसाकास्ट्रेसीवर में आने वाली संख्या को संसाधित करता हूं, मेरी परियोजना को बहुत मददगार होगा।एंड्रॉइड: फोन नंबर

मुझे लगता है कि इसमें फ़िल्टर के रूप में एसक्यूएल WHERE क्लॉज का उपयोग करके एक क्वेरी शामिल है, लेकिन क्या मुझे संपर्कों को सॉर्ट करने की आवश्यकता है? एक उदाहरण या संकेत महान सहायता होगी।

+0

सुविधा के लिए प्राप्त करने के लिए दूसरों के, मैंने एक पोस्ट लिखा है जिसमें सभ्य स्पष्टीकरण के साथ नाम, फोटो, संपर्क आईडी इत्यादि के लिए पूरा कोड शामिल है। कोड में अलग-अलग उत्तरों पर पाए गए स्निपेट होते हैं, लेकिन अधिक व्यवस्थित और परीक्षण किए जाते हैं। लिंक: http://hellafun.weebly.com/home/get-information-of-a-contact-from-number – Usman

उत्तर

60

इसके लिए आपको अनुकूलित फोन लुकअप प्रदाता का वर्णन करने की आवश्यकता है।

AndroidManifest.xml करने की अनुमति जोड़ें:

<uses-permission android:name="android.permission.READ_CONTACTS"/> 

तब:

public String getContactName(final String phoneNumber, Context context) 
{ 
    Uri uri=Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI,Uri.encode(phoneNumber)); 

    String[] projection = new String[]{ContactsContract.PhoneLookup.DISPLAY_NAME}; 

    String contactName=""; 
    Cursor cursor=context.getContentResolver().query(uri,projection,null,null,null); 

    if (cursor != null) { 
     if(cursor.moveToFirst()) { 
      contactName=cursor.getString(0); 
     } 
     cursor.close(); 
    } 

    return contactName; 
} 
+0

देव पृष्ठ से ठीक है, त्वरित प्रतिक्रिया के लिए धन्यवाद। उरी में ToString() विधि को इस क्वेरी को संपर्क नाम में परिवर्तित करना चाहिए? –

+1

नहीं, आपको कर्सर को स्वयं हल नहीं करना पड़ेगा। कुछ मदद के लिए इन सवालों की जांच करें: http: // stackoverflow।कॉम/प्रश्न/903343/कर्सर-get-the-field-value-android – Pentium10

+1

मैं यूआरआई का उपयोग कर एक प्रबंधितकर्ता के साथ एक कर्सर प्रारंभ करूंगा, फिर कर्सर को मुट्ठी स्थिति में ले जाएं और डेटा प्राप्त करें? एक बार जब मैं पहली स्थिति में कर्सर प्राप्त करता हूं तो मैं getString का उपयोग करता हूं? मुझे लगता है कि पहली स्थिति सही होगी क्योंकि क्वेरी एक संख्या के लिए है इसलिए क्वेरी केवल उस नंबर के लिए नाम खींच जाएगी? –

24

यह काफी मददगार था, यहाँ फोन करने वाले का नाम, आईडी पुन: प्राप्त करने के लिए अपने अंतिम कोड है, और फोटो:

private void uploadContactPhoto(Context context, String number) { 

Log.v("ffnet", "Started uploadcontactphoto..."); 

String name = null; 
String contactId = null; 
InputStream input = null; 

// define the columns I want the query to return 
String[] projection = new String[] { 
     ContactsContract.PhoneLookup.DISPLAY_NAME, 
     ContactsContract.PhoneLookup._ID}; 

// encode the phone number and build the filter URI 
Uri contactUri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number)); 

// query time 
Cursor cursor = context.getContentResolver().query(contactUri, projection, null, null, null); 

if (cursor.moveToFirst()) { 

    // Get values from contacts database: 
    contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.PhoneLookup._ID)); 
    name =  cursor.getString(cursor.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME)); 

    // Get photo of contactId as input stream: 
    Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long.parseLong(contactId)); 
    input = ContactsContract.Contacts.openContactPhotoInputStream(context.getContentResolver(), uri); 

    Log.v("ffnet", "Started uploadcontactphoto: Contact Found @ " + number);    
    Log.v("ffnet", "Started uploadcontactphoto: Contact name = " + name); 
    Log.v("ffnet", "Started uploadcontactphoto: Contact id = " + contactId); 

} else { 

    Log.v("ffnet", "Started uploadcontactphoto: Contact Not Found @ " + number); 
    return; // contact not found 

} 

// Only continue if we found a valid contact photo: 
if (input == null) { 
    Log.v("ffnet", "Started uploadcontactphoto: No photo found, id = " + contactId + " name = " + name); 
    return; // no photo 
} else { 
    this.type = contactId; 
    Log.v("ffnet", "Started uploadcontactphoto: Photo found, id = " + contactId + " name = " + name); 
} 

... फिर बस "इनपुट" (उनकी तस्वीर को इनपुटस्ट्रीम के रूप में) के साथ जो भी आप चाहते हैं, करें "na मैं ", और" contactId "।

और यहाँ, ~ 15 या तो कॉलम आप की पहुंच है लिस्टिंग डॉक्स सिर्फ कोड की शुरुआत ऊपर से ऊपर के पास प्रक्षेपण के लिए उन्हें जोड़ने: http://developer.android.com/reference/android/provider/ContactsContract.PhoneLookup.html

83

इस हालांकि पहले से ही उत्तर दिया गया है, लेकिन संख्या से संपर्क नाम प्राप्त करने के लिए यहां पूरा कार्य है। आशा है कि यह दूसरों की मदद करेगा:

आप इस अनुमति के लिए पूछने करना होगा [मार्कस की टिप्पणी के आधार पर अपडेट कर रहा है]

public static String getContactName(Context context, String phoneNumber) { 
    ContentResolver cr = context.getContentResolver(); 
    Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber)); 
    Cursor cursor = cr.query(uri, new String[]{PhoneLookup.DISPLAY_NAME}, null, null, null); 
    if (cursor == null) { 
     return null; 
    } 
    String contactName = null; 
    if(cursor.moveToFirst()) { 
     contactName = cursor.getString(cursor.getColumnIndex(PhoneLookup.DISPLAY_NAME)); 
    } 

    if(cursor != null && !cursor.isClosed()) { 
     cursor.close(); 
    } 

    return contactName; 
} 

:

<uses-permission android:name="android.permission.READ_CONTACTS"/>

+0

यह गतिविधि को फिर से शुरू करते समय ऐप को "ज़िम्मेदार नहीं" बनाता है। मुझे यह कैसे करना चाहिए – myatmins

+0

मैं एंड्रॉइड 5.1 –

+0

पर हर बार एएनआर प्राप्त कर रहा हूं, शायद एएनआर के लिए आपको इसे यूआई थ्रेड के अलावा किसी थ्रेड पर चलाने की आवश्यकता है। – Marc

2

इस संस्करण के रूप में ही है ANR

interface GetContactNameListener { 
    void contactName(String name); 
} 

public void getContactName(final String phoneNumber,final GetContactNameListener listener) { 
    new Thread(new Runnable() { 
     @Override 
     public void run() { 
      ContentResolver cr = getContentResolver(); 
      Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber)); 
      Cursor cursor = cr.query(uri, new String[]{ContactsContract.PhoneLookup.DISPLAY_NAME}, null, null, null); 
      if (cursor == null) { 
       return; 
      } 
      String contactName = null; 
      if(cursor.moveToFirst()) { 
       contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME)); 
      } 

      if(cursor != null && !cursor.isClosed()) { 
       cursor.close(); 
      } 

      listener.contactName(contactName); 
     } 
    }).start(); 

} 
से बचने के लिए कोड के साथ विक्रम.एक्सई का जवाब
1

उस संपर्क नंबर को पारित करें जिससे आप निम्न विधि में कॉल प्राप्त कर रहे हैं। यह विधि जांच करेगी कि संपर्क आपके मोबाइल में सहेजा गया है या नहीं। संपर्क सहेजा जाता है तो यह संपर्क नाम वापस आ जाएगी, अन्यथा यह एक स्ट्रिंग की संख्या ज्ञात नहीं

वापस लौटकर अपना प्रसारण रिसीवर कक्षा में यह कोड जोड़ें

public String getContactDisplayNameByNumber(String number,Context context) { 
    Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number)); 
    name = "Incoming call from"; 

    ContentResolver contentResolver = context.getContentResolver(); 
    Cursor contactLookup = contentResolver.query(uri, null, null, null, null); 

    try { 
     if (contactLookup != null && contactLookup.getCount() > 0) { 
      contactLookup.moveToNext(); 
      name = contactLookup.getString(contactLookup.getColumnIndex(ContactsContract.Data.DISPLAY_NAME)); 
      // this.id = 
      // contactLookup.getString(contactLookup.getColumnIndex(ContactsContract.Data.CONTACT_ID)); 
      // String contactId = 
      // contactLookup.getString(contactLookup.getColumnIndex(BaseColumns._ID)); 
     }else{ 
      name = "Unknown number"; 
     } 
    } finally { 
     if (contactLookup != null) { 
      contactLookup.close(); 
     } 
    } 

    return name; 
} 

स्रोत कोड यात्रा this link

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