android - 在 Android 上读取短信时不调用 ContentObserver 的 onChange 方法

标签 android

我在论坛上看了很多,以确定我有多少条未读的短信。下面的代码似乎适用于接收到的消息,但是一旦我真正阅读了消息,就不会调用 ContentObserver 的 onChange 。 因此,在传入的 SMS 消息上,onChange 被调用并且我得到了正确的号码,但在阅读消息后它没有被调用。该设备是运行 Android 2.3.6 的 Samsung Note 未 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");
        }
    }
}

在 list 文件中我有以下权限:

"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);

我只尝试了 content://sms/和 content://sms/inbox/以及两者...都没有解决问题。

附言未接来电的类似方法非常完美!

应用程序+服务通过蓝牙将电池数据、未接来电和未读短信发送到基于 Arduino 的设备,该设备将其显示在 LED 屏幕上。为什么?两个原因:首先,这是我为娱乐而制作的第一个 Android 程序。第二个是我并没有一直在家里随身携带电话,它通常在我的家庭办公室里。如果我没有听到铃声,我仍然可以看到 LED 显示屏告诉我路过时有来电或短信。

最佳答案

这个解决方案对我有用:

 context.getContentResolver().
                registerContentObserver(Uri.parse("content://mms-sms/"), true, smsObserver);

关于android - 在 Android 上读取短信时不调用 ContentObserver 的 onChange 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10842390/

相关文章:

在 Android Studio 与 Gradle 中运行时,Android lint 会产生不同的结果

java - 使用 SearchView 过滤 Recyclerview 后位置错误

android - 如何重新定位 MediaController?

android - 在 GlSurfaceView 上播放的视频每 16 或 17 帧挂起 500 毫秒

java - File.exists()对于实际存在的文件(目录)返回false

android重复提供者权限

android - setScaleX() 不会改变实际 View 大小

Android:按钮状态改变事件

java - 使用内容值的更新方法

android - 如何使用模拟器在 Galaxy S4 配置中测试 android 应用程序?