1. ホーム
  2. アンドロイド

Android SMS (I) -- SMSの読み方

2022-02-24 17:14:45

Android SMS 読み取り

package com.homer.sms;

import java.sql.Date;
import java.text.SimpleDateFormat;


import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteException;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.widget.ScrollView;
import android.widget.TableLayout;
TextView; import android.widget;

TextView; /**
 * Read cell phone SMS
 * 
 * @author sunboy_2050
 * @since http://blog.csdn.net/sunboy_2050
 * @date 2012.03.06
 */
public class smsRead extends Activity {

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		TextView tv = new TextView(this);
		tv.setText(getSmsInPhone());

		ScrollView sv = new ScrollView(this);
		sv.addView(tv);
		
		setContentView(sv);
	}

	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"); // Get the phone's internal SMS

			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);
					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 = "receive";
					} else if (intType == 2) {
						strType = "send";
					} 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();
	}
}

AndroidManifest.xml のアクセス権

AndroidManifest.xml に追加することを忘れないでください。 android.permission.READ_SMS このパーミッション

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


走った結果


コード例



主なURIは以下の通りです。

content://sms/ すべてのSMS
content://sms/inbox 受信トレイ
コンテンツ://sms/sent 送信済み
content://sms/draft ドラフト
content://sms/outbox 送信トレイ
content://sms/failed 送信に失敗しました。
content://sms/queued 保留リスト


SMSの主な構造。
  1. _id => ショートメッセージのシリアル番号 例: 100  
  2. thread_id => 会話の通し番号 例:100  
  3. アドレス => 送信者のアドレス、携帯電話番号 例: +8613811810000  
  4. person => 送信者、連絡先リストの通し番号である番号を返す、見知らぬ人は ヌル
  5. 日付 => 日付   長い の型になります。例えば、1256539465022  
  6. プロトコル => プロトコル 0 SMS_RPOTO, 1 MMS_PROTO   
  7. read => 既読の有無 0 未読、1 既読   
  8. ステータス => ステータス -1受信、0完了、64保留、128失敗   
  9. type => type 1は受信、2は送信   
  10. body => ショートメッセージの内容   
  11. service_center => SMSサービスセンター番号。例:+8613800755500  
String[] projection = new String[]{"address", "body"};
カーソル cursor = getContentResolver().query(uri, projection, "where . " new String[]{"", ""}, "order by . ")


<スパン Android SMSストレージデータベース

AndroidのソースコードでMmsSmsDatabaseHelper.javaというクラスを偶然見つけたのですが、androidはすべてのSMSメッセージを mmssms.db にしています。

このクラスは公開されているSDKにはなく、直接使用することはできません。そこで、自分でSQLiteOpenHelperを書いたのですが、クエリ時にSQLの例外が発生します。 やりたい放題のようですが、ネット上の情報によると、SMSのデータバックアップを実施するために、dbファイルをコピーすることができるそうです。

AndroidのソースコードにあるMmsSmsDatabaseHelper.javaへのパスです。

packages/providers/TelephonyProvider/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java


smsデータベースのフィールドは以下の通りです。

_id                1から始まる自己インクリメントのフィールドです。
スレッドID     シリアル番号、同一送信者の同一ID
アドレス       送信者の携帯電話番号
        コンタクトリストの通し番号、見知らぬ人はNULLです 
日付             出荷日

プロトコル       プロトコル、に分かれる。0 sms_rpoto, 1 mms_proto  
読む            未読0件、既読1件の可否  
ステータス          ステータス -1 受信、0 完了、64 保留、128 失敗 
タイプ
    ALL = 0とする。
    INBOX = 1;
    SENT = 2;
    DRAFT = 3;
    OUTBOX = 4;
    FAILED = 5;
    QUEUED = 6;

ボディ                      テキストメッセージの内容
サービスセンター      SMSサービスセンター番号
主題                   テキストメッセージの件名
reply_path_present      TP-Reply-Path
ロック


<スパン smsデータベーステーブルのフィールドタイプのソースコード。

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," +
                   "body TEXT," +
                   "service_center TEXT," +
                   "locked INTEGER DEFAULT 0," + "locked INTEGER DEFAULT 0," +
                   "error_code INTEGER DEFAULT 0," +
                   "seen INTEGER DEFAULT 0" +
                   ");");
....
}

packages/providers/TelephonyProvider/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java


<スパン 連絡先は空です

SMSデータベースの人物フィールドは、見知らぬSMSを受信した後、その見知らぬ人をコンタクトリストに追加した場合はNULLとなり、コンタクトを追加した後SMSを送信した場合はNULLではありません。 アドレスによるものです。



<スパン 参考推奨品です。

Android SMS メッセージング