我构建了一个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=?”对于该查询来说是非法字段。
将很高兴为您解决此问题提供帮助和建议:)
直接访问数据库可能不是最好的主意。因为位置和数据结构可能会随着不同的 Android 版本而变化(从 7 => 8 开始的日历存储就是如此)。不过请检查您的设备位置和数据库结构是否相同。
对于彩信,您可以查看 PduParser,用于解析彩信消息和此文件夹中的其他类。
要获取未读短信,我使用以下代码:
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();
的计数。.getCount();
。