android AppWidget:短信查询适用于模拟器,但不适用于真实设备

问题描述 投票:0回答:2

我构建了一个appWidget,当新短信进来时,它会更新特定联系人的未读短信计数,为此我注册了一个contentObserver来监控传入的短信。

mySMSObserver 类调用以下方法来获取特定联系人的未读消息数,通过他的 ID

到目前为止一切顺利,问题是下面的查询在模拟器上运行良好,但是当我在 Android 设备上尝试时,它总是返回 0 条未读消息(如 Toast 所示)。

private static String updateUnreadSMS(String contactID, Context context) {

ContentResolver cr=context.getContentResolver();
//final Uri SMS_INBOX=(Uri.parse("content://mms-sms/conversations"));
//final Uri SMS_INBOX=(Uri.parse("content://mms/inbox"));
final Uri SMS_INBOX=Uri.parse("content://sms/inbox");

Cursor c = cr.query(SMS_INBOX, null, "read = 0 AND person=?", new String[]{contactID}, null);

// get number of unread sms messages
int unreadMessagesCount = c.getCount();

Log.d("DEBUG", "UnreadSMS: "+unreadMessagesCount);
Toast.makeText(context, "updateUnreadSMS "+unreadMessagesCount, Toast.LENGTH_LONG).show();

c.deactivate();
return String.valueOf(unreadMessagesCount); 

}

不同设备需要不同的查询吗?

如何为“content://mms/inbox”编写相同的查询?因为“person=?”对于该查询来说是非法字段。

将很高兴为您解决此问题提供帮助和建议:)

java android sql sms android-appwidget
2个回答
0
投票

直接访问数据库可能不是最好的主意。因为位置和数据结构可能会随着不同的 Android 版本而变化(从 7 => 8 开始的日历存储就是如此)。不过请检查您的设备位置和数据库结构是否相同。

对于彩信,您可以查看 PduParser,用于解析彩信消息和此文件夹中的其他类。


0
投票

要获取未读短信,我使用以下代码:

final Cursor cursorSMS = context.getContentResolver().query(Uri.parse("content://sms/inbox"), null, "read = 0", null, null);
if (ContextCompat.checkSelfPermission(context.getApplicationContext(), android.Manifest.permission.READ_SMS) == PackageManager.PERMISSION_GRANTED) {
   if (cursorSMS != null) nbMsgUnread = cursorSMS.getCount();
}

模拟器上没问题。
但在真正的手机上,系统不会立即实现

cursorSMS.getCount();
的计数。
当收到短信时,BroadcastReceiver 太快,count = 0。
收到短信时,您的广播接收器必须发出警报以区别
.getCount();

几秒钟后(在我的例子中是 5 秒),系统会实际显示未读短信计数。
问候。

© www.soinside.com 2019 - 2024. All rights reserved.