วิธีโทรรายชื่อผู้ติดต่อ Android


131

ฉันกำลังสร้างแอป Android และต้องการโทรไปยังรายชื่อผู้ติดต่อของโทรศัพท์ ฉันต้องการเรียกใช้ฟังก์ชันรายชื่อผู้ติดต่อเลือกผู้ติดต่อจากนั้นกลับไปที่แอพของฉันพร้อมชื่อผู้ติดต่อ นี่คือรหัสที่ฉันได้รับทางอินเทอร์เน็ต แต่ใช้งานไม่ได้

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

คุณช่วยแก้ไขส่วนโค้ดเพื่อรวมส่วนแรกของโค้ดได้ไหม: import android.app.ListActivity ...
David Glass

1.6 & 2.2 ข้อสอบนี้: coderanch.com/t/512048/Android/Mobile/Contact-API
Blundell

พยายามระบายติดต่อหุ่นยนต์ ง่ายขนาดเล็กง่ายต่อการใช้ห้องสมุด
nitesh

คำตอบ:


251

ฉันไม่แน่ใจ 100% ว่าโค้ดตัวอย่างของคุณควรจะทำอะไร แต่ตัวอย่างข้อมูลต่อไปนี้จะช่วยให้คุณเรียกใช้ฟังก์ชันรายชื่อผู้ติดต่อเลือกผู้ติดต่อจากนั้นกลับไปที่แอป [ของคุณ] โดยใช้ชื่อผู้ติดต่อ "

กระบวนการนี้มีสามขั้นตอน

1. สิทธิ์

เพิ่มสิทธิ์ในการอ่านข้อมูลผู้ติดต่อไปยังรายการแอปพลิเคชันของคุณ

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

2. โทรหาตัวเลือกผู้ติดต่อ

ภายในกิจกรรมของคุณสร้าง Intent ที่ขอให้ระบบค้นหากิจกรรมที่สามารถดำเนินการ PICK จากรายการใน URI ผู้ติดต่อ

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

โทรstartActivityForResultผ่านใน Intent นี้ (และจำนวนเต็มรหัสคำขอPICK_CONTACTในตัวอย่างนี้) ซึ่งจะทำให้เกิด Android จะเปิดตัวกิจกรรมที่ลงทะเบียนเพื่อสนับสนุนACTION_PICKในPeople.CONTENT_URIแล้วกลับไปที่กิจกรรมนี้เมื่อเลือกที่จะทำ (หรือยกเลิก)

startActivityForResult(intent, PICK_CONTACT);

3. การรับฟังผลลัพธ์

นอกจากนี้ในกิจกรรมของคุณให้แทนที่onActivityResultวิธีการรับฟังผลตอบแทนจากกิจกรรม "เลือกผู้ติดต่อ" ที่คุณเปิดตัวในขั้นตอนที่ 2 คุณควรตรวจสอบว่ารหัสคำขอที่ส่งคืนตรงกับค่าที่คุณคาดหวังและรหัสผลลัพธ์คือRESULT_OKคุณควรตรวจสอบว่ารหัสคำขอกลับตรงกับค่าที่คุณคาดหวังและที่รหัสผลที่ได้คือ

คุณสามารถรับ URI ของผู้ติดต่อที่เลือกได้โดยเรียกgetData()ใช้พารามิเตอร์data Intent ในการรับชื่อของผู้ติดต่อที่เลือกคุณต้องใช้ URI นั้นเพื่อสร้างแบบสอบถามใหม่และแยกชื่อจากเคอร์เซอร์ที่ส่งคืน

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

รหัสที่มาเต็มรูปแบบ: tutorials-android.blogspot.com (วิธีการเรียกรายชื่อหุ่นยนต์รายการ)


41
ดูเหมือนว่ารหัสนี้จำนวนมากได้เลิกใช้งาน Android APIs ล่าสุดแล้ว มีใครมีรุ่นอัพเดทไหม
yamspog

ถาม: ถ้าฉันต้องการเริ่มต้นกิจกรรมย่อยเมื่อเลือกผู้ติดต่อ (เพื่อให้เรามีวิธีสำรองข้อมูลรายชื่อผู้ติดต่ออีกครั้ง) Intent.ACTION_PICK จะยังคงใช้งานได้หรือไม่ ฉันเริ่มคิดว่าฉันต้องหมุนเคอร์เซอร์ของตัวเองและใช้ setListAdapter เหมือนในคำถามหลัก อืม ...
Joe D'Andrea

6
ไม่มีอะไรผิดปกติที่นี่ ... คุณไม่จำเป็นต้องได้รับอนุญาตให้อ่านติดต่อเนื่องจากผู้ใช้เป็นผู้ควบคุมที่นี่ ตัวแอปไม่อ่านรายชื่อติดต่อภายใน แต่จะปรากฏรายชื่อผู้ติดต่อ เฉพาะเมื่อผู้ใช้เลือกผู้ติดต่อ (การดำเนินการด้วยตนเอง) เท่านั้นแอปที่สามารถดึงข้อมูลชุดที่ จำกัด ที่เชื่อมโยงกับข้อมูลการติดต่อนั้นได้
ddewaele

1
ฉันสามารถให้ผู้ใช้เลือกผู้ติดต่อโดยไม่ได้รับอนุญาตให้อ่านบนโทรศัพท์ Android 4.0+ ของฉัน แต่ไม่ใช่บน 1.6 มีใครรู้บ้างว่าฟังก์ชันนี้มาจากเวอร์ชันใด
มิต

