es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo leer los mensajes SMS (bandeja de entrada) y actualizarlos en tiempo real en mi aplicación en Android?

He podido recuperar los mensajes SMS y mostrarlos en mi aplicación correctamente, pero quiero que se actualicen automáticamente a medida que se reciben. ¿Alguna ayuda?
Aquí está mi código:

public void refreshSmsInbox() {
    ContentResolver contentResolver = getContentResolver();
    Cursor smsInboxCursor = contentResolver.query(Telephony.Sms.CONTENT_URI, null, null, null, null);
    int totalSMs;
    int Id = adapter.getItemCount();
    if (Id >= 0) {
        if (smsInboxCursor != null) {
            totalSMs = smsInboxCursor.getCount();
            if (smsInboxCursor.moveToFirst()) {
                for (int j = 0; j < totalSMs; j++) {
                    indexBody = smsInboxCursor.getString(smsInboxCursor.getColumnIndexOrThrow(Telephony.Sms.BODY));
                    indexAddress = smsInboxCursor.getString(smsInboxCursor.getColumnIndexOrThrow(Telephony.Sms.ADDRESS));
                    indexDate = smsInboxCursor.getString(smsInboxCursor.getColumnIndexOrThrow(Telephony.Sms.DATE));
                    dateFormat = new Date(smsInboxCursor.getShort(0));
                    smsModel.add(new SmsModel(Id, indexAddress, indexBody, dateFormat.toString(), messageSender));
                    adapter.setSmsModel(smsModel);
                    recyclerView.setAdapter(adapter);
                    recyclerView.setLayoutManager(new LinearLayoutManager(this));
                    smsInboxCursor.moveToNext();
                }
            }
        } else {
            Toast.makeText(this, "No hay mensajes para mostrar", Toast.LENGTH_SHORT).show();
        }
    }
}
Tags:  ,

Answer

  1. Avatar for davy.ai

    Para actualizar automáticamente los SMS a medida que se reciben, se puede utilizar un ContentObserver. Puede crear una clase que extienda ContentObserver y anular el método onChange() para activar una actualización de su bandeja de entrada de SMS. Aquí hay un ejemplo:

    public class SmsObserver extends ContentObserver {
        private Context context;
        private SmsAdapter adapter;
    
        public SmsObserver(Context context, SmsAdapter adapter) {
            super(null);
            this.context = context;
            this.adapter = adapter;
        }
    
        @Override
        public void onChange(boolean selfChange) {
            super.onChange(selfChange);
            adapter.refreshSmsInbox();
        }
    }
    

    En su actividad, puede registrar el observador utilizando el siguiente código:

    ContentResolver resolver = getContentResolver();
    SmsObserver observer = new SmsObserver(this, adapter);
    resolver.registerContentObserver(Telephony.Sms.CONTENT_URI, true, observer);
    

    Esto asegurará que se detecten cualquier cambio en la bandeja de entrada de SMS y se llame al método refreshSmsInbox() del adaptador para actualizar la pantalla.

Comments are closed.