So che questa domanda è stata posta più volte, ma nessuno è riuscito a trovare una risposta funzionante da quello che ho visto.Sms ContentObserver onChange() si attiva più volte
Sto lavorando su un'app per intercettare messaggi di testo e in base al numero di invio, pop-up con un avviso personalizzato. Ho funzionato perfettamente con un ricevitore broadcast, tuttavia se l'utente ha installato goSms, il metodo onReceive()
non viene mai chiamato come goSms lo interrompe prima che raggiunga la mia app.
Per aggirare questo problema, sto cercando un osservatore di contenuto su content://sms/
Sta funzionando bene, tuttavia lo onChange()
viene chiamato due volte, con esattamente gli stessi parametri. Ive ha provato a controllare i timestamp, ma sono uguali, così come il tipo e ogni altro parametro che ho impostato.
Da quello che ho visto, questo è un problema comune, ma non uno che ho visto risposta da nessuna parte.
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
querySMS();
}
protected void querySMS() {
Cursor cur = getContentResolver().query(u, null, null, null, null);
cur.moveToNext(); // this will make it point to the first record, which is the last SMS sent
String type = cur.getString(cur.getColumnIndex("type"));
String body = cur.getString(cur.getColumnIndex("body")); //content of sms
String add = cur.getString(cur.getColumnIndex("address")); //phone num
if (type.equals("1")) {
if (add.equals(Test.SENDER)) {
String[] bodys = body.split(" ", 7);
if (bodys[0].equals("test")) {
test = true;
}
cat = bodys[1];
level = bodys[2];
urgency = bodys[3];
certainty = bodys[4];
carrier = bodys[5];
message = bodys[6];
final Intent intent = new Intent(context, AlertActivity.class);
Bundle b = new Bundle();
b.putString("title", cat);
b.putString("certainty", certainty);
b.putString("urgency", urgency);
b.putString("level", level);
b.putString("message", message);
b.putBoolean("test", test);
intent.putExtras(b);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
TelephonyManager manager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
carrierName = manager.getNetworkOperatorName();
if (carrierName.replaceAll(" ", "").equals(carrier)) {
context.startActivity(intent);
} else {
//testing
Toast.makeText(context, carrierName.replaceAll(" ", ""), Toast.LENGTH_LONG).show();
}
}
}
}
A causa della onChange()
essere licenziato due volte, Im ottenendo due avvisi pure. Non posso per la vita di me capire un modo per aggirare questo.
i collegamenti alle altre risposte (incomplete) potrebbero essere utili – KevinDTimm