Android读取通讯录联系人

51 篇文章 0 订阅

本文给出了Android读取通讯录联系人的一般方法,且在读取Android通讯录联系人时候,将结果有序化(按照联系人姓名的首字符依次顺序读取:A ~ Z)。

读取的结果如图所示:


现给出实现该种Android通讯录读取的代码:

package zhangphil.contacts;  
  
import java.util.ArrayList;  
  
import android.app.ListActivity;  
import android.content.ContentResolver;  
import android.content.Context;  
import android.database.Cursor;  
import android.net.Uri;  
import android.os.Bundle;  
import android.provider.ContactsContract;  
import android.view.LayoutInflater;  
import android.view.View;  
import android.view.ViewGroup;  
import android.widget.ArrayAdapter;  
import android.widget.ListView;  
import android.widget.TextView;  
  
public class MainActivity extends ListActivity {  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
  
        ArrayList<Contact> contacts = new ArrayList<Contact>();  
        readContacts(contacts);  
  
        ListView listView = this.getListView();  
        ArrayAdapter<Contact> adapter = new MyAdapter(this,  
                android.R.layout.simple_list_item_2, contacts);  
        listView.setAdapter(adapter);  
    }  
  
    private class MyAdapter extends ArrayAdapter<Contact> {  
  
        private int resource;  
        private LayoutInflater inflater = null;  
        private ArrayList<Contact> contacts;  
  
        public MyAdapter(Context context, int resource,  
                ArrayList<Contact> contacts) {  
            super(context, resource);  
            this.resource = resource;  
            this.contacts = contacts;  
  
            inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
        }  
  
        @Override  
        public View getView(int position, View convertView, ViewGroup parent) {  
  
            if (convertView == null)  
                convertView = inflater.inflate(resource, null);  
  
            Contact c = getItem(position);  
  
            TextView text1 = (TextView) convertView  
                    .findViewById(android.R.id.text1);  
            TextView text2 = (TextView) convertView  
                    .findViewById(android.R.id.text2);  
  
            //首字符,分组的依据。  
            text1.setText(c.firstLetterOfName());  
              
            //详情。  
            text2.setText(c.name + " " + c.getPhoneNumbers());  
  
            return convertView;  
        }  
  
        @Override  
        public Contact getItem(int pos) {  
            return contacts.get(pos);  
        }  
  
        @Override  
        public int getCount() {  
            return contacts.size();  
        }  
    }  
  
    // 读取设备联系人的一般方法。大致流程就是这样,模板化的操作代码。  
    private void readContacts(ArrayList<Contact> contacts) {  
        Uri uri = Uri.parse("content://com.android.contacts/contacts");  
        ContentResolver reslover = this.getContentResolver();  
  
        // 在这里我们给query传递进去一个SORT_KEY_PRIMARY。  
        // 告诉ContentResolver获得的结果安装联系人名字的首字母有序排列。  
        Cursor cursor = reslover.query(uri, null, null, null,  
                android.provider.ContactsContract.Contacts.SORT_KEY_PRIMARY);  
  
        while (cursor.moveToNext()) {  
  
            // 联系人ID  
            String id = cursor  
                    .getString(cursor  
                            .getColumnIndex(android.provider.ContactsContract.Contacts._ID));  
  
            // Sort Key,读取的联系人按照姓名从 A->Z 排序分组。  
            String sort_key_primary = cursor  
                    .getString(cursor  
                            .getColumnIndex(android.provider.ContactsContract.Contacts.SORT_KEY_PRIMARY));  
  
            // 获得联系人姓名  
            String name = cursor  
                    .getString(cursor  
                            .getColumnIndex(android.provider.ContactsContract.Contacts.DISPLAY_NAME));  
  
            Contact mContact = new Contact();  
            mContact.id = id;  
            mContact.name = name;  
            mContact.sort_key_primary = sort_key_primary;  
  
            // 获得联系人手机号码  
            Cursor phone = reslover.query(  
                    ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,  
                    ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "="  
                            + id, null, null);  
  
            // 取得电话号码(可能存在多个号码)  
            // 因为同一个名字下,用户可能存有一个以上的号,  
            // 遍历。  
            ArrayList<String> phoneNumbers = new ArrayList<String>();  
            while (phone.moveToNext()) {  
                int phoneFieldColumnIndex = phone  
                        .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);  
                String phoneNumber = phone.getString(phoneFieldColumnIndex);  
                phoneNumbers.add(phoneNumber);  
            }  
  
            mContact.phoneNumbers = phoneNumbers;  
  
            contacts.add(mContact);  
        }  
    }  
  
    // 用于装载从联系人数据库中读取到的数据。  
    // 结构化数据,便于数据操作和访问。  
    private class Contact {  
        public String id;  
        public String name;  
        public String sort_key_primary;  
        public ArrayList<String> phoneNumbers;  
          
        //获得一个联系人名字的首字符。  
        //比如一个人的名字叫“安卓”,那么这个人联系人的首字符是:A。  
        public  String  firstLetterOfName(){  
            String s=sort_key_primary.charAt(0)+"";  
            return  s.toUpperCase();  
        }  
  
        public String getPhoneNumbers() {  
            String phones = " ";  
            for (int i = 0; i < phoneNumbers.size(); i++) {  
                phones += "号码" + i + ":" + phoneNumbers.get(i);  
            }  
  
            return phones;  
        }  
    }  
}  

