Android短信收件箱未读计数问题

Android短信收件箱未读计数问题,android,sms,Android,Sms,我已经创建了一个小的Android应用程序,可以对收到的短信做出反应。问题是我似乎无法可靠地获取收件箱中未读邮件的数量 这里有一个简单的类来说明这个问题。有时打印“收到短信!未读计数:0”,有时打印“收到短信!未读计数:1”。在我看来,如果每当程序流输入该命令时,未读计数总是至少一个,那么它看起来更符合逻辑。我一直在通过从一个模拟器向另一个模拟器发送SMS消息来测试这一点(您可以通过将消息发送到模拟器号码(比如5554)来实现) 导入android.content.BroadcastReceiv

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

这里有一个简单的类来说明这个问题。有时打印“收到短信!未读计数:0”,有时打印“收到短信!未读计数:1”。在我看来,如果每当程序流输入该命令时,未读计数总是至少一个,那么它看起来更符合逻辑。我一直在通过从一个模拟器向另一个模拟器发送SMS消息来测试这一点(您可以通过将消息发送到模拟器号码(比如5554)来实现)

导入android.content.BroadcastReceiver;
导入android.content.Context;
导入android.content.Intent;
导入android.database.Cursor;
导入android.net.Uri;
导入android.util.Log;
公共类SmsReceiver扩展了BroadcastReceiver{
私有静态最终字符串SMS\u RECEIVED\u ACTION=“android.provider.Telephony.SMS\u RECEIVED”;
@凌驾
公共void onReceive(上下文、意图){
Log.d(“onReceive”,“Got something:”+intent.getAction());
如果(!SMS_接收到_ACTION.equals(intent.getAction())){
Log.d(“接收”、“返回”);
返回;
}
Log.d(“onReceive”,“Got SMS!Unread count:”+getNumberOfUnreadMessages(context));
//做事
}
public int GetNumberOfUnderMessages(上下文){
最终Uri SMS_收件箱_Uri=Uri.parse(“content://sms/inbox");
Cursor inboxCursor=context.getContentResolver().query(SMS\u收件箱\u URI,null,“读取=0”,null,null);
int unreadMessageCount=inboxCursor.getCount();
inboxCursor.close();
返回未读消息计数;
}
}
最后,这里是AndroidManifest.xml文件的相关部分:


如何获得正确数量的未读邮件


编辑/添加:或者,如果是在短信息保存之前发送广播,是否有办法订阅应用程序以侦听新短信息保存到收件箱中的事件?

我也有同样的问题。当您实际收到文本消息时,广播接收器似乎被触发。这可能是在SmsManager将消息写入数据库之前发生的


在收到广播后等待几秒钟,或者手动记录接收广播的次数并增加计数,保存到private SharedReferences并在用户阅读消息时减少计数。

我也有同样的问题。当您实际收到文本消息时,广播接收器似乎被触发。这可能是在SmsManager将消息写入数据库之前发生的


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

如果要查看短信收件箱,请使用如下ContentObserver:

OnCreate():

创建新的内部类或外部类:

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():


如果您想观察sms收件箱,请使用如下内容观察者:

OnCreate():

创建新的内部类或外部类:

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():


我的广播接收器也有同样的问题。当广播从游标检查未读计数时,新消息似乎丢失了,就像广播是在消息存储到数据库之前触发的一样,因此它给出了错误计数。我只是喜欢inboxCursor.getCount()+1@Samet Yep,看起来就是这样。那你怎么办?如何仅在将消息保存到数据库后才进行广播触发?请注意,它不会经常失败,大约每隔一段时间就会失败一次,因此
getCount()+1
不是一个好的解决方案。但是你应该避免getCount(),因为它速度非常慢,我有过这样的经验,如果有更多的消息,应用程序将挂起。您应该只创建一个int count=1;在循环外部,在光标中移动时,执行count++;这样做只需要几毫秒而不是几秒钟,我想你会得到真正的计数。我从来没有尝试过搜索为什么会发生这种情况,我不确定,但你可以改变你的广播优先级,使它最后触发。我认为这个问题是由于默认的短信应用程序,在广播后在数据库中插入新短信,就像你没有在数据库中插入任何内容,只是检索了短信未读计数。我在广播接收器上也有同样的问题。当广播从游标检查未读计数时,新消息似乎丢失了,就像广播是在消息存储到数据库之前触发的一样,因此它给出了错误计数。我只是喜欢inboxCursor.getCount()+1@Samet Yep,看起来就是这样。那你怎么办?如何仅在将消息保存到数据库后才进行广播触发?请注意,它不会经常失败,大约每隔一段时间就会失败一次,因此
getCount()+1
不是一个好的解决方案。但是你应该避免getCount(),因为它速度非常慢,我有过这样的经验,如果有更多的消息,应用程序将挂起。您应该只创建一个int count=1;在循环外部,在光标中移动时,执行count++;这样做只需要几毫秒而不是几秒钟,我想你会得到真正的计数。我从来没有尝试过搜索为什么会发生这种情况,我不确定,但你可以改变你的广播优先级,使它最后触发。我认为这个问题是由于默认的短信应用程序,在广播后在数据库中插入新的短信,就像你没有在数据库中插入任何内容,只是检索了短信未读计数。谢谢,这可能是一个比我当前的更好的方法。一旦我有机会尝试,我会决定接受这个答案。谢谢,这可能比我现在的答案更好。我会决定接受这个
getContentResolver().unregisterContentObserver(observer);