2010-06-20 15 views
45

numaralı telefon numarasına ulaşın. Gelen bir telefon numarasıyla ilişkili bir kişinin ismini almak istiyorum. Gelen arayanın ismiyle bir dize sahip olan broascastreceiver'de gelen sayıyı işlediğimde, projeme büyük ölçüde yardımcı olurdum.Android: Telefon numarasından

Bunun bir filtre olarak sql WHERE yan tümcesini kullanarak bir sorguyu içerdiğini düşünür müsün, ancak kişileri sıralamalı mıyım? Bir örnek ya da ipucu büyük yardım olurdu.

+0

olsun diğerleri, iyi bir açıklama ile isim, fotoğraf, iletişim kimliği, vb sorgulamak için tüm kodu içeren bir yazı yazdım. Kod, farklı yanıtlarda bulunan, daha organize ve test edilmiş snippet'leri içerir. Link: http://hellafun.weebly.com/home/get-information-of-a-contact-from-number – Usman

cevap

60

Bunun için, açıklandığı gibi optimize edilmiş PhoneLookup sağlayıcısını kullanmanız gerekir.

AndroidManifest.xml izni ekleyin: Sonra

<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

Dev sayfanın hemen sağında, hızlı yanıt için teşekkürler. Uri'deki toString() yöntemi, bu sorguyu kişi adına dönüştürmeli? –

+1

Hayır, İmleci kendiniz çözmeniz gerekmeyecek. Bazı yardım için şu soruları kontrol edin: http: // stackoverflow.com/questions/903343/imleç-get-the-alan-değer-android – Pentium10

+1

URI kullanarak bir imleci bir manageQuery ile başlatır, sonra imleci yumruk pozisyonuna getirir ve veriyi alır mıyım? İmleci ilk pozisyona getirdiğimde getString kullanıyorum? Sorgu bir sayı için olduğu için ilk pozisyonun doğru olacağını varsayıyorum, bu nedenle sorgu sadece bu sayı için isimleri çekecek? –

24

Bu çok yardımcı oldu, burada arayanın ismi, id almak için benim son kod ve Fotoğraf:

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

... o zaman sadece "input" (bir InputStream olarak fotoğraf) ile istediğiniz şeyi yapın ben "ve" contactId ".

Ve burada sadece yukarı yukarıdaki kod başlangıcında yakın projeksiyon ekleyebilir erişime sahip olduğunuz ~ 15 ya da öylesine sütunları listeleme dokümanlar şunlardır: Bu rağmen http://developer.android.com/reference/android/provider/ContactsContract.PhoneLookup.html

83

zaten yanıtlanmış, ancak Burada kişi ismini numaradan almak için tam fonksiyon.

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

+0

aktiviteyi sürdürürken uygulamayı "sorumlu değil" yapar. Bunu nasıl yapmalıyım – myatmins

+0

Ayrıca Android 5.1'de çalıştırdığım her zaman ANR alıyorum –

+0

ANR için muhtemelen UI iş parçacığı dışında bir iş parçacığında çalıştırmanız gerekiyor. – Marc

2

Bu sürüm ile aynıdır: Bu izin istemek zorunda kalacak

[Marcus'un Yorum dayalı Güncellenmesi]

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; 
} 

: o başkalarına yardım edecek Umut Vikram.exe'nin yanıtını önlemek için 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

Arama yöntemini aldığınız iletişim numarasını aşağıdaki yöntemde geçirin. Bu yöntem, kişinin cep telefonunuza kaydedilip kaydedilmediğini kontrol edecektir. iletişim o zaman kişi adı dönecektir kaydedilirse aksi takdirde sizin Yayın alıcısı sınıfında bu kodu ekleyin, bir dize bilinmeyen sayıda

dönmek

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; 
} 

tesisi için kaynak kodu ziyareti this link

İlgili konular