不要忘记在项目的AndroidManifest.xml文件中添加Android读写通讯录联系人的权限:

[html]  view plain copy
  1. <!-- 写权限 -->  
  2.    <uses-permission android:name="android.permission.WRITE_CONTACTS" />  
  3.    <!-- 读权限 -->  
  4.    <uses-permission android:name="android.permission.READ_CONTACTS" />  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要在Android Studio中读取通讯录,您需要使用ContentResolver类和ContactsContract类。您可以使用ContentResolver查询ContactsContract.Contacts表以获取所有联系人的ID,然后使用ContactsContract.CommonDataKinds.Phone表查询每个联系人电话号码。您还可以使用ContactsContract.CommonDataKinds.Email表查询每个联系人的电子邮件地址。请注意,您需要在AndroidManifest.xml文件中添加READ_CONTACTS权限才能访问通讯录数据。 ### 回答2: Android Studio是一款为Android应用程序开发专门设计的集成开发环境(IDE)。通讯录是存储联系人信息的集合,包括姓名、电话号码、电子邮件等。在开发Android应用程序时,我们通常需要访问设备上的通讯录,并读取其中的联系人信息。下面我们将详细介绍如何在Android Studio中读取通讯录。 第一步是添加必要的权限。在AndroidManifest.xml文件中添加以下代码: ``` <uses-permission android:name="android.permission.READ_CONTACTS" /> ``` 这将授予应用程序读取通讯录的权限。 第二步是编写代码。我们可以使用ContentResolver类来读取通讯录: ``` ContentResolver contentResolver = getContentResolver(); Cursor cursor = contentResolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); if (cursor.getCount() > 0) { while (cursor.moveToNext()) { String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); if (Integer.parseInt(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) { Cursor phoneCursor = contentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[]{id}, null); while (phoneCursor.moveToNext()) { String phone = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); } phoneCursor.close(); } } } cursor.close(); ``` 以上代码将查询所有联系人,并将它们的姓名和电话号码显示在控制台上。 完成以上两个步骤后,我们便能够在Android Studio中成功读取通讯录了。需要注意的是,读取通讯录的操作可能会很耗时,因此应该避免在UI线程上执行此操作,以免造成不良用户体验。建议使用AsyncTask或Loader等异步工具来执行此操作。 ### 回答3: 在Android Studio中读取通讯录需要使用ContentProvider和Cursor对象来获取数据。ContentProvider是一个Android框架的核心组件,用于管理应用程序中的数据,包括通讯录信息。通讯录数据可以使用ContactsContract类来访问。 首先,我们需要在AndroidManifest.xml文件中添加读取通讯录的权限: ```xml <uses-permission android:name="android.permission.READ_CONTACTS" /> ``` 接下来,在Activity或Fragment中获取通讯录数据。我们可以用以下代码来获取所有联系人的姓名和手机号码: ```java ContentResolver contentResolver = getContentResolver(); String[] projection = new String[] { ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER }; Cursor cursor = contentResolver.query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, projection, null, null, null ); if (cursor != null) { while (cursor.moveToNext()) { String name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); String phoneNumber = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); Log.d(TAG, "Name: " + name + " Phone Number: " + phoneNumber); } cursor.close(); } ``` 上面的代码首先获取了ContentResolver对象,然后使用projection数组获取需要的通讯录信息,使用ContentResolver的query方法获取通讯录数据Cursor对象。最后使用while循环遍历Cursor对象,获取每个联系人的姓名和手机号码。 注意,应该在使用完Cursor对象后及时关闭它,以释放资源。 以上就是在Android Studio中读取通讯录的方法。读取通讯录Android开发中经常用到的一个功能,也是了解ContentProvider和Cursor对象的重要一步。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值