0

ユーザーが送信した発信 SMS の数を集計しようとしています。現在、私のコードは次のようになります。

class SentSMSObserver extends ContentObserver {
....
}

SentSMSObserver sso = new SentSMSObserver(new Handler());
ContentResolver cr = this.getContentResolver();
cr.registerContentObserver(Uri.parse("content://sms"), true, sso);

Jelly Bean を搭載したエミュレーターでアプリを実行しようとしましたが、何らかの理由で、ネイティブの SMS アプリを介してテキスト メッセージを送信すると、集計が 3ずつ増えます。

ここで、関連する StackOverflow q&a が示唆するように置き換えることにcontent://smsましたが、その設定でアプリを実行すると、コンテンツ オブザーバーの. 私は何をしますか?content://sms/sentonChange()

4

2 に答える 2

0

registerContentObserver のコールバックは、db updater が登録した正確な uri を呼び出すときに呼び出されます。しかし、あなたの場合、MMS アプリは content://sms/sent を使用しませんが、次のようなものを使用しcontent://sms/10て、タイプ QUEUED から OUTBOX に移動し、次に SENT に移動し続けます。だから私はあなたが登録したときにあなたが3つのアップデートを受け取っている理由だと思いますcontent://sms/

MMS アプリは、キューに入れられるたびに TYPE 列を変更します。

この問題を解決する 1 つの方法は、uri のコンテンツ変更コールバック クエリを取得するたびに、"type" 列を取得し、その値がTelephony.Sms.MESSAGE_TYPE_SENT.

于 2012-08-16T12:09:20.983 に答える
0

Lalit Poptani が提案した回答から、カーソルが現在指しているレコードの「タイプ」の値を取得する必要があります。

// cr is the content resolver
Cursor cursor = cr.query(Uri.parse("content://sms"), null, null, null, null);
int columnIndex = cursor.getColumnIndex("type");

while (cursor.moveToNext()) {
    int type = cursor.getInt(columnIndex);
    if (type == 2) {
        // do your stuff here
    }
}

nandeesh とのディスカッションで述べたように、メッセージ タイプはパブリック API の一部ではありませんが、ここで見つけることができます。

現在、複数の受信者に送信されたときに Android が 1 つの送信 SMS メッセージを不正確にカウントするバグを修正しています (2 人に送信すると 3 にカウントされ、3 人に送信すると 5 にカウントされます)。メッセージの種類を除外しても、コンテンツ オブザーバーは 1 つのメッセージに対して複数回呼び出されるようです。修正したら、この回答の更新を投稿します。

于 2012-08-20T08:01:08.453 に答える