2012-04-02 7 views
2

Ich kann keine Arbeits Cursor erhalten alle Kontakttelefonnummern enthalten:Erhalten Sie alle Telefonnummern eines Kontakts ein lookupUri mit

I erhalten lookupUri dieser Methode:

public static Uri getLookupUri (ContentResolver mContentResolver, String number) { 
    Uri uri=null; 
    Cursor contactLookupCursor = 
      mContentResolver.query(
        Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, 
          Uri.encode(number)), 
          new String[] {PhoneLookup._ID, PhoneLookup.LOOKUP_KEY}, 
          null, 
          null, 
          null); 

    if (contactLookupCursor.moveToNext()) { 
     uri=Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, contactLookupCursor.getString(contactLookupCursor.getColumnIndexOrThrow(PhoneLookup.LOOKUP_KEY))); 
    } 

    contactLookupCursor.close(); 
    return uri; 
} 

Dann würde Ich mag an erhalten einen Cursor (Handys), die alle Telefonnummern von Kontakten:

String[] projection = new String[] { ContactsContract.CommonDataKinds.Phone.NUMBER}; 

    Cursor phones = localContentResolver.query(lookupUri, projection, null, null, null); 

aber ich bekomme nur IllegalArgumentException: Invalid column data1

Antwort

0

Sie versuchen, die Telefonnummer aus einer Kontaktzeile abzufragen. Kontaktzeilen haben keine Telefonnummern. Der Wert von ContactsContract.CommonDataKinds.Phone.NUMBER ist "data1" und in der ContactsContract.Contacts-Tabelle gibt es keine Spalte "data1".

Um alle Telefonnummern für einen Kontakt zu finden, dies zu tun:

Finden Sie den gewünschten Kontakt. Ihr getLookupUri ist in Ordnung dafür, außer dass Sie wahrscheinlich mitApendedPath() mit CONTENT_VCARD_URI aufrufen sollten. Sieh den Javadoc.

Um alle Telefonnummern für den Kontakt zu erhalten, verwenden Sie die Tabelle Contacts.Entity.

+1

Könnten Sie einige Code schreiben Sie bekommen? – stepic

0

Der folgende Code ruft alle Kontakte in einem Android-Gerät ab.

public class GetContactFromLookup extends Activity { 
    int CONTACTS_REQUEST_CODE =1; 
    static ContentResolver cr; 
    Activity thisActivity; 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 
     setContentView(R.layout.test); 
     thisActivity = this; 
     Button btn = (Button)findViewById(R.id.button1); 
     btn.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); 
       startActivityForResult(intent, 1); 


      } 
     }); 

    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
      switch (requestCode) { 
      case 1 : 
      if (resultCode == Activity.RESULT_OK) { 

      Uri uri = data.getData(); 
      List<String> items = uri.getPathSegments(); 
      String lookup_key = items.get(2); 
      Log.v("", "id-->"+items.get(2)); 

      Uri myContacts = ContactsContract.CommonDataKinds.Phone.CONTENT_URI ;//People.CONTENT_URI; 
      Cursor mqCur = managedQuery(myContacts, null, null, null, null); 
      if(mqCur.moveToFirst()) 
      {    
       do 
       {     
        String contact_id = mqCur.getString(mqCur 
          .getColumnIndexOrThrow(ContactsContract.Contacts.LOOKUP_KEY)); 
        if(lookup_key.equals(contact_id)){ 
         String phone_no = mqCur.getString(mqCur 
           .getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
          Log.v("", "phone_no-->"+phone_no); 
        }     
       } 
       while(mqCur.moveToNext()); 
      } 

      }   
     } 
     super.onActivityResult(requestCode, resultCode, data); 
    } 

} 

Ich denke, das wird Ihnen helfen.

+1

Ich möchte nicht alle Kontakte abrufen, sondern alle Telefonnummern eines bestimmten Kontakts abfragen, die bereits einen LookupUri haben. – stepic

+0

Ok, dann siehe [link] (http://stackoverflow.com/questions/8594987/antworten-telefon- Nummer-von-Lookup-URI). Das wird dir helfen. – Satheesh

+0

Dieses Beispiel extrahiert nur contactId von LookupUri. Ich habe versucht, contactId loszuwerden, weil, wie Android Reference sagt: _Lassen Sie sagen, Ihre App gespeichert eine lange ID eines Kontakts. Dann geht der Benutzer und verbindet den Kontakt manuell mit einem anderen Kontakt. Jetzt gibt es einen einzigen Kontakt, wo früher zwei waren, und die gespeicherte lange Kontakt-ID zeigt nirgendwo hin. Der Nachschlageschlüssel hilft, den Kontakt in diesem Fall aufzulösen. _ – stepic

0

Um Telefonnummer mit Kontaktnamen verwenden diesen Code

ContentResolver cr = getContentResolver(); 
    Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, 
     "DISPLAY_NAME = '" + NAME + "'", null, null); 
    if (cursor.moveToFirst()) { 
     String contactId =cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); 
     // 
     // Get all phone numbers. 
     // 
     Cursor phones = cr.query(Phone.CONTENT_URI, null, 
      Phone.CONTACT_ID + " = " + contactId, null, null); 
     while (phones.moveToNext()) { 
      String number = phones.getString(phones.getColumnIndex(Phone.NUMBER)); 
      int type = phones.getInt(phones.getColumnIndex(Phone.TYPE)); 
      switch (type) { 
       case Phone.TYPE_HOME: 
        // do something with the Home number here... 
        break; 
       case Phone.TYPE_MOBILE: 
        // do something with the Mobile number here... 
        break; 
       case Phone.TYPE_WORK: 
        // do something with the Work number here... 
        break; 
      } 
     } 
     phones.close(); 
    } 
    cursor.close(); 

I getestet und es ist Arbeit ich es von dieser Antwort How to get contacts' phone number in Android