Android SMS (I) -- SMSの読み方
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 保留リスト
- _id => ショートメッセージのシリアル番号 例: 100
- thread_id => 会話の通し番号 例:100
- アドレス => 送信者のアドレス、携帯電話番号 例: +8613811810000
- person => 送信者、連絡先リストの通し番号である番号を返す、見知らぬ人は ヌル
- 日付 => 日付 長い の型になります。例えば、1256539465022
- プロトコル => プロトコル 0 SMS_RPOTO, 1 MMS_PROTO
- read => 既読の有無 0 未読、1 既読
- ステータス => ステータス -1受信、0完了、64保留、128失敗
- type => type 1は受信、2は送信
- body => ショートメッセージの内容
- service_center => SMSサービスセンター番号。例:+8613800755500
カーソル 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ではありません。 アドレスによるものです。
<スパン 参考推奨品です。
関連
-
ADBサーバーがACKしない ソリューション
-
ADBサーバーがACKしなかった
-
アプリの実行エラー。Default ActivityNot Found 完璧な解決策
-
Error:タスク ':app:compileDebugJavaWithJavac' の実行に失敗しました。解決方法
-
JSONException: java.lang.String は JSONObject ソリューションに変換できません。
-
エラーの報告です。ArrayAdapter は、リソース ID が TextView である必要があります。
-
Android マルチメディア MediaPlayerの使用方法詳細
-
no target device found 問題が解決した
-
android.content.res.Resources$NotFoundException: 文字列リソースID #0x1エラー
-
開始します。Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
AndroidStudioのエラーAAPT2エラーの解決:詳細のログを確認する
-
Solve Android 仮想メソッドの呼び出しに失敗する。NULLオブジェクトの参照で
-
Android Studioの解決策:xxxは囲むクラスではありませんエラー
-
Android 問題集 No.11:トランスポートエンドポイントが接続されていない
-
Android携帯で通常のhttpsのサイトにアクセスすると、最初のリクエストで認証パスのトラストアンカーが見つからないと報告され、その後正常にアクセスできるようになり、問題が解決しました。
-
Android Control - TabLayout Usage Introduction
-
ライブ画面録画のAndroid実装 (a) ScreenRecorderの簡易解析
-
Androidバージョン一覧
-
Android ProgressBarの詳しい解説とカスタマイズ方法
-
android.view.inflateexception バイナリ xml ファイル行例外の解決方法