Wie rufe ich die Android-Kontaktliste an?

131

Ich mache eine Android-App und muss die Kontaktliste des Telefons anrufen. Ich muss die Kontaktlistenfunktion aufrufen, einen Kontakt auswählen und dann mit dem Namen des Kontakts zu meiner App zurückkehren. Hier ist der Code, den ich im Internet bekommen habe, aber er funktioniert nicht.

import android.app.ListActivity;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.Contacts.People;
import android.view.View;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;

public class Contacts extends ListActivity {

    private ListAdapter mAdapter;
    public TextView pbContact;
    public static String PBCONTACT;
    public static final int ACTIVITY_EDIT=1;
    private static final int ACTIVITY_CREATE=0;

    // Called when the activity is first created. 
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        Cursor C = getContentResolver().query(People.CONTENT_URI, null, null, null, null);
        startManagingCursor(C);

        String[] columns = new String[] {People.NAME};
        int[] names = new int[] {R.id.row_entry};

        mAdapter = new SimpleCursorAdapter(this, R.layout.mycontacts, C, columns, names);
        setListAdapter(mAdapter);
    } // end onCreate()
    // Called when contact is pressed
    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);

        Cursor C = (Cursor) mAdapter.getItem(position);
        PBCONTACT = C.getString(C.getColumnIndex(People.NAME));

        // RHS 05/06
        //pbContact = (TextView) findViewById(R.id.myContact);
        //pbContact.setText(new StringBuilder().append("b"));

        Intent i = new Intent(this, NoteEdit.class);
        startActivityForResult(i, ACTIVITY_CREATE);
    }
}
Tam N.
quelle
Könnten Sie den Codeabschnitt so korrigieren, dass er den ersten Teil des Codes enthält: import android.app.ListActivity ...
David Glass
1.6 & 2.2 Beispiele hierfür: coderanch.com/t/512048/Android/Mobile/Contact-API
Blundell
versuchen Sie Android Contact Extractor . Eine kleine einfache, einfach zu bedienende Bibliothek
Nitesh

Antworten:

250

Ich bin nicht 100% sicher, was Ihr Beispielcode tun soll, aber das folgende Snippet soll Ihnen helfen, die Kontaktlistenfunktion aufzurufen, einen Kontakt auszuwählen und dann mit dem Namen des Kontakts zu [Ihrer] App zurückzukehren.

Dieser Prozess besteht aus drei Schritten.

1. Berechtigungen

Fügen Sie Ihrem Anwendungsmanifest eine Berechtigung zum Lesen von Kontaktdaten hinzu.

<uses-permission android:name="android.permission.READ_CONTACTS"/>

2. Rufen Sie die Kontaktauswahl an

Erstellen Sie in Ihrer Aktivität eine Absicht, die das System auffordert, eine Aktivität zu finden, die eine PICK-Aktion aus den Elementen in der Kontakt-URI ausführen kann.

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

Rufen Sie auf startActivityForResultund übergeben Sie diese Absicht (und PICK_CONTACTin diesem Beispiel eine Anforderungscode-Ganzzahl ). Dies führt dazu, dass Android eine Aktivität startet, die für die Unterstützung ACTION_PICKvon registriert ist, People.CONTENT_URIund dann zu dieser Aktivität zurückkehrt, wenn die Auswahl getroffen (oder abgebrochen) wird.

startActivityForResult(intent, PICK_CONTACT);

3. Auf das Ergebnis hören

Überschreiben Sie auch in Ihrer Aktivität die onActivityResultMethode zum Abhören der Rückgabe aus der in Schritt 2 gestarteten Aktivität "Kontakt auswählen". Sie sollten überprüfen, ob der zurückgegebene Anforderungscode mit dem erwarteten Wert übereinstimmt und der Ergebniscode lautet RESULT_OK.

Sie können den URI des ausgewählten Kontakts abrufen, indem Sie getData()den Parameter data Intent aufrufen . Um den Namen des ausgewählten Kontakts abzurufen, müssen Sie diesen URI verwenden, um eine neue Abfrage zu erstellen und den Namen aus dem zurückgegebenen Cursor zu extrahieren.

