2010-07-30 14 views
9

Sto cercando di ottenere il numero di telefono del contatto dopo aver recuperato il numero ID dall'attività incorporata. Tuttavia, ogni volta che interrogo il database utilizzando il cursore nel mio codice qui sotto, ottengo zero righe restituite anche se c'è un numero di cellulare per il contatto che ho selezionato.Recupera numero telefonico contatto dall'URI in Android

Qualcuno può indicarmi una direzione migliore o mostrare un esempio di come ottenere il numero di telefono del contatto dopo aver ottenuto il suo ID utente?

Il mio codice:

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

restituisce l'output Log

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

da cui passare l'ID (6802) in un metodo che è stato progettato per restituire il numero di telefono dal ID con la tipo di data (in questo 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; 
} 

che restituisce null per un numero di telefono - il che significa che non riesce a trovare la riga a cui sto tentando di accedere - il che significa che c'è qualcosa di sbagliato nella mia query - tuttavia se controllo un contatto che ha un numero di telefono cellulare - come potrei ottenere una query a 0 righe?

Qualsiasi aiuto sarebbe molto apprezzato. Grazie mille!

risposta

12

Ho trovato la risposta.

Il motivo non è stato sempre tutte le righe del cursore è stato perché stava usando la linea

ContactsContract.CommonDataKinds.Phone.CONTACT_ID 

"L'id della riga nella tabella contatti che questi dati appartiene."

Poiché stavo ottenendo l'URI dalla tabella dei contatti comunque, questo non era necessario e il seguente avrebbe dovuto essere sostituito. L'ID era quello corrispondente al contatto nella tabella del telefono e non il contatto non elaborato.

ContactsContract.CommonDataKinds.Phone._ID 

Scambiare le righe ha restituito i risultati corretti nella query. Tutto sembra funzionare bene al momento.

+0

Funziona anche se la tua spiegazione non è chiara. Perché telefono.CONTACT_ID (contact_id) non corrisponde a CONTACTS._ID (_id) – redochka

+0

Forse è più semplice se lo spiego in questo modo: '_ID' è per il database,' CONTACT_ID' è per un ID di contatto quando non stai interrogando quella tabella specifica . questo aiuta? – hwrdprkns

+2

Bottom line: Phones._ID == Contacts._ID – redochka

2

Questo dovrebbe funzionare, (forse provare a perdere il tipo)

I numeri di telefono sono memorizzati nel proprio tavolo e hanno bisogno di essere interrogato separatamente. Per eseguire una query sulla tabella dei numeri di telefono, utilizzare l'URI memorizzato nella variabile SDK ContactsContract.CommonDataKinds.Phone.CONTENT_URI. Utilizzare un WHERE condizionale per ottenere i numeri di telefono per il contatto specificato.

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

Eseguire una seconda query sul database SQLite dei contatti Android. I numeri di telefono vengono interrogati sull'URI memorizzato in ContactsContract.CommonDataKinds.Phone.CONTENT_URI. L'ID del contatto viene memorizzato nella tabella del telefono come ContactsContract.CommonDataKinds.Phone.CONTACT_ID e la clausola WHERE viene utilizzata per limitare i dati restituiti.

+1

Hai copiato la tua risposta che era su un'altra domanda dello stesso tipo (http://bit.ly/ayUbeg). Ho guardato quella domanda ma non avrei dovuto farlo a causa del mio intento iniziale. – hwrdprkns

Problemi correlati