4 Stimmen

Abrufen einer Telefonnummer mit ContactsContract in Android - Funktion funktioniert nicht

Ich habe die folgende Funktion geschrieben, um eine einzige Telefonnummer abzurufen, die zu dem Kontakt mit der ID "contactID" gehört.

Die Funktion, um die Telefonnummer abzurufen:

private String getContactPhone(String contactID) {
    Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
    String[] projection = null;
    String where = ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?";
    String[] selectionArgs = new String[] { contactID };
    String sortOrder = null;
    Cursor result = managedQuery(uri, projection, where, selectionArgs, sortOrder);
    if (result.moveToFirst()) {
        String phone = result.getString(result.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
        if (phone == null) {
            result.close();
            return null;
        }
        result.close();
        return phone;
    }
    result.close();
    return null;
}

Wie diese Funktion aufgerufen wird:

ArrayList resultContacts = new ArrayList();
Cursor result = null;
Uri uri = ContactsContract.Data.CONTENT_URI;
String[] projection = new String[] {
        ContactsContract.Contacts._ID,
        ContactsContract.Contacts.DISPLAY_NAME,
        ContactsContract.CommonDataKinds.Event.CONTACT_ID,
        ContactsContract.CommonDataKinds.Event.START_DATE,
};
String where = ContactsContract.Data.MIMETYPE+" = ? AND "+ContactsContract.CommonDataKinds.Event.TYPE+" = "+ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY;
String[] selectionArgs = new String[] {ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE};
String sortOrder = null;
result = managedQuery(uri, projection, where, selectionArgs, sortOrder);
while (result.moveToNext()) {
    Long id = result.getLong(result.getColumnIndex(ContactsContract.Contacts._ID));
    String phone = getContactPhone(String.valueOf(id));
    ...
}
...

Leider funktioniert es nicht. Ich erhalte null, wenn ich diese Funktion mit dem Wert aufrufe, den ich von "ContactsContract.Contacts._ID" erhalten habe. Warum ist das so? Was ist falsch?

Bearbeiten: Ich habe Contacts._ID früher mit CommonDataKinds.Phone.CONTACT_ID verknüpft - was nicht funktioniert hat. Aber jetzt verknüpfe ich Contacts.DISPLAY_NAME mit CommonDataKinds.Phone.DISPLAY_NAME und plötzlich funktioniert es - merkwürdig, nicht wahr? Aber ich würde lieber die IDs anstatt der Anzeigenamen verknüpfen. Die Frage ist also immer noch relevant. Könnte das an unterschiedlichen IDs in diesen Tabellen liegen? Liegt es nicht daran, dass es Lookup-IDs gibt?

12voto

tidbeck Punkte 2293

Um die Kontakt-ID im ersten Teil zu erhalten, sollten Sie verwenden:

ContactsContract.Data.CONTACT_ID

anstatt:

ContactsContract.Contacts._ID

Also sollte die Projektion sein:

String[] projection = new String[] {
         ContactsContract.Data.CONTACT_ID,
         ContactsContract.CommonDataKinds.Event.CONTACT_ID,
         ContactsContract.CommonDataKinds.Event.START_DATE,
 };

Und dann natürlich die richtige Zeile erhalten:

Long id = result.getLong(result.getColumnIndex(ContactsContract.Data.CONTACT_ID));

2voto

John J Smith Punkte 10535

Sie erhalten null, weil Sie Ihre Projektion auf null gesetzt haben. Die Projektion ist im Grunde die Liste der Spalten, die Sie zurückhaben möchten, z.B.

String[] projektion = {ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.Contacts.HAS_PHONE_NUMBER};

Normalerweise hat ein Kontakt eine Liste von Telefonnummern, daher müssen Sie einen anderen Cursor verwenden, um durch die Telefonnummern zu iterieren, z.B.

Cursor telefone = mContext.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ kontaktId, null, null);    
while (telefone.moveToNext()) 
{    
     telefonnummer = telefone.getString(telefone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DATA));
}

Hoffentlich hilft Ihnen das weiter.

1voto

robertly Punkte 2092

Ihr Code für getContactPhone() funktioniert auf meiner Seite einwandfrei. Ich habe getestet, indem ich einen Kontakt-Auswähler gestartet habe, einen Kontakt ausgewählt habe und dann die ID, die zurückgegeben wurde, verwendet und diese in Ihre Methode übergeben habe.

Also vermute ich, dass Sie tatsächlich eine ungültige ID übergeben. Können Sie den vollständigen Stack-Trace für die Null-Pointer-Ausnahme posten?

Ja, Suchschlüssel sind verfügbar, weil _IDs nicht garantiert sind, gleich zu bleiben, da Synchronisierungen und Kontaktaggregation sie ändern.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X