@Override
public void onActivityResult(int reqCode, int resultCode, Intent data) {
  super.onActivityResult(reqCode, resultCode, data);

  switch (reqCode) {
    case (PICK_CONTACT) :
      if (resultCode == Activity.RESULT_OK) {
        Uri contactData = data.getData();
        Cursor c =  getContentResolver().query(contactData, null, null, null, null);
        if (c.moveToFirst()) {
          String name = c.getString(c.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
          // TODO Whatever you want to do with the selected contact name.
        }
      }
      break;
  }
}

Vollständiger Quellcode: tutorials-android.blogspot.com (wie man die Android-Kontaktliste aufruft) .

Reto Meier
quelle
41
Es scheint, dass ein Großteil dieses Codes mit den neuesten Android-APIs veraltet ist. Hat jemand eine aktualisierte Version?
Yamspog
F: Wenn ich bei der Auswahl eines Kontakts eine Unteraktivität starten möchte (damit wir wieder auf die Kontaktliste zugreifen können), funktioniert Intent.ACTION_PICK dann noch? Ich fange an zu denken, ich muss meinen eigenen Cursor drehen und setListAdapter verwenden, wie in der Hauptfrage. Hmm ...
Joe D'Andrea
6
Hier ist nichts falsch ... Sie benötigen keine READ-Kontaktberechtigung, da der Benutzer hier die Kontrolle hat. Die App selbst liest die Kontakte nicht intern, sondern zeigt eine Kontaktliste an. Nur wenn der Benutzer einen Kontakt auswählt (manuelle Aktion), kann die App einen begrenzten Satz von Daten abrufen, die diesen Kontaktinformationen zugeordnet sind.
Ddewaele
1
Ich konnte den Benutzer einen Kontakt ohne READ-Erlaubnis auf meinem 4.0+ Android-Handy auswählen lassen, jedoch nicht auf 1.6. Weiß jemand, in welcher Version diese Funktionalität entstanden ist?
Amit
1
PICK_CONTACT schlägt für mich fehl. Wie haben Sie es initialisiert?
user3104760
67

Ich mache es so für Android 2.2 Froyo Release: Verwenden Sie im Grunde Eclipse, um eine Klasse zu erstellen wie: öffentliche Klasse SomePickContactName erweitert Activity

Geben Sie dann diesen Code ein. Denken Sie daran, die privaten Klassenvariablen und CONSTANTS hinzuzufügen, auf die in meiner Version des Codes verwiesen wird:

protected void onCreate(Bundle savedInstanceState) 
{
  super.onCreate(savedInstanceState);       
  Intent intentContact = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); 
  startActivityForResult(intentContact, PICK_CONTACT);
}//onCreate

public void onActivityResult(int requestCode, int resultCode, Intent intent) 
{

  if (requestCode == PICK_CONTACT)
  {         
    getContactInfo(intent);         
    // Your class variables now have the data, so do something with it. 
  }
}//onActivityResult

protected void getContactInfo(Intent intent)
{

   Cursor cursor =  managedQuery(intent.getData(), null, null, null, null);      
   while (cursor.moveToNext()) 
   {           
       String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
       name = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME)); 

       String hasPhone = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));

       if ( hasPhone.equalsIgnoreCase("1"))
           hasPhone = "true";
       else
           hasPhone = "false" ;

       if (Boolean.parseBoolean(hasPhone)) 
       {
        Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ contactId,null, null);
        while (phones.moveToNext()) 
        {
          phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
        }
        phones.close();
       }

       // Find Email Addresses
       Cursor emails = getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,null,ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = " + contactId,null, null);
       while (emails.moveToNext()) 
       {
        emailAddress = emails.getString(emails.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
       }
       emails.close();

    Cursor address = getContentResolver().query(
                ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_URI,
                null,
                ContactsContract.CommonDataKinds.StructuredPostal.CONTACT_ID + " = " + contactId,
                null, null);
    while (address.moveToNext()) 
    { 
      // These are all private class variables, don't forget to create them.
      poBox      = address.getString(address.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POBOX));
      street     = address.getString(address.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.STREET));
      city       = address.getString(address.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.CITY));
      state      = address.getString(address.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.REGION));
      postalCode = address.getString(address.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE));
      country    = address.getString(address.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY));
      type       = address.getString(address.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.TYPE));
    }  //address.moveToNext()   
  }  //while (cursor.moveToNext())        
   cursor.close();
}//getContactInfo
Colin MacKenzie - III
quelle
App stürzt ab, wenn versucht wird, E-Mail zum zweiten Mal zu erhalten. Bearbeiten: Wenn jemand anderes den gleichen Fehler erhält, löschen Sie einfach "cursor.close ();" stackoverflow.com/questions/9696868/…
alicanbatur
14

Wenn Sie sich nach einer API Level 5-Lösung mit der ContactsContract-API umsehen, können Sie den obigen Code wie folgt leicht ändern:

  Intent intent = new Intent(Intent.ACTION_PICK);
  intent.setType(ContactsContract.Contacts.CONTENT_TYPE);
  startActivityForResult(intent, PICK_CONTACT);

