Làm thế nào để gọi danh sách liên lạc Android?


131

Tôi đang tạo một ứng dụng Android và cần gọi danh sách liên hệ của điện thoại. Tôi cần gọi chức năng danh sách liên lạc, chọn một liên hệ, sau đó quay lại ứng dụng của tôi với tên của liên hệ. Đây là mã tôi nhận được trên internet, nhưng nó không hoạt động.

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

Bạn có thể sửa phần mã để bao gồm phần đầu tiên của mã: nhập android.app.ListActivity ...
David Glass


thử trình giải nén liên hệ Android . Một thư viện nhỏ đơn giản dễ sử dụng
nitesh

Câu trả lời:


250

Tôi không chắc chắn 100% mã mẫu của bạn phải làm gì, nhưng đoạn mã sau sẽ giúp bạn 'gọi chức năng danh sách liên lạc, chọn một số liên lạc, sau đó quay lại ứng dụng [của bạn] với tên của số liên lạc'.

Có ba bước cho quy trình này.

1. Quyền

Thêm quyền để đọc dữ liệu danh bạ vào bảng kê khai ứng dụng của bạn.

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

2. Gọi cho Bộ chọn Liên hệ

Trong Hoạt động của bạn, hãy tạo một Ý định yêu cầu hệ thống tìm một Hoạt động có thể thực hiện hành động PICK từ các mục trong URI Danh bạ.

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

Gọi startActivityForResult, chuyển trong Ý định này (và một số nguyên mã yêu cầu, PICK_CONTACTtrong ví dụ này). Điều này sẽ gây Android để khởi động một Hoạt động đó là đăng ký hỗ trợ ACTION_PICKtrên People.CONTENT_URI, sau đó trở về Hoạt động này khi lựa chọn được thực hiện (hoặc hủy bỏ).

startActivityForResult(intent, PICK_CONTACT);

3. Lắng nghe kết quả

Cũng trong Hoạt động của bạn, ghi đè onActivityResultphương thức để nghe trả về từ 'chọn một liên hệ' Hoạt động bạn đã khởi chạy ở bước 2. Bạn nên kiểm tra xem mã yêu cầu được trả về có khớp với giá trị bạn mong đợi không và mã kết quả là RESULT_OK.

Bạn có thể lấy URI của số liên lạc được lựa chọn bằng cách gọi getData()trên dữ liệu tham số Intent. Để có được tên của liên hệ đã chọn, bạn cần sử dụng URI đó để tạo một truy vấn mới và trích xuất tên từ con trỏ được trả về.

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

Mã nguồn đầy đủ: tut-android.blogspot.com (cách gọi danh sách liên lạc Android) .


41
có vẻ như rất nhiều mã này đã bị phản đối với các API Android gần đây. Có ai có một phiên bản cập nhật?
yamspog

H: Nếu tôi muốn khởi động một hoạt động phụ khi chọn một liên hệ (để chúng tôi có cách sao lưu lại danh sách liên lạc một lần nữa), Intent.ACTION_PICK có còn hoạt động không? Tôi bắt đầu nghĩ rằng tôi phải tự lăn con trỏ của mình và sử dụng setListAd CHƯƠNG, như trong câu hỏi chính. Hmm ...
Joe D'Andrea

6
Không có gì sai ở đây ... bạn không cần sự cho phép liên hệ ĐỌC vì người dùng đang kiểm soát ở đây. Bản thân ứng dụng không đọc nội bộ danh bạ mà thay vào đó là một danh sách liên lạc. Chỉ khi người dùng chọn một liên hệ (hành động thủ công) thì ứng dụng mới có khả năng truy xuất một bộ dữ liệu giới hạn được liên kết với thông tin liên hệ đó.
ddewaele

1
Tôi đã có thể cho phép người dùng chọn một số liên lạc mà không có quyền ĐỌC trên điện thoại Android 4.0+ của tôi nhưng không phải trên 1.6. Bất cứ ai cũng biết chức năng này xuất hiện ở phiên bản nào?
amit

1
PICK_CONTACT đang thất bại đối với tôi. Làm thế nào bạn khởi tạo nó?
3104760

67

Tôi thực hiện theo cách này để phát hành Android 2.2 Froyo: về cơ bản sử dụng nhật thực để tạo một lớp như: lớp công khai somePickContactName mở rộng Hoạt động

