2010-11-25 7 views
13

Ist es möglich, eine Android-Kontaktkarte durch den Kontakt der ID zu öffnen? Es funktioniert mit der Telefonnummer. Hier ist ein Beispiel, wenn ichWie durch ID eine Kontaktkarte in Android öffnen

verwenden
Intent i = new Intent(); 
i.setAction(ContactsContract.Intents.SHOW_OR_CREATE_CONTACT); 
i.setData(Uri.fromParts("tel", "123456", null)); //<---- Change here from Phone to IDcontext.startActivity(i); 

Aber ich will von ID Kontaktkarte öffnen, zum Beispiel, wenn die Telefonnummer aus dem Kontakt ändern würde.

Antwort

40

Verwendung ACTION_VIEW und entweder einen Kontakt URI bauen den Kontakt ID verwenden oder die Kontaktsuche URI verwenden, wenn Sie es bereits (bevorzugt) haben.

Intent intent = new Intent(Intent.ACTION_VIEW); 
    Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, String.valueOf(contactID)); 
    intent.setData(uri); 
context.startActivity(intent); 
+1

Vielen Dank für Ihre Antwort, es war genau das, was ich gesucht habe. –

+4

Nur als eine Randnotiz: Es wird abgeraten, Kontakte nach ID zu wählen, weil es nicht garantiert ist, dass es sich nicht ändert. In der Tat sind die Chancen sehr hoch, dass sich die ID * WILL ändert. Sie sollten die Lösung von jhominal verwenden und sie mit LOOKUP_URI aufnehmen, da der Suchschlüssel immer gleich bleibt. Hintergrund: Die 'ID' kann während der Synchronisationen geändert werden, so hängt nicht von ihm oder Ihrer Anwendung jederzeit in Zukunft während oder nach einer Kontaktliste Synchronisation brechen – Tseng

+0

Wow, so verpasst offensichtlich die Bedeutung von„id“.. Danke Tseng, ich werde es in meinem Code ändern und erinnere mich an das nächste Mal :) –

4

würden Sie folgenden URI verwenden:

Uri.Builder newUriBuilder = ContactsContract.Contacts.CONTENT_LOOKUP_URI.buildUpon(); 
newUriBuilder.appendPath("/").appendPath(theContactKey) 
i.setData(newUriBuilder.build()); 

In Kürze erhalten Sie weitere Details finden, wie diese URI funktioniert, indem am API documentation for CONTENT_LOOKUP_URI suchen.

+5

Ok, danke für den Hinweis in jhominal die richtige Richtung, aber deine Antwort war nicht ganz richtig. Hier ist die richtige Lösung: Uri look = Uri.withApendedPath (Contacts.CONTENT_LOOKUP_URI, hereTheLookupKey); Absicht i = neue Absicht (Intent.ACTION_VIEW); i.setData (look); –

+0

verwendet diesen URI nicht besser: Contacts.getLookupUri (contactId, lookupKey)? –

2

Ich habe versucht, eine Kontaktkarte mit den hier aufgeführten Methoden zu öffnen, aber irgendwie schloss sich die Kontaktaktivität unmittelbar nach dem Öffnen.

es schien, dass die Kontakt Aktivität meinen alten Inhalt uri nicht akzeptieren.

Ich löste dieses Problem, die getLookupUri (long contactId, String lookupKey) Methode der ContactsContract.Contacts-Klasse für die richtigen Inhalte uri zu erhalten https://developer.android.com/reference/android/provider/ContactsContract.Contacts.html#getLookupUri(long, java.lang.String)

So ist der Code für eine Kontaktkarte öffnen wird:

Intent intent = new Intent(Intent.ACTION_VIEW); 
String lookupKey = phonesCursor.getString(phonesCursor.getColumnIndexOrThrow(ContactsContract.PhoneLookup.LOOKUP_KEY)); 
long contactId = phonesCursor.getLong(phonesCursor.getColumnIndexOrThrow(ContactsContract.PhoneLookup._ID)); 
Uri uri = ContactsContract.Contacts.getLookupUri(contactId, lookupKey); 
intent.setData(uri); 
startActivity(intent);