读取短信和联系人经常会用到,要了解的是这是内容提供者的知识点
先说短信,要从数据库中获取数据,就要了解其结构
短信数据库在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以上的版本还要动态获取权限
获取联系人的效果图
时间: 2024-11-03 10:21:26