1. 程式人生 > >Android SMS —— 讀取簡訊 聯絡人

Android SMS —— 讀取簡訊 聯絡人

Android SMS Read

[java] view plaincopyprint?
  1. package com.homer.sms;  
  2. import java.sql.Date;  
  3. import java.text.SimpleDateFormat;  
  4. import android.app.Activity;  
  5. import android.database.Cursor;  
  6. import android.database.sqlite.SQLiteException;  
  7. import android.net.Uri;  
  8. import android.os.Bundle;  
  9. import android.util.Log;  
  10. import android.widget.ScrollView;  
  11. import android.widget.TableLayout;  
  12. import android.widget.TextView;  
  13. /** 
  14.  * 讀取手機簡訊 
  15.  *  
  16.  * @author sunboy_2050 
  17.  * @since  http://blog.csdn.net/sunboy_2050 
  18.  * @date   2012.03.06 
  19.  */
  20. publicclass smsRead 
    extends Activity {  
  21.     @Override
  22.     publicvoid onCreate(Bundle savedInstanceState) {  
  23.         super.onCreate(savedInstanceState);  
  24.         TextView tv = new TextView(this);  
  25.         tv.setText(getSmsInPhone());  
  26.         ScrollView sv = new ScrollView(this);  
  27.         sv.addView(tv);  
  28.         setContentView(sv);  
  29.     }  
  30.     public String getSmsInPhone() {  
  31.         final String SMS_URI_ALL = "content://sms/";  
  32.         final String SMS_URI_INBOX = "content://sms/inbox";  
  33.         final String SMS_URI_SEND = "content://sms/sent";  
  34.         final String SMS_URI_DRAFT = "content://sms/draft";  
  35.         final String SMS_URI_OUTBOX = "content://sms/outbox";  
  36.         final String SMS_URI_FAILED = "content://sms/failed";  
  37.         final String SMS_URI_QUEUED = "content://sms/queued";  
  38.         StringBuilder smsBuilder = new StringBuilder();  
  39.         try {  
  40.             Uri uri = Uri.parse(SMS_URI_ALL);  
  41.             String[] projection = new String[] { "_id""address""person""body""date""type" };  
  42.             Cursor cur = getContentResolver().query(uri, projection, nullnull"date desc");      // 獲取手機內部簡訊
  43.             if (cur.moveToFirst()) {  
  44.                 int index_Address = cur.getColumnIndex("address");  
  45.                 int index_Person = cur.getColumnIndex("person");  
  46.                 int index_Body = cur.getColumnIndex("body");  
  47.                 int index_Date = cur.getColumnIndex("date");  
  48.                 int index_Type = cur.getColumnIndex("type");  
  49.                 do {  
  50.                     String strAddress = cur.getString(index_Address);  
  51.                     int intPerson = cur.getInt(index_Person);  
  52.                     String strbody = cur.getString(index_Body);  
  53.                     long longDate = cur.getLong(index_Date);  
  54.                     int intType = cur.getInt(index_Type);  
  55.                     SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");  
  56.                     Date d = new Date(longDate);  
  57.                     String strDate = dateFormat.format(d);  
  58.                     String strType = "";  
  59.                     if (intType == 1) {  
  60.                         strType = "接收";  
  61.                     } elseif (intType == 2) {  
  62.                         strType = "傳送";  
  63.                     } else {  
  64.                         strType = "null";  
  65.                     }  
  66.                     smsBuilder.append("[ ");  
  67.                     smsBuilder.append(strAddress + ", ");  
  68.                     smsBuilder.append(intPerson + ", ");  
  69.                     smsBuilder.append(strbody + ", ");  
  70.                     smsBuilder.append(strDate + ", ");  
  71.                     smsBuilder.append(strType);  
  72.                     smsBuilder.append(" ]\n\n");  
  73.                 } while (cur.moveToNext());  
  74.                 if (!cur.isClosed()) {  
  75.                     cur.close();  
  76.                     cur = null;  
  77.                 }  
  78.             } else {  
  79.                 smsBuilder.append("no result!");  
  80.             } // end if
  81.             smsBuilder.append("getSmsInPhone has executed!");  
  82.         } catch (SQLiteException ex) {  
  83.             Log.d("SQLiteException in getSmsInPhone", ex.getMessage());  
  84.         }  
  85.         return smsBuilder.toString();  
  86.     }  
  87. }  

AndroidManifest.xml 許可權

記得在AndroidManifest.xml中加入android.permission.READ_SMS這個permission

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

執行結果:

程式碼示例


URI主要有:

content://sms/               所有簡訊
content://sms/inbox        收件箱
content://sms/sent          已傳送
content://sms/draft         草稿
content://sms/outbox     發件箱
content://sms/failed       傳送失敗
content://sms/queued    待發送列表

sms主要結構:
  1. _id => 短訊息序號 如100  
  2. thread_id => 對話的序號 如100  
  3. address => 發件人地址,手機號.如+8613811810000  
  4. person => 發件人,返回一個數字就是聯絡人列表裡的序號,陌生人為null  
  5. date => 日期  long型。如1256539465022  
  6. protocol => 協議 0 SMS_RPOTO, 1 MMS_PROTO   
  7. read => 是否閱讀 0未讀, 1已讀   
  8. status => 狀態 -1接收,0 complete, 64 pending, 128 failed   
  9. type => 型別 1是接收到的,2是已發出   
  10. body => 短訊息內容   
  11. 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               一個自增欄位,