SDカードのテキストファイルにすべての着信および発信のSMSを保存するアプリケーションを開発しています。
ブロードキャストレシーバーを使用して着信メッセージを聞くことができます。発信SMSを聞くのが非常に難しいと感じています。
送信済みボックスまたは送信ボックスのコンテンツオブザーバーを設定する必要があることはある程度知っていますが、その方法がわかりません。
これはどのように行うことができますか?
基本的に、コンテンツオブザーバーを登録する必要があります...次のようなもの:
_ContentResolver contentResolver = context.getContentResolver();
contentResolver.registerContentObserver(Uri.parse("content://sms/out"),true, yourObserver);
_
yourObserver
は、次のようなオブジェクト(new YourObserver(new Handler())
)です。
_class YourObserver extends ContentObserver {
public YourObserver(Handler handler) {
super(handler);
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
// save the message to the SD card here
}
}
_
では、SMSのコンテンツをどのように正確に取得しますか? Cursor
を使用する必要があります:
_// save the message to the SD card here
Uri uriSMSURI = Uri.parse("content://sms/out");
Cursor cur = this.getContentResolver().query(uriSMSURI, null, null, null, null);
// this will make it point to the first record, which is the last SMS sent
cur.moveToNext();
String content = cur.getString(cur.getColumnIndex("body"));
// use cur.getColumnNames() to get a list of all available columns...
// each field that compounds a SMS is represented by a column (phone number, status, etc.)
// then just save all data you want to the SDcard :)
_
これはこれを解決するための私のアプローチです
その中にコンテンツオブザーバーを作成する
@Override
public int onStartCommand(Intent intent, int flag, int startId) {
MyObserver myObserver = new MyObserver(new Handler());
ContentResolver contentResolver = this.getApplicationContext().getContentResolver();
contentResolver.registerContentObserver(Uri.parse("content://sms/sent"), true, myObserver);
return START_STICKY;
}
オブザーバークラスを作成する
class MyObserver extends ContentObserver {
public MyObserver(Handler handler) {
super(handler);
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
Uri uriSMSURI = Uri.parse("content://sms/sent");
Cursor cur = getContentResolver().query(uriSMSURI, null, null, null, null);
cur.moveToNext();
String content = cur.getString(cur.getColumnIndex("body"));
String smsNumber = cur.getString(cur.getColumnIndex("address"));
if (smsNumber == null || smsNumber.length() <= 0) {
smsNumber = "Unknown";
}
cur.close();
if(smsChecker( "OutgoingSMS to " + smsNumber + ": " + content)) {
//save data into database/sd card here
}
}
}
メソッドsmsChecker()を追加して、新しいメッセージが最後のメッセージとまったく同じかどうかを確認しました
public boolean smsChecker(String sms) {
boolean flagSMS = true;
if (sms.equals(lastSMS)) {
flagSMS = false;
}
else {
lastSMS = sms;
}
//if flagSMS = true, those 2 messages are different
return flagSMS;
}
私が間違っていない場合、送信されたすべてのメッセージのみを確認したい場合は「content:// sms/sent」、送信トレイ内のすべてのメッセージのみを確認したい場合は「content:// sms/out」、「contentすべてのメッセージをチェックしたい場合は、:// sms」。
これは私のバージョンで、Android 6.0+
_class smsObserver extends ContentObserver {
private String lastSmsId;
public smsObserver(Handler handler) {
super(handler);
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
Uri uriSMSURI = Uri.parse("content://sms/sent");
Cursor cur = getContentResolver().query(uriSMSURI, null, null, null, null);
cur.moveToNext();
String id = cur.getString(cur.getColumnIndex("_id"));
if (smsChecker(id)) {
String address = cur.getString(cur.getColumnIndex("address"));
// Optional: Check for a specific sender
if (address.equals(phoneNumber)) {
String message = cur.getString(cur.getColumnIndex("body"));
// Use message content for desired functionality
}
}
}
// Prevent duplicate results without overlooking legitimate duplicates
public boolean smsChecker(String smsId) {
boolean flagSMS = true;
if (smsId.equals(lastSmsId)) {
flagSMS = false;
}
else {
lastSmsId = smsId;
}
return flagSMS;
}
}
_
このコードをオブザーバーを有効にする場所に配置します
_ContentResolver contentResolver = getContentResolver();
contentResolver.registerContentObserver(Uri.parse("content://sms"), true, new smsObserver(new Handler()));
_
これは、アクティビティを使用していることを前提としています。サービスまたはレシーバー内からgetContentResolver()
を呼び出すには、コンテキスト参照が必要になることに注意してください。
私は何がうまくいかないのかを見ました。その行に:
contentResolver.registerContentObserver(Uri.parse("content://sms/sent"), true, _myObserver);
「/ sent」を削除して「content:// sms」と書くだけで、送信されたSMSを調べるためにContentObserverですでに指定されています。