生活随笔
收集整理的這篇文章主要介紹了
Android 短信解析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
URI主要有:
content://sms/? ? ? ? ? ? ? ?所有短信
content://sms/inbox??? ??? 收件箱
content://sms/sent ? ? ? ? ?已發送
content://sms/draft ? ? ? ? 草稿
content://sms/outbox??? ?發件箱
content://sms/failed ? ? ? 發送失敗
content://sms/queued??? 待發送列表
sms主要結構: ? _id => 短消息序號 如100?? thread_id => 對話的序號 如100?? address => 發件人地址,手機號.如+8613811810000?? person => 發件人,返回一個數字就是聯系人列表里的序號,陌生人為null?? date => 日期??long型。如1256539465022?? protocol => 協議?0?SMS_RPOTO,?1?MMS_PROTO ?? read => 是否閱讀?0未讀,?1已讀 ?? status => 狀態 -1接收,0?complete,?64?pending,?128?failed ?? type => 類型?1是接收到的,2是已發出 ?? body => 短消息內容 ?? service_center => 短信服務中心號碼編號。如+8613800755500 ? String[] projection = new String[]{"address", "body"}; Cursor cursor = getContentResolver().query(uri, projection, "where .." new String[]{"", ""}, "order by ..")
Android短信存儲數據庫
偶然發現了Android源碼中的一個類MmsSmsDatabaseHelper.java,原來android將所有的短信信息都存入了mmssms.db中。
公開的SDK中沒有這個類,不能直接使用。于是自己寫了一個SQLiteOpenHelper,但是查詢的時候發生SQL異常。看來不能為所欲為了,不過據網上資料介紹可以拷貝db文件來實現短信數據備份。
MmsSmsDatabaseHelper.java在Android源碼中的路徑:
packages/providers/TelephonyProvider/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java
sms數據庫中的字段如下:
_id?????????????? 一個自增字段,從1開始
thread_id??? 序號,同一發信人的id相同
address??? ? 發件人手機號碼
person??????? 聯系人列表里的序號,陌生人為null?
date??????????? 發件日期
protocol??? ? 協議,分為:?0?SMS_RPOTO,?1?MMS_PROTO??
read?????????? 是否閱讀?0未讀,?1已讀??
status???????? 狀態?-1接收,0?complete,?64?pending,?128?failed?
type?????
??? ALL??? = 0;
??? INBOX? = 1;
??? SENT?? = 2;
??? DRAFT? = 3;
??? OUTBOX = 4;
??? FAILED = 5;
??? QUEUED = 6;?
body??? ? ? ? ? ? ? ? ?? 短信內容
service_center???? 短信服務中心號碼編號
subject??? ? ? ? ? ? ? ? 短信的主題
reply_path_present???? TP-Reply-Path
locked? ??
sms數據庫表字段類型的源碼:
[java]? view plain copy print ?
private?void?createSmsTables(SQLiteDatabase?db)?{?? ????????//?N.B.:?Whenever?the?columns?here?are?changed,?the?columns?in?? ????????//?{@ref?MmsSmsProvider}?must?be?changed?to?match.?? ????????db.execSQL("CREATE?TABLE?sms?("?+?? ???????????????????"_id?INTEGER?PRIMARY?KEY,"?+?? ???????????????????"thread_id?INTEGER,"?+?? ???????????????????"address?TEXT,"?+?? ???????????????????"person?INTEGER,"?+?? ???????????????????"date?INTEGER,"?+?? ???????????????????"date_sent?INTEGER?DEFAULT?0,"?+?? ???????????????????"protocol?INTEGER,"?+?? ???????????????????"read?INTEGER?DEFAULT?0,"?+?? ???????????????????"status?INTEGER?DEFAULT?-1,"?+?//?a?TP-Status?value?? ??????????????????????????????????????????????????//?or?-1?if?it?? ??????????????????????????????????????????????????//?status?hasn't?? ??????????????????????????????????????????????????//?been?received?? ???????????????????"type?INTEGER,"?+?? ???????????????????"reply_path_present?INTEGER,"?+?? ???????????????????"subject?TEXT,"?+?? ???????????????????"body?TEXT,"?+?? ???????????????????"service_center?TEXT,"?+?? ???????????????????"locked?INTEGER?DEFAULT?0,"?+?? ???????????????????"error_code?INTEGER?DEFAULT?0,"?+?? ???????????????????"seen?INTEGER?DEFAULT?0"?+?? ???????????????????");");?? ....?? }??
packages/providers/TelephonyProvider/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java
聯系人為空
短信數據庫里面如果你是先受到陌生短信之后再把陌生人添加到聯系人列表的話,短信數據庫里面的person字段就為null,如果你是先添加聯系人再發短 信的話,短信數據庫里面的person字段就不為空了,所以你要是想通過短信數據庫里的字段取得聯系人的其他信息的話,只能通過地址來取。
實例:
?public?String?getSmsInPhone()?{?? ????????final?String?SMS_URI_ALL?=?"content://sms/";?? ????????final?String?SMS_URI_INBOX?=?"content://sms/inbox";?? ????????final?String?SMS_URI_SEND?=?"content://sms/sent";?? ????????final?String?SMS_URI_DRAFT?=?"content://sms/draft";?? ????????final?String?SMS_URI_OUTBOX?=?"content://sms/outbox";?? ????????final?String?SMS_URI_FAILED?=?"content://sms/failed";?? ????????final?String?SMS_URI_QUEUED?=?"content://sms/queued";?? ?? ????????StringBuilder?smsBuilder?=?new?StringBuilder();?? ?? ????????try?{?? ????????????Uri?uri?=?Uri.parse(SMS_URI_ALL);?? ????????????String[]?projection?=?new?String[]?{?"_id",?"address",?"person",?"body",?"date",?"type"?};?? ????????????Cursor?cur?=?getContentResolver().query(uri,?projection,?null,?null,?"date?desc");??????//?獲取手機內部短信?? ?? ????????????if?(cur.moveToFirst())?{?? ????????????????int?index_Address?=?cur.getColumnIndex("address");?? ????????????????int?index_Person?=?cur.getColumnIndex("person");?? ????????????????int?index_Body?=?cur.getColumnIndex("body");?? ????????????????int?index_Date?=?cur.getColumnIndex("date");?? ????????????????int?index_Type?=?cur.getColumnIndex("type");?? ?? ????????????????do?{?? ????????????????????String?strAddress?=?cur.getString(index_Address);?? ????????????????????int?intPerson?=?cur.getInt(index_Person);?? ????????????????????String?strbody?=?cur.getString(index_Body);?? ????????????????????long?longDate?=?cur.getLong(index_Date);?? ????????????????????int?intType?=?cur.getInt(index_Type);?? ?? ????????????????????SimpleDateFormat?dateFormat?=?new?SimpleDateFormat("yyyy-MM-dd?hh:mm:ss");?? ????????????????????Date?d?=?new?Date(longDate);?? ????????????????????String?strDate?=?dateFormat.format(d);?? ?? ????????????????????String?strType?=?"";?? ????????????????????if?(intType?==?1)?{?? ????????????????????????strType?=?"接收";?? ????????????????????}?else?if?(intType?==?2)?{?? ????????????????????????strType?=?"發送";?? ????????????????????}?else?{?? ????????????????????????strType?=?"null";?? ????????????????????}?? ?? ????????????????????smsBuilder.append("[?");?? ????????????????????smsBuilder.append(strAddress?+?",?");?? ????????????????????smsBuilder.append(intPerson?+?",?");?? ????????????????????smsBuilder.append(strbody?+?",?");?? ????????????????????smsBuilder.append(strDate?+?",?");?? ????????????????????smsBuilder.append(strType);?? ????????????????????smsBuilder.append("?]\n\n");?? ????????????????}?while?(cur.moveToNext());?? ?? ????????????????if?(!cur.isClosed())?{?? ????????????????????cur.close();?? ????????????????????cur?=?null;?? ????????????????}?? ????????????}?else?{?? ????????????????smsBuilder.append("no?result!");?? ????????????}?//?end?if?? ?? ????????????smsBuilder.append("getSmsInPhone?has?executed!");?? ?? ????????}?catch?(SQLiteException?ex)?{?? ????????????Log.d("SQLiteException?in?getSmsInPhone",?ex.getMessage());?? ????????}?? ?? ????????return?smsBuilder.toString();?? ????} ?
轉載于:https://my.oschina.net/tingzi/blog/103717
總結
以上是生活随笔為你收集整理的Android 短信解析的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。