Android SMS收件箱未读计数问题

时间:2012-12-08 12:25:04

标签: android sms

我创建了一个小型Android应用程序,可以对收到的短信做出反应。问题是我似乎无法可靠地获取收件箱中未读邮件的数量。

这是一个用于说明问题的最低级别。有时会打印“收到短信!未读数:0”,有时会打印“收到短信!未读数: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消息的事件保存到收件箱?

2 个答案:

答案 0 :(得分:4)

如果您想观察短信收件箱,请使用以下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);

答案 1 :(得分:0)

我有同样的问题。当您实际收到短信时,似乎会触发BroadcastReceiver。这可以在SmsManager将消息写入数据库之前。

在收到广播后等待几秒钟或手动记录收到广播的次数并增加计数,保存到私人SharedPreferences并减少用户阅读邮件时的计数。