1

着信SMSメッセージに反応する小さなAndroidアプリケーションを作成しました。問題は、受信トレイ内の未読メッセージの数を確実に取得できないように見えることです。

これは、問題を説明するための最低限のクラスです。「GotSMS!Unread count:0」と表示されることもあれば、「Got SMS!Unread count:1」と表示されることもあります。私には、プログラムフローがそのコマンドを入力するたびに、未読カウントが常に少なくとも1になると、より論理的に見えます。私は、あるエミュレーターから別のエミュレーターにSMSメッセージを送信することでこれをテストしてきました(これは、エミュレーター番号(たとえば、5554)にメッセージを送信することで実行できます)。

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.util.Log;

public class SmsReceiver extends BroadcastReceiver {
private static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED";

@Override
public void onReceive(Context context, Intent intent) {
    Log.d("onReceive", "Got something: "+intent.getAction());
    if (!SMS_RECEIVED_ACTION.equals(intent.getAction())) {
        Log.d("onReceive", "Returning.");
        return;
    }
    Log.d("onReceive", "Got SMS! Unread count: " + getNumberOfUnreadMessages(context));
    // Do stuff
}

public int getNumberOfUnreadMessages(Context context) {
    final Uri SMS_INBOX_URI = Uri.parse("content://sms/inbox");
    Cursor inboxCursor = context.getContentResolver().query(SMS_INBOX_URI, null, "read = 0", null, null);
    int unreadMessagesCount = inboxCursor.getCount();
    inboxCursor.close();
    return unreadMessagesCount;
}
}

そして最後に、AndroidManifest.xmlファイルの関連部分を次に示します。

<receiver android:name=".SmsReceiver" >
    <intent-filter>
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
</receiver>

未読メッセージの正しい数を取得するにはどうすればよいですか?

編集/追加:または、SMSが保存される前にブロードキャストが送信される場合、新しいSMSメッセージが受信ボックスに保存されるイベントをリッスンするようにアプリをサブスクライブする方法はありますか?

4

2 に答える 2

4

SMSの受信トレイを監視する場合は、次のようなContentObserverを使用します。

OnCreate():

contentObserver observer = new contentObserver(handler);
getContentResolver().registerContentObserver(Uri.parse("content://sms/inbox"), true, observer);

新しい内部クラスまたは外部クラスを作成します。

public class contentObserver extends ContentObserver {

    public contentObserver(Handler handler) {
        super(handler);
        // you can use a handler if you want or directly do everythinh onChange();
    }

    @Override
    public void onChange(boolean selfChange) {
        // Do your stuff here
        super.onChange(selfChange);
    }
} 

OnDestroy():

getContentResolver().unregisterContentObserver(observer);
于 2012-12-09T13:52:29.723 に答える
0

私も同じ問題を抱えていました。実際にテキストメッセージを受信すると、BroadcastReceiverがトリガーされるようです。これは、SmsManagerがメッセージをデータベースに書き込む前に発生する可能性があります。

ブロードキャストを受信して​​から数秒待つか、ブロードキャストを受信した回数を手動でカウントしてカウントを増やし、プライベートSharedPreferencesに保存して、ユーザーがメッセージを読んだときにカウントを減らします。

于 2012-12-08T13:16:31.257 に答える