Verwenden Sie dann in onActivityResult den Spaltennamen:

  ContactsContract.Contacts.DISPLAY_NAME
Daddyboy
quelle
1
Was gibt es für die Anzeige von Kontakttelefonnummern?
Usman Masood
In Android 1.6 gibt es keine solchen Klassen. Ich habe ähnliche Namen in Contacts.ContactMethods gefunden, aber nur Ausnahmen (solche Aktivitäten können nicht gefunden werden). Aber
Retos
8

Hier ist das Code-Snippet, um Kontakt aufzunehmen:

package com.contact;

import android.app.Activity;
import android.content.ContentResolver;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class GetContactDemoActivity extends Activity implements OnClickListener {

private Button btn = null;
private TextView txt = null;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    btn = (Button) findViewById(R.id.button1);
    txt = (TextView) findViewById(R.id.textView1);

    btn.setOnClickListener(this);
}

@Override
public void onClick(View arg0) {
    if (arg0 == btn) {
        try {
            Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
            startActivityForResult(intent, 1);
        } catch (Exception e) {
            e.printStackTrace();
            Log.e("Error in intent : ", e.toString());
        }
    }
}

@Override
public void onActivityResult(int reqCode, int resultCode, Intent data) {
    super.onActivityResult(reqCode, resultCode, data);

    try {
        if (resultCode == Activity.RESULT_OK) {
            Uri contactData = data.getData();
            Cursor cur = managedQuery(contactData, null, null, null, null);
            ContentResolver contect_resolver = getContentResolver();

            if (cur.moveToFirst()) {
                String id = cur.getString(cur.getColumnIndexOrThrow(ContactsContract.Contacts._ID));
                String name = "";
                String no = "";

                Cursor phoneCur = contect_resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
                        ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[] { id }, null);

                if (phoneCur.moveToFirst()) {
                    name = phoneCur.getString(phoneCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                    no = phoneCur.getString(phoneCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                }

                Log.e("Phone no & name :***: ", name + " : " + no);
                txt.append(name + " : " + no + "\n");

                id = null;
                name = null;
                no = null;
                phoneCur = null;
            }
            contect_resolver = null;
            cur = null;
            //                      populateContacts();
        }
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
        Log.e("IllegalArgumentException :: ", e.toString());
    } catch (Exception e) {
        e.printStackTrace();
        Log.e("Error :: ", e.toString());
    }
}

}}

Mayur Bhola
quelle
6
        Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,null,null, null);
        while (phones.moveToNext())
        {
        String Name=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)
        String Number=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

        }
Maidul
quelle
5
public void onActivityResult(int requestCode, int resultCode, Intent intent) 
{
  if (requestCode == PICK_CONTACT && intent != null) //here check whether intent is null R not
  {  
  }
}

denn ohne Auswahl eines Kontakts gibt es eine Ausnahme. Überprüfen Sie diesen Zustand besser.

Kiran Kala
quelle
5

Der vollständige Code ist unten angegeben

    package com.testingContect;

    import android.app.Activity;
    import android.content.Intent;
    import android.database.Cursor;
    import android.net.Uri;
    import android.os.Bundle;
    import android.provider.ContactsContract;
    import android.provider.Contacts.People;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.Toast;

    public class testingContect extends Activity implements OnClickListener{
    /** Called when the activity is first created. */

    EditText ed;
    Button bt;
    int PICK_CONTACT;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        bt=(Button)findViewById(R.id.button1);
        ed =(EditText)findViewById(R.id.editText1);
        ed.setOnClickListener(this);
        bt.setOnClickListener(this);


    }

    @Override
    public void onClick(View v) {

        switch(v.getId())
        {
        case R.id.button1:

            break;
        case R.id.editText1:
             Intent intent = new Intent(Intent.ACTION_PICK);
              intent.setType(ContactsContract.Contacts.CONTENT_TYPE);
              startActivityForResult(intent, PICK_CONTACT);


            break;

        }

    }
    public void onActivityResult(int requestCode, int resultCode, Intent intent) 
    {

      if (requestCode == PICK_CONTACT)
      {         
          Cursor cursor =  managedQuery(intent.getData(), null, null, null, null);
          cursor.moveToNext();
          String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
           String  name = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME)); 

          Toast.makeText(this, "Contect LIST  =  "+name, Toast.LENGTH_LONG).show(); 
      }
    }//onActivityResult
}//class ends
ANDROID CONTECT LIST
quelle
1
Wo wird PICK_CONTACT initialisiert?
Edward Falk
1
Es ist oben in der Aktivitätsklasse anzugeben : private static final int PICK_CONTACT = 1;.
Omar
3

