2011-08-18 14 views
10

Było kilka pytań dotyczących SO dotyczących uzyskiwania numerów kontaktów za pomocą interfejsu API kontaktów, ale chciałbym się dowiedzieć, czy istnieje sposób na określenie, czy pobrany numer jest numerem telefonu komórkowego.Otrzymuj tylko numer telefonu komórkowego

Poniższy kod jest często wyświetlany jako sposób, aby uzyskać numery telefonów kontaktu, tak jak robi się lista jednego lub więcej numerów telefonów:

String[] projection = {ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.Contacts.HAS_PHONE_NUMBER}; 
    String selection = ContactsContract.Contacts.HAS_PHONE_NUMBER + "=1"; 

    Cursor cursor = null; 
    Cursor phones = null; 
    try 
    { 
     cursor = managedQuery(intent.getData(), projection, selection, null, null); 
     while (cursor.moveToNext()) 
     {   
      String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); 
      String name = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME)); 

      phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ contactId,null, null); 
      while (phones.moveToNext()) 
      {    
       String pdata = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DATA)); 
       Log.v("DATA",pdata); 
      }       
     } 
    } 
    catch (NullPointerException npe) 
    { 
     Log.e(TAG, "Error trying to get Contacts."); 
    } 
    finally 
    { 
     if (phones != null) 
     { 
      phones.close(); 
     } 
     if (cursor != null) 
     { 
      cursor.close(); 
     }   
    } 

Chociaż to działa dobrze, czy jest jakiś sposób, aby łatwo rozpoznać, że numer telefonu jest typu mobilnego (poza próbą dopasowania wzoru do Regex).

Podejrzewam, że musi być powiązany fragment danych, tak że natywne aplikacje można zaklasyfikować numer telefonu - jak na zdjęciu poniżej:

Phone types in Contact info

Odpowiedz

22

natknąłem się na blogu, który daje dość dobre wyjaśnienie korzystania z ContactContract api here.

Tak, w moim przykładzie powyżej, zmieniłem część mojego kodu powyżej do tego:

while (phones.moveToNext()) 
{     
    int phoneType = phones.getInt(phones.getColumnIndex(Phone.TYPE)); 
    if (phoneType == Phone.TYPE_MOBILE) 
    { 
      phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DATA)); 
      phoneNumber = phoneNumber.replaceAll("\\s", ""); 
      break; 
    } 
} 

ten opasuje wszystkie telefony do indywidualnego kontaktu i jeśli typ jest Phone.TYPE_MOBILE to bierze to jeden.

Mam nadzieję, że pomoże to komuś z tym samym problemem, który miałem.

+0

proste i doskonałe rozwiązanie +1 –

1

Pierwotny kursor zapytania = managedQuery (intent.getData(), rzutowanie, wybór, null, null); powinien być w stanie obsłużyć filtr dla ciebie. Próbuję zrobić to samo. Opublikuję moje wnioski, gdy zakończę. Jeśli ktoś wie, jak to zrobić, użyj klauzuli wyboru w trzecim parametrze. Chciałbym znać odpowiedź.

Powiązane problemy