代码之家  ›  专栏  ›  技术社区  ›  Tam N.

如何呼叫Android联系人列表?

  •  129
  • Tam N.  · 技术社区  · 16 年前

    我正在制作一个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);
        }
    }
    
    13 回复  |  直到 7 年前
        1
  •  246
  •   H. Pauwelyn    9 年前

    我不完全确定您的示例代码应该做什么,但是下面的代码片段应该可以帮助您“调用联系人列表函数,选择一个联系人,然后使用联系人的姓名返回到[您的]应用程序”。

    这个过程有三个步骤。

    1。权限

    添加将联系人数据读取到应用程序清单的权限。

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

    2。调用联系人选取器

    在您的活动中,创建一个意图,要求系统查找一个可以从联系人URI中的项目执行选择操作的活动。

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

    呼叫 startActivityForResult ,传递此意图(和请求代码整数, PICK_CONTACT 在本例中)。这将导致Android启动一个注册为支持的活动 ACTION_PICK People.CONTENT_URI ,然后在进行选择(或取消选择)时返回到此活动。

    startActivityForResult(intent, PICK_CONTACT);
    

    三。倾听结果

    在您的活动中,重写 onActivityResult 方法来监听在步骤2中启动的“选择联系人”活动的返回。您应该检查返回的请求代码是否与您期望的值匹配,结果代码是否为 RESULT_OK .

    您可以通过调用 getData() 数据 意向参数。要获取所选联系人的名称,需要使用该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 (how to call android contacts list) .

        2
  •  67
  •   Colin MacKenzie - III    14 年前

    我这样做是为了Android 2.2 Froyo版本: 基本上使用Eclipse创建一个类,比如: 公共类SomePickContactName扩展活动

    然后插入此代码。请记住添加我的代码版本中引用的私有类变量和常量:

    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
    
        3
  •  14
  •   Daddyboy    15 年前

    使用contactsControlAPI四处寻找API级别5的解决方案,您可以使用以下方法稍微修改上面的代码:

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

    然后在OnActivityResult中使用列名:

      ContactsContract.Contacts.DISPLAY_NAME
    
        4
  •  8
  •   Mayur Bhola    13 年前

    下面是get contact的代码段:

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

    }

        5
  •  6
  •   Maidul    12 年前
            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));
    
            }
    
        6
  •  5
  •   takrl cck    14 年前
    public void onActivityResult(int requestCode, int resultCode, Intent intent) 
    {
      if (requestCode == PICK_CONTACT && intent != null) //here check whether intent is null R not
      {  
      }
    }
    

    因为如果不选择任何联系人,它将给出一个异常。所以最好检查一下这种情况。

        7
  •  5
  •   Foyzul Karim    13 年前

    完整的代码如下

        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
    
        8
  •  3
  •   Vicky Singh    13 年前

    令我惊讶的是,你不需要用户权限的联系人来读取姓名和一些基本信息(联系人是星标的,最后一次通话时间是什么)。 但是,您需要权限才能阅读联系人的详细信息,如电话号码。

        9
  •  3
  •   Pragati Singh    7 年前

    使用Android联系人列表时要小心。

    除了HTC One和Sony Xperia外,阅读上述方法中的联系人列表对大多数Android设备都有效。 浪费了我六个星期的时间 想弄清楚是怎么回事!

    大多数在线教程几乎是相似的-首先阅读“所有”联系人,然后显示在 Listview 具有 ArrayAdapter . 这不是内存高效的解决方案。与其先在其他网站上寻找解决方案,不如先看看developer.android.com。如果developer.android.com上没有可用的解决方案,您应该找别的地方。

    解决方案是使用 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);
    }
    

    检索联系人列表: Retrieving a List of Contacts

        10
  •  1
  •   Zar E Ahmer    9 年前

    我用这种方法来读取联系人

    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
    
        11
  •  1
  •   Abhishek    8 年前

    嗨,我有一个代码可以按共享首选项将联系人保存到数据库中 这是我的密码

    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);
        }
    }
    
        12
  •  0
  •   Ravi    9 年前
    -> 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
    
        13
  •  0
  •   Community CDub    8 年前

    我用 code 由@colin mackenzie-iii提供。非常感谢!

    对于正在寻找“deprecated”managedquery替换项的用户:

    第一,假设使用v4支持库:

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

    第二:

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

    第三,

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

    第五:

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

    第六, code above ,但我将签名参数从意向更改为光标:

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

    第八,别忘了这段代码

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

    参考文献:

    Android Fundamentals: Properly Loading Data

    Initializing a Loader in an Activity