2010-07-30 17 views
9

Estoy tratando de obtener el número de teléfono del contacto después de haber recuperado su número de identificación de la actividad incorporada. Sin embargo, cada vez que consulto la base de datos usando el cursor en mi código a continuación, obtengo cero filas aunque haya un número de teléfono móvil para el contacto que he seleccionado.Recuperar número de teléfono de contacto de URI en Android

¿Alguien puede indicarme una mejor dirección o mostrar un ejemplo de cómo obtener el número de teléfono del contacto DESPUÉS de obtener su ID de usuario?

Mi código:

private Runnable getSMSRunnable() { 
    return new Runnable() { 
    public void run() { 
    Intent i = new Intent(Intent.ACTION_PICK, 
     ContactsContract.CommonDataKinds.Phone.CONTENT_URI); 
    startActivityForResult(i, CONTACTS_REQUEST_CODE); 
    } 
    }; 
} 

Devuelve la salida del registro

content://com.android.contacts/data/6802 

de la que pasa un ID (6802) en un método que está diseñado para devolver el número de teléfono de la identificación con el determinado tipo (en este caso ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE)

public static String getContactPhoneNumberByPhoneType(Context context, long contactId, int type) { 
    String phoneNumber = null; 

    String[] whereArgs = new String[] { String.valueOf(contactId), String.valueOf(type) }; 

    Log.d(TAG, String.valueOf(contactId)); 

    Cursor cursor = context.getContentResolver().query(
      ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
      null, 
      ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ? and " 
        + ContactsContract.CommonDataKinds.Phone.TYPE + " = ?", whereArgs, null); 

    int phoneNumberIndex = cursor 
      .getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER); 

    Log.d(TAG, String.valueOf(cursor.getCount())); 

    if (cursor != null) { 
     Log.v(TAG, "Cursor Not null"); 
     try { 
      if (cursor.moveToNext()) { 
       Log.v(TAG, "Moved to first"); 
       Log.v(TAG, "Cursor Moved to first and checking"); 
       phoneNumber = cursor.getString(phoneNumberIndex); 
      } 
     } finally { 
      Log.v(TAG, "In finally"); 
      cursor.close(); 
     } 
    } 

    Log.v(TAG, "Returning phone number"); 
    return phoneNumber; 
} 

que devuelve null para un número de teléfono, lo que significa que no puede encontrar la fila a la que estoy intentando acceder, lo que significa que algo está mal con mi consulta; sin embargo, si verifico un contacto que tenga un número de teléfono móvil, ¿cómo podría obtener una consulta de 0 filas?

Cualquier ayuda sería muy apreciada. Muchas gracias!

Respuesta

12

Encontré la respuesta.

La razón por la que no estaba recibiendo ningún filas desde el cursor fue porque yo estaba usando la línea

ContactsContract.CommonDataKinds.Phone.CONTACT_ID 

"El id de la fila en la tabla de contactos que pertenecen estos datos."

Ya que estaba obteniendo el URI de la tabla de contactos de todos modos - esto no era necesario y el siguiente debería haber sido sustituido. La ID era la correspondiente al contacto en la mesa del teléfono, no el contacto en bruto.

ContactsContract.CommonDataKinds.Phone._ID 

Al cambiar las líneas, se devuelven los resultados correctos en la consulta. Todo parece estar funcionando bien en este momento.

+0

Esto funciona incluso si su explicación no es clara. Por qué teléfonoCONTACT_ID (contact_id) no coincide con CONTACTS._ID (_id) – redochka

+0

Tal vez es más fácil si lo explico de esta manera: '_ID' es para la base de datos,' CONTACT_ID' es para un ID de contacto cuando no está consultando esa tabla específica . ¿Esto ayuda? – hwrdprkns

+2

En pocas palabras: Phones._ID == Contacts._ID – redochka

2

Esto debería funcionar, (tal vez tratar de perder el tipo)

Los números de teléfono se almacenan en su propia mesa y necesitan ser consultada por separado. Para consultar la tabla de números telefónicos, utilice el URI almacenado en la variable SDK ContactsContract.CommonDataKinds.Phone.CONTENT_URI. Use un condicional WHERE para obtener los números de teléfono del contacto especificado.

 if (Integer.parseInt(cur.getString(
       cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) { 
      Cursor pCur = cr.query(
     ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
     null, 
     ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", 
     new String[]{id}, null); 
     while (pCur.moveToNext()) { 
     // Do something with phones 
     } 
     pCur.close(); 
    } 

Realice una segunda consulta en la base de datos SQLite de los contactos de Android. Los números de teléfono se consultan contra el URI almacenado en ContactsContract.CommonDataKinds.Phone.CONTENT_URI. El ID de contacto se almacena en la tabla del teléfono como ContactsContract.CommonDataKinds.Phone.CONTACT_ID y la cláusula WHERE se usa para limitar los datos devueltos.

+1

Copiaste tu respuesta que estaba en otras preguntas del mismo tipo (http://bit.ly/ayUbeg). Miré esa pregunta, pero no debería tener que hacer esto debido a mi intención inicial. – hwrdprkns

Cuestiones relacionadas