Sé que esta pregunta se ha hecho varias veces, pero nadie ha podido encontrar una respuesta que funcione de acuerdo con lo que he visto.Sms ContentObserver onChange() se dispara varias veces
Estoy trabajando en una aplicación para interceptar mensajes de texto y, dependiendo del # de envío, aparece una alerta personalizada. Lo tengo funcionando muy bien con un receptor de difusión, sin embargo, si el usuario tiene GoSms instalado, el método onReceive()
nunca se llama, ya que goSms aborta antes de que llegue a mi aplicación.
Para evitar esto, estoy tratando de un observador de contenido en content://sms/
Funciona bien, sin embargo, el onChange()
se llama dos veces, con exactamente los mismos parámetros. He tratado de verificar las marcas de tiempo, pero son las mismas, como es el tipo y todos los demás parámetros que he establecido.
Por lo que he visto, este es un problema común, pero no uno que he visto respondido en ninguna 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();
}
}
}
}
Debido a la onChange()
ser despedido dos veces, Im que consigue dos alertas también. No puedo, por la vida de mi, encontrar una forma de evitar esto.
enlaces a las otras respuestas (incompletas) serían útiles – KevinDTimm