Mi sembrava un po 'sui forum per determinare quanti messaggi SMS ho che non sono stati letti. Il codice seguente sembra funzionare correttamente per i messaggi ricevuti, ma una volta che ho effettivamente letto il messaggio non viene chiamato onChange del ContentObserver. Quindi, sul messaggio SMS in arrivo, onChange viene chiamato e ottengo il numero corretto, ma dopo aver letto il messaggio non viene chiamato. Il dispositivo è Samsung Note con Android 2.3.6 non rootato. Qualsiasi aiuto sarà apprezzato.Metodo onChange di ContentObserver non chiamato quando il messaggio SMS viene letto su Android
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");
}
}
}
nel file manifesto che ho le seguenti autorizzazioni:
"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"
Il mio modo di impostare il tutto sul servizio di chiamata è: nel onCreate del servizio che faccio:
mContentResolver = this.getContentResolver();
mUnreadSMSContentObserver = new UnreadSMSContentObserver(mContentResolver, mContentObserversHandler);
nel onStartCommand del servizio che faccio:
mContentResolver.registerContentObserver(Uri.parse("content://sms/"), true, mUnreadSMSContentObserver);
mContentResolver.registerContentObserver(Uri.parse("content://sms/inbox/"), true, mUnreadSMSContentObserver);
Ho provato solo il contenuto: // sms/e solo il contenuto: // sms/inbox/ed entrambi ... non hanno risolto il problema.
P.S. Un metodo simile per le chiamate perse funziona perfettamente!
L'applicazione + servizio invia tramite Bluetooth i dati della batteria, chiamate perse e messaggi SMS non letti a un dispositivo basato su Arduino che lo visualizza su uno schermo a LED. Perché? Due motivi: primo, questo è il mio primo programma Android fatto per divertimento. Il secondo è che non porto il telefono con me a casa tutto il tempo, ed è tipicamente nel mio ufficio di casa. Se non lo sento squillare sarò ancora in grado di vedere il display a LED che mi dice che ho ricevuto chiamate o SMS quando passo.
Non dovresti essere chiamando super (h), non super (null)? – matt5784