1
PICK_CONTACT ล้มเหลวสำหรับฉัน คุณเริ่มต้นได้อย่างไร?
user3104760

67

ฉันทำแบบนี้สำหรับ Android 2.2 Froyo รุ่น: โดยทั่วไปใช้ eclipse เพื่อสร้างคลาสเช่น: คลาสสาธารณะ SomePickContactName ขยายกิจกรรม

จากนั้นใส่รหัสนี้ อย่าลืมเพิ่มตัวแปรคลาสส่วนตัวและ CONSTANTS ที่อ้างอิงในโค้ดเวอร์ชันของฉัน:

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

แอพขัดข้องเมื่อพยายามรับอีเมลครั้งที่สอง แก้ไข: หากมีผู้อื่นได้รับข้อผิดพลาดเดียวกันให้ลบ "cursor.close ();" stackoverflow.com/questions/9696868/…
alicanbatur

14

มองหาโซลูชัน API ระดับ 5 โดยใช้ ContactsContract API คุณสามารถแก้ไขโค้ดด้านบนได้เล็กน้อยด้วยสิ่งต่อไปนี้:

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

จากนั้นใน onActivityResult ใช้ชื่อคอลัมน์:

  ContactsContract.Contacts.DISPLAY_NAME

1
มีอะไรสำหรับแสดงหมายเลขโทรศัพท์ติดต่อ?
Usman Masood

ไม่มีคลาสดังกล่าวใน Android 1.6 ฉันพบชื่อที่คล้ายกันใน ContactsContactMethods แต่ฉันมีข้อยกเว้นเท่านั้น (ไม่พบกิจกรรมดังกล่าว) แต่รหัส Reto ของการทำงานที่ดี
davs

8

นี่คือข้อมูลโค้ดสำหรับติดต่อ:

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

เนื่องจากไม่เลือกผู้ติดต่อใด ๆ จะทำให้เกิดข้อยกเว้น ตรวจสอบเงื่อนไขนี้ดีกว่า


5

รหัสที่สมบูรณ์จะได้รับด้านล่าง

    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 เริ่มต้นที่ไหน
Edward Falk

1
private static final int PICK_CONTACT = 1;มันจะได้รับการประกาศที่ด้านบนของระดับกิจกรรม:
Omar

3

ฉันแปลกใจที่คุณไม่จำเป็นต้องได้รับอนุญาตจากผู้ใช้ CONTACT_READ เพื่ออ่านชื่อและข้อมูลพื้นฐานบางอย่าง (ผู้ติดต่อติดดาวหรือไม่เวลาโทรครั้งสุดท้ายคืออะไร) อย่างไรก็ตามคุณต้องได้รับอนุญาตในการอ่านรายละเอียดของผู้ติดต่อเช่นหมายเลขโทรศัพท์


3

ระวังขณะทำงานกับรายชื่อผู้ติดต่อ Android

การอ่านรายชื่อผู้ติดต่อด้วยวิธีการข้างต้นใช้ได้กับอุปกรณ์ Android ส่วนใหญ่ยกเว้น HTC One และ Sony Xperia ฉันเสียเวลาไปหกสัปดาห์พยายามคิดว่ามีอะไรผิดพลาด!

บทเรียนส่วนใหญ่มีออนไลน์ที่คล้ายกันเกือบ - ครั้งแรกที่อ่าน "ทั้งหมด" รายชื่อนั้นแสดงในด้วยListview ArrayAdapterนี่ไม่ใช่วิธีแก้ปัญหาหน่วยความจำที่มีประสิทธิภาพ แทนที่จะมองหาวิธีแก้ปัญหาในเว็บไซต์อื่นก่อนให้ดูที่ developer.android.com หากไม่มีโซลูชันใดใน developer.android.com คุณควรดูที่อื่น

วิธีแก้ปัญหาคือใช้CursorAdapterแทนArrayAdapterการดึงรายชื่อผู้ติดต่อ การใช้ArrayAdapterงานจะใช้ได้กับอุปกรณ์ส่วนใหญ่ แต่ไม่มีประสิทธิภาพ การCursorAdapterดึงข้อมูลเพียงบางส่วนของรายชื่อผู้ติดต่อในขณะรันไทม์ในขณะที่ListViewกำลังเลื่อน

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

การดึงรายชื่อผู้ติดต่อ: การดึงรายชื่อผู้ติดต่อ


1

ฉันใช้วิธีนี้เพื่ออ่านรายชื่อติดต่อ

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

สวัสดีฉันมีรหัสสำหรับบันทึกผู้ติดต่อในฐานข้อมูลของคุณโดยแบ่งตามความชอบนี่คือรหัสของฉัน

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

ฉันใช้รหัสให้มาโดย @Colin MacKenzie - III ขอบคุณมาก!

สำหรับผู้ที่กำลังมองหาการเปลี่ยน ManagedQuery ที่ 'เลิกใช้แล้ว':

ประการที่ 1 สมมติว่าใช้ v4 support lib:

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

อันดับ 2:

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

วันที่ 3

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

ประการที่ 4 แทนที่การเรียกกลับ:

@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:

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 รหัสด้านบนยกเว้นว่าฉันเปลี่ยนพารามิเตอร์ลายเซ็นจาก Intent เป็น Cursor:

protected void getContactInfo(Cursor cursor)
{

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

อันดับที่ 7 เรียก initLoader:

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

8 อย่าลืมรหัสนี้

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

อ้างอิง:

พื้นฐาน Android: การโหลดข้อมูลอย่างถูกต้อง

การเริ่มต้น Loader ในกิจกรรม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.