6

未読の SMS メッセージの数を判断するために、フォーラムをかなり調べていました。以下のコードは、受信したメッセージに対してうまく機能しているように見えますが、実際にメッセージを読むと、ContentObserver の onChange が呼び出されていません。そのため、着信 SMS メッセージで onChange が呼び出され、正しい番号を取得しますが、メッセージを読んだ後は呼び出されません。デバイスは、ルート化されていない Android 2.3.6 を実行している Samsung Note です。どんな助けでも大歓迎です。

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

content://sms/ のみと content://sms/inbox/ のみを試しましたが、両方とも... 問題は解決しませんでした。

PS 不在着信に対する同様の方法は完璧に機能します!

アプリケーション + サービスは、Bluetooth を介してバッテリー データ、不在着信、未読の SMS メッセージを Arduino ベースのデバイスに送信し、LED 画面に表示します。なんで?理由は 2 つあります。まず、これは楽しみのために作成した初めての Android プログラムです。2 つ目は、電話を常に家に持ち歩いているわけではなく、通常はホーム オフィスにあることです。呼び出し音が聞こえなかった場合でも、通り過ぎるときに電話や SMS があったことを知らせる LED ディスプレイを見ることができます。

4

1 に答える 1