2011-08-18 37 views
10

Ha habido varias preguntas sobre SO con respecto a obtener números de Contactos usando la API de Contactos, pero me gustaría saber si hay una manera de identificar que el número recuperado es un número de teléfono móvil.Obtener número de teléfono de Contactos solamente

El siguiente código se muestra a menudo como una forma de obtener los números de teléfono de un contacto, como se pone una lista de uno o más números de teléfono:

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

Si bien, esto funciona bien, ¿hay alguna manera de identifique fácilmente que el número de teléfono es un tipo de dispositivo móvil (además de intentar hacer coincidir el patrón con Regex).

sospecho que debe haber una pieza relacionada de datos, por lo que las aplicaciones nativas pueden clasificar el número de teléfono - como en la imagen siguiente:

Phone types in Contact info

Respuesta

22

me topé con un artículo en el blog que da una muy buena explicación del uso de ContactsContract api here.

Así, en el ejemplo anterior, he cambiado parte de mi código anterior para esto:

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

Esto se enrolla alrededor de todos los teléfonos de un contacto individual y si el tipo es Phone.TYPE_MOBILE entonces toma esta uno.

Espero que esto ayude a alguien con el mismo problema que tuve.

+0

solución simple y perfecta +1 –

1

La consulta original cursor = managedQuery (intent.getData(), proyección, selección, nulo, nulo); debería ser capaz de manejar el filtro por usted. Estoy intentando hacer lo mismo. Publicaré mis hallazgos cuando estén completos. Si alguien sabe cómo hacer esto, use la cláusula de selección en el tercer parámetro. Me encantaría saber la respuesta.

Cuestiones relacionadas