Zu meiner Überraschung benötigen Sie keine Benutzerberechtigung CONTACT_READ, um die Namen und einige grundlegende Informationen zu lesen (Ist der Kontakt markiert, was war die letzte Anrufzeit). Sie benötigen jedoch die Erlaubnis, um die Details des Kontakts wie die Telefonnummer zu lesen.

Vicky Singh
quelle
3

Seien Sie vorsichtig, wenn Sie mit der Android-Kontaktliste arbeiten.

Das Lesen der Kontaktliste in den oben genannten Methoden funktioniert auf den meisten Android-Geräten mit Ausnahme von HTC One und Sony Xperia. Es hat meine sechs Wochen verschwendet , um herauszufinden, was los ist!

Die meisten online verfügbaren Tutorials sind fast ähnlich - lesen Sie zuerst "ALLE" Kontakte und zeigen Sie sie dann Listviewmit an ArrayAdapter. Dies ist keine speichereffiziente Lösung. Anstatt zuerst auf anderen Websites nach Lösungen zu suchen, schauen Sie unter developer.android.com nach. Wenn auf developer.android.com keine Lösung verfügbar ist, sollten Sie woanders suchen.

Die Lösung besteht darin, CursorAdapteranstelle des ArrayAdapterAbrufs der Kontaktliste zu verwenden. Die Verwendung ArrayAdapterwürde auf den meisten Geräten funktionieren, ist jedoch nicht effizient. Der CursorAdapterruft zur Laufzeit nur einen Teil der Kontaktliste ab, während die ListViewgescrollt wird.

public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    ...
    // Gets the ListView from the View list of the parent activity
    mContactsList =
        (ListView) getActivity().findViewById(R.layout.contact_list_view);
    // Gets a CursorAdapter
    mCursorAdapter = new SimpleCursorAdapter(
            getActivity(),
            R.layout.contact_list_item,
            null,
            FROM_COLUMNS, TO_IDS,
            0);
    // Sets the adapter for the ListView
    mContactsList.setAdapter(mCursorAdapter);
}

Abrufen einer Kontaktliste: Abrufen einer Kontaktliste

Adnan
quelle
1

Ich benutze diese Methode, um Kontakte zu lesen

public static List<ContactItem> readPhoneContacts(Context context) {
        List<ContactItem> contactItems = new ArrayList<ContactItem>();
        try {
            Cursor cursor = context.getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null,
                    null, null, "upper("+ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + ") ASC");

            /*context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                    null,
                    ContactsContract.CommonDataKinds.Phone.CONTACT_ID+ " = ?",
                    new String[] { id },
                    ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME+" ASC");*/

            Integer contactsCount = cursor.getCount(); // get how many contacts you have in your contacts list
            if (contactsCount > 0) {
                while (cursor.moveToNext()) {

                    String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
                    String contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                    if (Integer.parseInt(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
                        ContactItem contactItem = new ContactItem();
                        contactItem.setContactName(contactName);
                        //the below cursor will give you details for multiple contacts
                        Cursor pCursor = context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
                                ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?",
                                new String[]{id}, null);
                        // continue till this cursor reaches to all phone numbers which are associated with a contact in the contact list
                        while (pCursor.moveToNext()) {
                            int phoneType = pCursor.getInt(pCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));
                            //String isStarred      = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.STARRED));
                            String phoneNo = pCursor.getString(pCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                            //you will get all phone numbers according to it's type as below switch case.
                            //Logs.e will print the phone number along with the name in DDMS. you can use these details where ever you want.
                            switch (phoneType) {
                                case Phone.TYPE_MOBILE:
                                    contactItem.setContactNumberMobile(phoneNo);
                                    Log.e(contactName + ": TYPE_MOBILE", " " + phoneNo);
                                    break;
                                case ContactsContract.CommonDataKinds.Phone.TYPE_HOME:
                                    contactItem.setContactNumberMobile(phoneNo);
                                    Log.e(contactName + ": TYPE_HOME", " " + phoneNo);
                                    break;
                                case ContactsContract.CommonDataKinds.Phone.TYPE_WORK:
                                    contactItem.setContactNumberMobile(phoneNo);
                                    Log.e(contactName + ": TYPE_WORK", " " + phoneNo);
                                    break;
                                case ContactsContract.CommonDataKinds.Phone.TYPE_WORK_MOBILE:
                                    contactItem.setContactNumberMobile(phoneNo);
                                    Log.e(contactName + ": TYPE_WORK_MOBILE", " " + phoneNo);
                                    break;
                                case Phone.TYPE_OTHER:
                                    contactItem.setContactNumberMobile(phoneNo);
                                    Log.e(contactName + ": TYPE_OTHER", " " + phoneNo);
                                    break;
                                default:
                                    break;
                            }
                        }
                        contactItem.setSelectedAddress(getContactPostalAddress(pCursor));
                        pCursor.close();
                        contactItems.add(contactItem);
                    }

                }
                cursor.close();
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }


        return contactItems;
    }//loadContacts
