Android读取短信和联系人

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android读取短信和联系人相关的知识,希望对你有一定的参考价值。

读取短信和联系人经常会用到,要了解的是这是内容提供者的知识点

先说短信,要从数据库中获取数据,就要了解其结构

短信数据库在data-->data中的下面路径

技术分享

它的表结构如下,有3个是我们要注意的

技术分享

Java代码为

     //获取内容提供者
        ContentResolver contentResolver = getContentResolver();
        //获取短信表的路径
        Uri uri = Uri.parse("content://sms");
        //设置要查询的列名
        String[] line = {"address", "date", "body"};
        //各个参数的意思,路径、列名、条件、条件参数、排序
        Cursor cursor = contentResolver.query(uri, line, null, null, null);
        //下面就跟操作普通数据库一样了
        if (cursor != null) {
            while (cursor.moveToNext()) {
                String address = cursor.getString(cursor.getColumnIndex("address"));
                String date = cursor.getString(cursor.getColumnIndex("date"));
                String body = cursor.getString(cursor.getColumnIndex("body"));
                Log.e("短信", "address:" + address + "\\ndate:" + date + "\\nbody:" + body);
            }
            cursor.close();
        }

获取联系人就比较复杂了,其表结构也比较复杂

数据库所在位置data-->data中的下面路径

技术分享

data表

技术分享

 

mimetypes表

技术分享

 raw_contacts表

技术分享

了解其表结果后,就开始写代码了

       private List<ContactsData> contactsDatas = new ArrayList<>();
        //获取内容提供者
        ContentResolver contentResolver = getContentResolver();
        //获取raw_contacts表的路径
        Uri raw_contact_uri = Uri.parse("content://com.android.contacts/raw_contacts");
        //各个参数的意思,路径、列名、条件、条件参数、排序
        Cursor contactId = contentResolver.query(raw_contact_uri, new String[]{"contact_id"}, null, null, null);
        //下面就跟操作普通数据库一样了
        if (contactId != null) {
            while (contactId.moveToNext()) {
                //获取contact_id的值,它对应data表中raw_contact_id的值
                String id = contactId.getString(contactId.getColumnIndex("contact_id"));

                //获取data表的路径
                Uri data_uri = Uri.parse("content://com.android.contacts/data");
                //各个参数的意思,路径、列名、条件、条件参数、排序
                Cursor dataCursor = contentResolver.query(data_uri, new String[]{"mimetype", "data1"},
                        "raw_contact_id=?", new String[]{id}, null);
                if (dataCursor != null) {
                    //每次循环创建一个实例用于保存data表中的数据
                    ContactsData contactsData = new ContactsData();
                    while (dataCursor.moveToNext()) {
                        String type = dataCursor.getString(dataCursor.getColumnIndex("mimetype"));
                        switch (type) {
                            case "vnd.android.cursor.item/email_v2":
                                //这是邮箱信息
                                contactsData.setEmail(dataCursor.getString(dataCursor.getColumnIndex("data1")));
                                break;
                            case "vnd.android.cursor.item/phone_v2":
                                //这是手机号码信息
                                contactsData.setNumber(dataCursor.getString(dataCursor.getColumnIndex("data1")));
                                break;
                            case "vnd.android.cursor.item/name":
                                //这是联系人的名字
                                contactsData.setName(dataCursor.getString(dataCursor.getColumnIndex("data1")));
                                break;
                        }
                    }
                    //把查询到的信息添加到集合中
                    contactsDatas.add(contactsData);
                    dataCursor.close();
                }
            }
            contactId.close();
        }
        for (ContactsData c : contactsDatas) {
            Log.e("联系人", c.toString());
            Toast.makeText(this,c.toString(),Toast.LENGTH_SHORT).show();
        }

为了方便管理创建一个Javabean

public class ContactsData {
    private String email;
    private String number;
    private String name;
    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "ContactsData{" +
                "email=‘" + email + ‘\\‘‘ +
                ", number=‘" + number + ‘\\‘‘ +
                ", name=‘" + name + ‘\\‘‘ +
                ‘}‘;
    }
}

 

最后别忘了加上权限

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

如过是Android 6.0以上的版本还要动态获取权限

 获取联系人的效果图

技术分享

 

以上是关于Android读取短信和联系人的主要内容,如果未能解决你的问题,请参考以下文章

android小知识点代码片段

Android 短信内容 (content://sms/sent)

Android - 片段中的联系人选择器

android经常使用的电话操作

Android面试收集录 电话短信和联系人多媒体技术

数据库获取 Android 短信