Android读取短信和联系人
讀取短信和聯(lián)系人經(jīng)常會(huì)用到,要了解的是這是內(nèi)容提供者(contentProvider)的知識(shí)點(diǎn),大家都知道數(shù)據(jù)庫是在data-->data 對(duì)應(yīng)的包目錄下,其他應(yīng)用是不可以訪問到的,如果有些數(shù)據(jù)要提供給其他的應(yīng)用,比如通信錄,其他應(yīng)用想獲取它的數(shù)據(jù)怎么辦呢,這時(shí)內(nèi)容提供者就出現(xiàn)了,預(yù)先寫好了一些操作數(shù)據(jù)庫的方法,因?yàn)榉椒ㄊ情_發(fā)這個(gè)應(yīng)用的開發(fā)者提供的,所以保證了數(shù)據(jù)庫的安全操作,又能共享數(shù)據(jù)。
短信
開始切入正題,先說短信,要從數(shù)據(jù)庫中獲取數(shù)據(jù),就要了解其結(jié)構(gòu)
短信數(shù)據(jù)庫在data-->data中的下面路徑
它的表結(jié)構(gòu)如下,有3個(gè)是我們要注意的,這3個(gè)是我們待會(huì)要用到的,其中date是毫秒值
Java代碼為
//獲取內(nèi)容提供者ContentResolver contentResolver = getContentResolver();//獲取短信表的路徑Uri uri = Uri.parse("content://sms");//設(shè)置要查詢的列名String[] line = {"address", "date", "body"};//各個(gè)參數(shù)的意思,路徑、列名、條件、條件參數(shù)、排序Cursor cursor = contentResolver.query(uri, line, null, null, null);//下面就跟操作普通數(shù)據(jù)庫一樣了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();}聯(lián)系人
獲取聯(lián)系人就比較復(fù)雜了,其表結(jié)構(gòu)也比較復(fù)雜,我們獲取聯(lián)系人的姓名、電話號(hào)碼、郵箱,要通過3張表去提取
數(shù)據(jù)庫所在位置data-->data中的下面路徑
data表,這個(gè)表中的“data1”列幾乎包含了我們想要的數(shù)據(jù),但是如何通過分類提取,第四列的代號(hào)說明了data1數(shù)據(jù)的類型,這些代號(hào)在mimetypes表中有對(duì)應(yīng)的說明,要找到這些數(shù)據(jù),又要通過raw_contact_id去查找,這些ID又來于raw_contacts表中
?
mimetypes表,對(duì)代號(hào)類型的說明
?raw_contacts表,我們通信錄中要顯示的信息必須要在這里找到對(duì)應(yīng)的ID,當(dāng)我們刪除了聯(lián)系人,data表中的數(shù)據(jù)并沒有刪除,只是刪除了證張表contact_id變?yōu)閚ull,而不是真的刪除
了解其表結(jié)構(gòu)后,就開始寫代碼了
//獲取內(nèi)容提供者ContentResolver contentResolver = getContentResolver();//獲取raw_contacts表的路徑Uri raw_contact_uri = Uri.parse("content://com.android.contacts/raw_contacts");//各個(gè)參數(shù)的意思,路徑、列名、條件、條件參數(shù)、排序Cursor contactId = contentResolver.query(raw_contact_uri, new String[]{"contact_id"}, null, null, null);//下面就跟操作普通數(shù)據(jù)庫一樣了if (contactId != null) {while (contactId.moveToNext()) {//獲取contact_id的值,它對(duì)應(yīng)data表中raw_contact_id的值String id = contactId.getString(contactId.getColumnIndex("contact_id"));//獲取data表的路徑Uri data_uri = Uri.parse("content://com.android.contacts/data");//各個(gè)參數(shù)的意思,路徑、列名、條件、條件參數(shù)、排序Cursor dataCursor = contentResolver.query(data_uri, new String[]{"mimetype", "data1"},"raw_contact_id=?", new String[]{id}, null);if (dataCursor != null) {//每次循環(huán)創(chuàng)建一個(gè)實(shí)例用于保存data表中的數(shù)據(jù)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"://這是手機(jī)號(hào)碼信息contactsData.setNumber(dataCursor.getString(dataCursor.getColumnIndex("data1")));break;case "vnd.android.cursor.item/name"://這是聯(lián)系人的名字contactsData.setName(dataCursor.getString(dataCursor.getColumnIndex("data1")));break;}}//把查詢到的信息添加到集合中 contactsDatas.add(contactsData);dataCursor.close();}}contactId.close();}Log.d("測試","開始打印");for (ContactsData c : contactsDatas) {Log.e("聯(lián)系人", c.toString());}為了方便管理創(chuàng)建一個(gè)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;}@Overridepublic String toString() {return "ContactsData{" +"email='" + email + '\'' +", number='" + number + '\'' +", name='" + name + '\'' +'}';} }最后別忘了加上權(quán)限
<uses-permission android:name="android.permission.READ_SMS"/> <uses-permission android:name="android.permission.READ_CONTACTS"/>如過是Android 6.0以上的版本還要?jiǎng)討B(tài)獲取權(quán)限
?獲取聯(lián)系人的效果圖
真正應(yīng)用
通常不會(huì)這樣直接寫它的路徑的,因?yàn)槭謾C(jī)廠商會(huì)修改它的路徑,還是這樣寫的話會(huì)報(bào)錯(cuò),說不存在這一列,需要使用Android提供的API
/*** 通過ContactsContract.Contacts.CONTENT_URI來獲取_ID和DISPLAY_NAME* _ID 該聯(lián)系人的索引* 通過這個(gè)ID可以在ContactsContract.CommonDataKinds.Phone.CONTENT_URI 中找到該聯(lián)系人的電話號(hào)碼* 通過這個(gè)ID可以在ContactsContract.CommonDataKinds.Email.CONTENT_URI 找到該聯(lián)系人的郵箱* DISPLAY_NAME 是該聯(lián)系人的姓名*/Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);if (cursor != null) {while (cursor.moveToNext()) {ContactsData contactsData = new ContactsData();//獲取該聯(lián)系人的IDString contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));//該聯(lián)系人的姓名String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));contactsData.setName(name);/*** 查找該聯(lián)系人的phone信息* 在ContactsContract.CommonDataKinds.Phone.CONTENT_URI 中查詢* 條件為ContactsContract.CommonDataKinds.Phone.CONTACT_ID = 上面查詢到的ID*/Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + contactId, null, null);if (phones != null && phones.moveToNext()) {//獲取該聯(lián)系人的手機(jī)號(hào)碼String number = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));contactsData.setNumber(number);phones.close();}/*** 查找該聯(lián)系人的email信息* 在ContactsContract.CommonDataKinds.Email.CONTENT_URI 中查詢* 條件為ContactsContract.CommonDataKinds.Phone.CONTACT_ID = 上面查詢到的ID*/Cursor emails = getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null,ContactsContract.CommonDataKinds.Email.CONTACT_ID + "=" + contactId, null, null);if (emails != null && emails.moveToNext()) {//獲取該聯(lián)系人的郵箱String email = emails.getString(emails.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));contactsData.setEmail(email);emails.close();}contactsDatas.add(contactsData);}cursor.close();}Log.d("測試","開始打印");for (ContactsData c : contactsDatas) {Log.e("聯(lián)系人", c.toString());}看起來好像有點(diǎn)復(fù)雜,我們先看看下面的圖片再去看代碼,可能會(huì)容易理解,這些代碼一共操作了3個(gè)表,嚴(yán)格來說是視圖,在這3個(gè)表中獲得他們共同的ID,根據(jù)ID在這3個(gè)表中分別提取對(duì)應(yīng)的姓名、電話號(hào)碼、郵箱
?
項(xiàng)目源代碼:http://download.csdn.net/download/qq_33200967/9929430
?
轉(zhuǎn)載于:https://www.cnblogs.com/yeyupiaoling/p/7286544.html
總結(jié)
以上是生活随笔為你收集整理的Android读取短信和联系人的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mongoose的基本操作
- 下一篇: c#之Redis实践list,hasht