我在论坛上看了很多,以确定我有多少短信没有被阅读。下面的代码似乎适用于收到的消息,但是一旦我实际读取了消息,就不会调用ContentObserver的onChange。 因此,在传入短信时,onChange被调用,我得到正确的号码,但在阅读消息后没有被调用。该设备是三星Note运行Android 2.3.6没有root。任何帮助将不胜感激。
public class UnreadSMSContentObserver extends ContentObserver {
private static final String myTAG="PhoneInfoSMS";
private static final Uri SMS_INBOX = Uri.parse("content://sms/inbox");
private ContentResolver mContentResolver;
private Handler mHandler;
public int unreadSMS;
private static final String TAG = "PhoneInfoSMS";
public UnreadSMSContentObserver(ContentResolver cr, Handler h) {
super(null);
mContentResolver = cr;
mHandler = h;
}
public int getUnreadSMS() {
if (mContentResolver != null) {
try {
Cursor c = mContentResolver.query(SMS_INBOX, null, "read = 0", null, null);
if (c != null) {
unreadSMS = c.getCount();
c.deactivate();
Log.d(TAG, unreadSMS + " unread SMS messages");
}
}
catch (Exception ex) {
Log.e("ERROR: " + ex.toString(), "");
}
}
return unreadSMS;
}
@Override
public void onChange(boolean selfChange) {
Log.d(myTAG, "onChange");
if (mContentResolver != null) {
getUnreadSMS();
mHandler.obtainMessage(PhoneInfoServer.CONTENTO_INFOCHANGED, PhoneInfoServer.CONTENTO_US, unreadSMS).sendToTarget();
Log.d(myTAG, "done");
}
}
}
在清单文件中,我有以下权限:
"android.permission.READ_CONTACTS"
"android.permission.READ_SMS"
"android.permission.GET_ACCOUNTS"
"android.permission.BATTERY_STATS"
"android.permission.BLUETOOTH"
"android.permission.BLUETOOTH_ADMIN"
"android.permission.BROADCAST_SMS"
"android.permission.RECEIVE_SMS"
"android.permission.BROADCAST_SMS"
"android.permission.RECEIVE_MMS"
我在呼叫服务上设置的方式是: 在我所做的服务的onCreate中:
mContentResolver = this.getContentResolver();
mUnreadSMSContentObserver = new UnreadSMSContentObserver(mContentResolver, mContentObserversHandler);
在我所做服务的onStartCommand中:
mContentResolver.registerContentObserver(Uri.parse("content://sms/"), true, mUnreadSMSContentObserver);
mContentResolver.registerContentObserver(Uri.parse("content://sms/inbox/"), true, mUnreadSMSContentObserver);
我只尝试了内容:// sms /而且只有内容:// sms / inbox /并且两者都没有解决问题。
P.S。错过呼叫的类似方法非常有效!
应用程序+服务通过蓝牙将电池数据,未接来电和未读短信发送到基于Arduino的设备,该设备将其显示在LED屏幕上。为什么?有两个原因:首先,这是我第一个为娱乐而制作的Android程序。第二个是我不在家里随身携带电话,而且通常在我的家庭办公室。如果我没听到它响了,我仍然可以看到LED显示屏告诉我路过时有电话或短信。
答案 0 :(得分:1)
这个解决方案对我有用:
context.getContentResolver().
registerContentObserver(Uri.parse("content://mms-sms/"), true, smsObserver);