contentobserver работает только для вставки и удаления, но не для обновления

Я разрабатываю приложение, которое уведомляет пользователя, когда любое SMS помечено как прочитанное, даже если приложение не запущено.

Я просто создал contentobserver и зарегистрировал его в сервисе.

проблема в том, что contentobserver запускается, если новое SMS вставлено или удалено, но когда SMS помечено как прочитанное (операция обновления), оно не работает

вот мой служебный код

    public class Smssendservice extends Service {

    private static Timer timer = new Timer();
    private Context ctx;

    public IBinder onBind(Intent arg0)
    {
        return null;
    }

    public void onCreate()
    {
        super.onCreate();
        ctx = this;
        startService();
    }

    private void startService()
    {
        //timer.scheduleAtFixedRate(new mainTask(), 0, 5000);
        Toast.makeText(getApplicationContext(), "Before Register", Toast.LENGTH_SHORT).show();
        final Uri SMS_STATUS_URI = Uri.parse("content://sms");
        SMSLogger sl= new SMSLogger();

        SMSObserver smsSentObserver = new SMSObserver(sl, ctx);
        getContentResolver().registerContentObserver(SMS_STATUS_URI, true, smsSentObserver);
        Toast.makeText(getApplicationContext(), "After Register", Toast.LENGTH_SHORT).show();
    }
}

Я регистрирую свой обозреватель контента в сервисе

вот код наблюдателя контента

public class SMSObserver extends ContentObserver
{
    SMSLogger smsLogger;
    Context context;

    public SMSObserver(SMSLogger smsLogger, Context context) {

        super(new Handler());
        this.context=context;
        this.smsLogger = smsLogger;
    }

    @Override
    public void onChange(boolean selfChange) {

        super.onChange(selfChange);
        smsLogger.querySMS(context);
    }
} 

в конце концов, вот регистратор SMS, который я показываю TOAST, если данные SMS изменились

public class SMSLogger {
    protected void querySMS(Context context) {
        Uri uriSMS = Uri.parse("content://sms/");
        Cursor cur = context.getContentResolver().query(uriSMS, null, null, null, null);
       /* cur.moveToNext(); // this will make it point to the first record, which is the last SMS sent
        String body = cur.getString(cur.getColumnIndex("body")); //content of sms
        String add = cur.getString(cur.getColumnIndex("address")); //phone num
        String time = cur.getString(cur.getColumnIndex("date")); //date
        String protocol = cur.getString(cur.getColumnIndex("protocol")); //protocol*/

        Toast.makeText(context, "Data Changed CHECK SMS" , Toast.LENGTH_SHORT).show();

    /*logging action HERE...*/
    }
}

он показывал это сообщение «Данные изменены, ПРОВЕРЬТЕ SMS», если новое SMS вставлено или SMS удалено, но в случае обновления тост не появляется. любая подсказка?


person John Donvan    schedule 17.05.2014    source источник
comment
должен content://sms уведомлять о таком обновлении? где ты это прочитал?   -  person pskink    schedule 17.05.2014
comment
он слушает вставку и удаление, почему тогда он не слушает обновление? не знаю, как слушать действие обновления ?? я должен использовать смс/входящие?   -  person John Donvan    schedule 17.05.2014
comment
У меня есть вопрос, что, если мы удалим несколько сообщений из цепочки, сможем ли мы получать уведомления об удалении определенных сообщений? Я работаю над данной проблемой, но не могу прийти к выводу.   -  person Bhupendra    schedule 04.05.2015


Ответы (1)


В вашем методе обновления проверьте, превышает ли количество обновленных записей 0. Если это так, выполните getContext().getContentResolver().notifyChange(uri, null); прежде чем вы вернете количество обновленных записей.

person Hari Natarajan    schedule 04.11.2014