Android-手机通讯录相关

参考:Android 获取联系人和电话号码
android之选择联系人并返回电话号码

获取所有联系人的姓名、号码

权限

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

代码:

/**
 * android之获取所有联系人的姓名、号码
 */
public class ContactActivityI extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_contacti);

        String[] cols = {ContactsContract.PhoneLookup.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER};
        Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, cols, null, null, null);
        if (cursor != null) {
            int count = cursor.getCount();
            for (int i = 0; i < count; i++) {
                cursor.moveToPosition(i);
                // 取得联系人名字
                int nameFieldColumnIndex = cursor.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME);
                int numberFieldColumnIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
                String name = cursor.getString(nameFieldColumnIndex);
                String number = cursor.getString(numberFieldColumnIndex);

                Log.e("111", "queryContactPhoneNumber: name==" + name + " number==" + number);
            }
            cursor.close();
        }
    }
}

选择联系人并返回电话号码

权限:

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

代码:

/**
 * http://blog.csdn.net/jason0539/article/details/21855825
 * android之选择联系人并返回电话号码
 */
public class ContactActivity extends Activity {
    private TextView show;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_contact);

        Button pick = (Button) findViewById(R.id.pick);
        show = (TextView) findViewById(R.id.show);
        pick.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
                ContactActivity.this.startActivityForResult(intent, 1);
            }
        });
    }

    @SuppressWarnings("deprecation")
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        switch (requestCode) {
            case 1:
                if (resultCode == RESULT_OK) {
                    Uri contactData = data.getData();
                    Cursor cursor = managedQuery(contactData, null, null, null, null);
                    cursor.moveToFirst();
                    String num = getContactPhone(cursor);

                    show.setText("所选手机号为:" + num);

                    //号码会有空格,如259 9281 7922
                    Log.e("333", "num==" + num);
                    String trim = num.trim();
                    Log.e("333", "trim==" + trim);
                    String replace = trim.replace(" ", "");
                    Log.e("333", "replace==" + replace);
                }
                break;

            default:
                break;
        }
    }

    private String getContactPhone(Cursor cursor) {
        int phoneColumn = cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER);
        int phoneNum = cursor.getInt(phoneColumn);

        String result = "";
        if (phoneNum > 0) {
            // 获得联系人的ID号
            int idColumn = cursor.getColumnIndex(ContactsContract.Contacts._ID);
            String contactId = cursor.getString(idColumn);

            // 获得联系人电话的cursor
            Cursor phoneCursor = getContentResolver().query(
                    ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                    null,
                    ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "="
                            + contactId, null, null);
            if (phoneCursor != null && phoneCursor.moveToFirst()) {
                for (; !phoneCursor.isAfterLast(); phoneCursor.moveToNext()) {
                    int index = phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
                    result = phoneCursor.getString(index);
                }
                if (!phoneCursor.isClosed()) {
                    phoneCursor.close();
                }
            }
        }
        return result;
    }

}

activity_contact.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin">

    <TextView
        android:id="@+id/show"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

    <Button
        android:id="@+id/pick"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/show"
        android:layout_below="@+id/show"
        android:text="选择联系人" />

</RelativeLayout>

拨打电话:

Intent intent = new Intent();  
intent.setAction(Intent.ACTION_CALL);//ACTION_DIAL  
intent.setData(Uri.parse("tel:"+"110"));  
startActivity(intent);  

权限:

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

通讯录相关知识:

参考:Android通讯录数据库介绍与基本操作(增删改查)

Android联系人数据库文件(contact2.db):

比较重要的几个表:


1、contacts表

_id :表的ID,主要用于其它表通过contacts 表中的ID可以查到相应的数据。 
display_name: 联系人名称 
photo_id:头像的ID,如果没有设置联系人头像,这个字段就为空 
times_contacted:通话记录的次数 
last_time_contacted: 最后的通话时间 
lookup :是一个持久化的储存,因为用户可能会改名,但是它改不了lookup 

该表保存了本机保存的所有联系人,每个联系人占一行,该表保存了联系人的ContactID、联系次数、最后一次联系的时间、是否含有号码、是否被添加到收藏夹等信息。

2、raw_contacts表

version :版本号,用于监听变化 
deleted :删除标志, 0为默认 1 表示这行数据已经删除 
display_name : 联系人名称 
last_time_contacts : 最后联系的时间 

该表保存了所有创建过的手机联系人,每个联系人占一行,表里有一列标识该联系人是否被删除,该表保存了两个ID: RawContactID和ContactID,从而将contacts表和raw_contacts表联系起来。该表保存了联系人的RawContactID、ContactID、联系次数、最后一次联系的时间、是否被添加到收藏夹、显示的名字、用于排序的汉语拼音等信息。

3、 mimetypes 表
该表定义了所有的MimeTypeID,即联系人的各个字段的唯一标志。

4、data表
该表保存了所有创建过的手机测联系人的所有信息,每个字段占一行 ,该表保存了两个ID: MimeTypeID和RawContactID,从而将data表和raw_contacts表联系起来。

联系人的所有信息保存在列data1至data15中,各列中保存的内容根据MimeTypeID的不同而不同。如保存号码(MimeTypeID=5)的那行数据中,data1列保存号码,data2列保存号码类型(手机号码/家庭号码/工作号码等)。

对联系人的基本操作(增删改查)权限设置:

 <!-- 读联系人权限 -->
 <uses-permission android:name="android.permission.READ_CONTACTS"/>
 <!-- 写联系人权限 -->
 <uses-permissionandroid:name="android.permission.WRITE_CONTACTS" />

其他:

contacts表也就是联系人表的URI

scontent://com.android.contacts/contact 

对应类静态常量为

ContactsContract.Contacts.CONTENT_URI

联系人电话URI

content://com.android.contacts/data/phones 

对应静态常量为

ContactsContract.CommonDataKinds.Phone.CONTENT_URI

联系人邮箱URI

content://com.android.contacts/data/emails  ,

对应静态常量为

ContactsContract.CommonDataKinds.Email.CONTENT_URI

联系人地址URI

content://com.android.contacts/data/postals  ,

对应静态常量为

ContactsContract.CommonDataKinds.StructuredPostall.CONTENT_URI

所有联系人的Uri

content://contacts/people

某个联系人x的Url

content://contacts/people/x

data表URI

content://com.Android.contacts/data

对应静态常量为

ContactsContract.Data.CONTENT_URI

通过content://com.android.contacts/contacts ,你就可以查找contacts表
其中比较重要的字段有:
_id–>联系人的ID

通过content://com.android.contacts/data 你就可以查询data表
row_contact_id–>联系人的id地址
data1–>所存在联系人的名字、邮箱和出生地
data2–>指明数据的类型(一个int型,相当于mineetypes的id)。eg vnd.android.cursor.item/email_v2
minetypes–>指明具体的数据的类型

当你不知道你表中有多少数据的时候,最好就是通过cursor.getColumnnames()来打印你所有的列,然后去数据库中找寻相对应的值

而实际上,在你使用的过程中,你完全可以通过content://com.android.contacts/data来查询到所有的数据,
但是那样你就不好判断id,所以才会引用contacts的URI,用于id的分别,也好查询一个联系人。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值