私は現在、次のURI「content:// sms /」にコンテンツオブザーバーを登録して、送信される着信メッセージと発信メッセージをリッスンしています。
これは問題なく動作しているようで、SMSデータベースからも削除しようとしましたが、次のURI「content:// sms/conversations /」からスレッド全体を削除することしかできません。
これが私がそのために使用するコードです
String url = "content://sms/";
Uri uri = Uri.parse(url);
getContentResolver().registerContentObserver(uri, true, new MyContentObserver(handler));
}
class MyContentObserver extends ContentObserver {
public MyContentObserver(Handler handler) {
super(handler);
}
@Override public boolean deliverSelfNotifications() {
return false;
}
@Override public void onChange(boolean arg0) {
super.onChange(arg0);
Log.v("SMS", "Notification on SMS observer");
Message msg = new Message();
msg.obj = "xxxxxxxxxx";
handler.sendMessage(msg);
Uri uriSMSURI = Uri.parse("content://sms/");
Cursor cur = getContentResolver().query(uriSMSURI, null, null,
null, null);
cur.moveToNext();
String protocol = cur.getString(cur.getColumnIndex("protocol"));
if(protocol == null){
Log.d("SMS", "SMS SEND");
int threadId = cur.getInt(cur.getColumnIndex("thread_id"));
Log.d("SMS", "SMS SEND ID = " + threadId);
Cursor c = getContentResolver().query(Uri.parse("content://sms/outbox/" + threadId), null, null,
null, null);
c.moveToNext();
int p = cur.getInt(cur.getColumnIndex("person"));
Log.d("SMS", "SMS SEND person= " + p);
//getContentResolver().delete(Uri.parse("content://sms/conversations/" + threadId), null, null);
}
else{
Log.d("SMS", "SMS RECIEVE");
int threadIdIn = cur.getInt(cur.getColumnIndex("thread_id"));
getContentResolver().delete(Uri.parse("content://sms/conversations/" + threadIdIn), null, null);
}
}
}
ただし、SMSコンテンツプロバイダーから受信者とメッセージテキストを取得できるようにしたいのですが、これを行う方法を教えてもらえますか?
また、スレッド全体ではなく1つのメッセージを削除する方法もありますか?
これはすでに議論されました。
コンテンツプロバイダーのチェックからSMSを読み取るには: Android-1-5-reading-sms-messages
このスレッドを確認してください:
単一のSMSではなくスレッド全体を削除しているというコメントについて:試してみましたか このコード ?
アドレス列には、SMS送信者の電話番号が含まれています。
Cursor.getString(cursor.getColumnIndex( "address"))を使用して、電話番号を文字列としてプルします。 content:// smsにカーソルを置き、日付の降順で並べ替えて、最新のメッセージを取得します。新しいメッセージがテーブルに入るのを待つ必要があります。そうしないと、間違ったメッセージから情報を取得することになります。着信SMSbroadcastReceiverでは、スレッドでwhileループを使用して、cursor.getCount()をポーリングして変更します。次に、whileループの後にcursor.moveToFirstが新しいメッセージになります。
例えば:
Cursor cur = getContentResolver().query(Uri.parseUri(content://sms), null, null, null, null);
int count = cur.getCount();
while (cur.getCount() == count)
{
Thread.sleep(1000);
cur = getContentResolver().query(Uri.parseUri(content://sms), null, null, null, null);
}
次に、SMS送信者のアドレスを取得します。
cur = getContentResolver().query(Uri.parseUri(content://sms), null, null, null, "date DESC");
cur.MoveToFirst();
String telephoneNumber = cur.getString(cur.getColumnIndex("address");
このwhileループは、新しいメッセージが到着するまでスレッドを一時停止します。 contentObserverを使用することもできますが、このwhileループは単純であり、登録、登録解除、および個別のクラスを必要としません。
率直に言って、着信インテントのpduから直接アドレスとメッセージの本文をプルする方が速いと思います。このようにして、アドレスと本文を取得するためにメッセージがテーブルに入るのを待つ必要はありません。 AndroidクラスSmsMessageには、さまざまな便利なメソッドがあります。