sau đó chèn mã này. Hãy nhớ thêm các biến lớp riêng và CONSTANTS được tham chiếu trong phiên bản mã của tôi:

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

ứng dụng gặp sự cố, khi cố gắng nhận e-mail lần thứ hai. Chỉnh sửa: nếu người khác gặp lỗi tương tự, chỉ cần xóa "con trỏ. Đóng ();" stackoverflow.com/questions/9696868/ từ
alicanbatur

14

Tìm kiếm một giải pháp API cấp 5 bằng cách sử dụng API ContactContract, bạn có thể sửa đổi một chút mã ở trên bằng cách sau:

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

Và sau đó trong onActivityResult sử dụng tên cột:

  ContactsContract.Contacts.DISPLAY_NAME

1
Có gì để hiển thị số điện thoại liên lạc?
Usman Masood

Không có các lớp như vậy trong Android 1.6. Tôi đã tìm thấy những cái tên tương tự trong Danh bạ.ContactMethods nhưng tôi chỉ có ngoại lệ (không thể tìm thấy hoạt động như vậy). Nhưng mã của Reto hoạt động tốt
davs

8

Đây là đoạn mã để nhận liên hệ:

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

}


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

        }

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

bởi vì không chọn bất kỳ liên hệ nào, nó sẽ đưa ra một ngoại lệ. vì vậy tốt hơn để kiểm tra tình trạng này.


5

Mã hoàn chỉnh được đưa ra dưới đây

    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

1
PICK_CONTACT được khởi tạo ở đâu?
Edward Falk

1
Nó được khai báo ở đầu lớp hoạt động : private static final int PICK_CONTACT = 1;.
Omar

3

Thật ngạc nhiên, bạn không cần sự cho phép của người dùng CONTACT_READ để đọc tên và một số thông tin cơ bản (Có phải số liên lạc được gắn dấu sao, thời gian gọi cuối cùng là gì). Tuy nhiên, bạn cần có quyền đọc chi tiết liên lạc như số điện thoại.


3

Hãy cẩn thận trong khi làm việc với danh sách liên lạc Android.

Đọc danh sách liên lạc trong các phương pháp trên hoạt động trên hầu hết các thiết bị Android ngoại trừ HTC One và Sony Xperia. Nó lãng phí sáu tuần của tôi để cố gắng tìm ra những gì sai!

Hầu hết các hướng dẫn có sẵn trực tuyến gần như tương tự - đầu tiên đọc danh bạ "TẤT CẢ", sau đó hiển thị Listviewvới ArrayAdapter. Đây không phải là giải pháp hiệu quả bộ nhớ. Thay vì tìm kiếm giải pháp trên các trang web khác trước, hãy xem developer.android.com. Nếu bất kỳ giải pháp nào không có sẵn trên developer.android.com, bạn nên tìm một nơi khác.

Giải pháp là sử dụng CursorAdapterthay vì ArrayAdaptertruy xuất danh sách liên lạc. Sử dụng ArrayAdaptersẽ hoạt động trên hầu hết các thiết bị, nhưng nó không hiệu quả. Các CursorAdaptertruy xuất chỉ lấy một phần của danh sách liên lạc trong thời gian chạy trong khi ListViewđang được cuộn.

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

Lấy danh sách danh bạ: Lấy danh sách danh bạ


1

Tôi đang sử dụng phương pháp này để đọc Danh bạ

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

1

xin chào, tôi có một mã để lưu số liên lạc trong cơ sở dữ liệu của bạn bằng cách chia sẻ tùy chọn ở đây là mã của tôi

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

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

0

Tôi sử dụng được cung cấp bởi @Colin MacKenzie - III. Cảm ơn rất nhiều!

Đối với ai đó đang tìm kiếm một sự thay thế của ManagedQuery bị phản đối:

Thứ nhất, giả sử sử dụng lib hỗ trợ v4:

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

lần 2:

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

lần thứ 3,

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

Thứ 4, ghi đè các cuộc gọi lại:

@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) {
}

ngày 5:

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

Thứ 6, mã ở trên , ngoại trừ việc tôi thay đổi thông số chữ ký từ Ý định thành Con trỏ:

protected void getContactInfo(Cursor cursor)
{

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

Thứ 7, gọi initLoader:

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

Thứ 8, đừng quên đoạn mã này

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

Người giới thiệu:

Nguyên tắc cơ bản của Android: Tải dữ liệu đúng cách

Khởi tạo Trình tải trong một Hoạt động

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.