Zar E Ahmer
quelle
1

Hallo, ich habe einen Code, um den Kontakt in Ihrer Datenbank nach gemeinsamer Präferenz zu speichern. Hier ist mein Code

public class Main22Activity extends AppCompatActivity {
    EditText nameInput,phoneInput;
    TextView LargeText;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main22);
        nameInput = (EditText) findViewById(R.id.nameInput);
        phoneInput = (EditText) findViewById(R.id.phoneInput);

        LargeText = (TextView) findViewById(R.id.textView2);
    }

    public void saveInfo (View view){
        SharedPreferences sharedPref = getSharedPreferences("nameInfo" , Context.MODE_PRIVATE);
        SharedPreferences.Editor editor= sharedPref.edit();
        editor.putString("name", nameInput.getText().toString());
        editor.putString("phone", phoneInput.getText().toString());
        editor.apply();
        Toast.makeText(this, "Saved", Toast.LENGTH_LONG).show();
    }

    public void displayData(View view){
        SharedPreferences sharedPref = getSharedPreferences("nameInfo" , Context.MODE_PRIVATE);
        String name = sharedPref.getString("name", "");
        String ph = sharedPref.getString ("phone","");
        LargeText.setText(name + " " + ph);
    }
}
Abhishek
quelle
0
-> Add a permission to read contacts data to your application manifest.

<uses-permission android:name="android.permission.READ_CONTACTS"/>

-> Use Intent.Action_Pick in your Activity like below

Intent contactPickerIntent = new Intent(Intent.ACTION_PICK,
                ContactsContract.CommonDataKinds.Phone.CONTENT_URI);
        startActivityForResult(contactPickerIntent, RESULT_PICK_CONTACT);

-> Then Override the onActivityResult()

 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // check whether the result is ok
        if (resultCode == RESULT_OK) {
            // Check for the request code, we might be usign multiple startActivityForReslut
            switch (requestCode) {
            case RESULT_PICK_CONTACT:
               Cursor cursor = null;
        try {
            String phoneNo = null ;
            String name = null;           
            Uri uri = data.getData();            
            cursor = getContentResolver().query(uri, null, null, null, null);
            cursor.moveToFirst();           
            int  phoneIndex =cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
            phoneNo = cursor.getString(phoneIndex); 

            textView2.setText(phoneNo);
        } catch (Exception e) {
            e.printStackTrace();
        }
                break;
            }
        } else {
            Log.e("MainActivity", "Failed to pick contact");
        }
    }

This will work check it out
Ravi
quelle
0

Ich verwende den von @Colin MacKenzie - III bereitgestellten Code . Vielen Dank!

Für jemanden, der nach einem Ersatz für "veraltete" ManagedQuery sucht:

1. unter der Annahme, dass v4 support lib verwendet wird:

import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;

2. Platz:

your_(activity)_class implements LoaderManager.LoaderCallbacks<Cursor>

3.,

// temporarily store the 'data.getData()' from onActivityResult
private Uri tmp_url;

4. Rückrufe überschreiben:

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    // create the loader here!
    CursorLoader cursorLoader = new CursorLoader(this, tmp_url, null, null, null, null);
    return cursorLoader;
}

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
    getContactInfo(cursor); // here it is!
}

@Override
public void onLoaderReset(Loader<Cursor> loader) {
}

5. Platz:

public void initLoader(Uri data){
    // will be used in onCreateLoader callback
    this.tmp_url = data;
    // 'this' is an Activity instance, implementing those callbacks
    this.getSupportLoaderManager().initLoader(0, null, this);
}

6. Der obige Code , außer dass ich den Signaturparameter von Absicht in Cursor ändere:

protected void getContactInfo(Cursor cursor)
{

   // Cursor cursor =  managedQuery(intent.getData(), null, null, null, null);      
   while (cursor.moveToNext()) 
   {
        // same above ...
   } 

7. Rufen Sie initLoader auf:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (PICK_CONTACT == requestCode) {
        this.initLoader(data.getData(), this);
    }
}

8. Vergessen Sie diesen Code nicht

    Intent intentContact = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
    this.act.startActivityForResult(intentContact, PICK_CONTACT);

Verweise:

Android-Grundlagen: Daten richtig laden

Initialisieren eines Loaders in einer Aktivität

Yang
quelle