着信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メッセージが受信ボックスに保存されるイベントをリッスンするようにアプリをサブスクライブする方法はありますか?