android sms intercept

android - Interceptando SMS salientes



(5)

¿Es posible interceptar los SMS salientes antes de que realmente se envíen, obtener su contenido y luego ignorarlo / enviarlo de acuerdo con algunos criterios?

p.ej. Bloquea todos los textos internacionales (números con 00 iniciales), pero permite todo lo demás.


Esto es lo que he hecho para hacer que un receptor de SMS saliente espere que ayude a alguien en algún momento.

public final class OutgoingSMSReceiver extends Service { private static final String CONTENT_SMS = "content://sms/"; private CallerHistoryDataSource database = new CallerHistoryDataSource(UCDGlobalContextProvider.getContext()); static String messageId=""; private class MyContentObserver extends ContentObserver { public MyContentObserver() { super(null); } @Override public void onChange(boolean selfChange) { super.onChange(selfChange); Uri uriSMSURI = Uri.parse(CONTENT_SMS); Cursor cur = UCDGlobalContextProvider.getContext().getContentResolver().query(uriSMSURI, null, null, null, null); // this will make it point to the first record, which is the last SMS sent cur.moveToNext(); String message_id = cur.getString(cur.getColumnIndex("_id")); String type = cur.getString(cur.getColumnIndex("type")); if(type.equals(Constants.SMS_TYPE_OUTGOING)){ /** * onChange is fired multiple times for a single SMS, this is to prevent multiple entries in db. * */ if(!message_id.equals(messageId)) { String content = cur.getString(cur.getColumnIndex("body")); String msisdnWithCountryCodeOrPrefix = cur.getString(cur.getColumnIndex("address")); String msisdn = MSISDNPreFixHandler.fixMsisdn(msisdnWithCountryCodeOrPrefix); Sms sms = new Sms(); sms.setType(Constants.SMS_TYPE_OUTGOING); sms.setMsisdn(msisdn); sms.setContent(content); Log.i("MyContentObserver", "Sent SMS saved: "+content); } messageId = message_id; } } @Override public boolean deliverSelfNotifications() { return false; } } @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { MyContentObserver contentObserver = new MyContentObserver(); ContentResolver contentResolver = getBaseContext().getContentResolver(); contentResolver.registerContentObserver(Uri.parse(CONTENT_SMS),true, contentObserver); //Log.v("Caller History: Service Started.", "OutgoingSMSReceiverService"); } @Override public void onDestroy() { //Log.v("Caller History: Service Stopped.", "OutgoingSMSReceiverService"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { //Log.v("Caller History: Service Started.", "OutgoingSMSReceiverService"); /** * Constant to return from onStartCommand(Intent, int, int): if this service''s process is killed while it is started * (after returning from onStartCommand(Intent, int, int)), then leave it in the started state but don''t retain this delivered intent. * Later the system will try to re-create the service. Because it is in the started state, it will guarantee to call * onStartCommand(Intent, int, int) after creating the new service instance; if there are not any pending start commands to be * delivered to the service, it will be called with a null intent object, so you must take care to check for this. * This mode makes sense for things that will be explicitly started and stopped to run for arbitrary periods of time, such as a * service performing background music playback. */ return START_STICKY; } @Override public void onStart(Intent intent, int startid) { Log.v("Caller History: Service Started.", "OutgoingSMSReceiverService"); } }


Que yo sepa, puede espiar los mensajes SMS salientes pero no puede evitar que se envíen.

Aquí le mostramos cómo puede detectar los mensajes SMS salientes: escuche los SMS salientes o la casilla enviada en Android

Pero como esto se hace básicamente mediante la lectura de una base de datos, dudo que pueda detener el envío de SMS.

Les deseo buena suerte.

Emmanuel


Según la respuesta de "Saad Akbar", hago que funcione, pero solo con un dispositivo rooteado con permiso MODIFY_PHONE_STATE

public class OutgoingSMSReceiver extends Service { private static final String CONTENT_SMS = "content://sms/"; static String messageId = ""; private class MyContentObserver extends ContentObserver { Context context; private SharedPreferences prefs; private String phoneNumberBlocked; public MyContentObserver(Context context) { super(null); this.context = context; } @Override public void onChange(boolean selfChange) { super.onChange(selfChange); prefs = context.getSharedPreferences("com.example.testcall", Context.MODE_PRIVATE); phoneNumberBlocked = prefs.getString("numero", ""); Uri uriSMSURI = Uri.parse(CONTENT_SMS); Cursor cur = context.getContentResolver().query(uriSMSURI, null, null, null, null); if (cur.moveToNext()) { String message_id = cur.getString(cur.getColumnIndex("_id")); String type = cur.getString(cur.getColumnIndex("type")); String numeroTelephone=cur.getString(cur.getColumnIndex("address")).trim(); if (numeroTelephone.equals(phoneNumberBlocked)) { if (cur.getString(cur.getColumnIndex("type")).equals("6")) { ContentValues values = new ContentValues(); values.put("type", "5"); context.getContentResolver().update(uriSMSURI,values,"_id= "+message_id,null); } else if(cur.getString(cur.getColumnIndex("type")).equals("5")) { context.getContentResolver().delete(uriSMSURI,"_id=?",new String[] { message_id}); } } } } @Override public boolean deliverSelfNotifications() { return false; } } @Override public void onCreate() { MyContentObserver contentObserver = new MyContentObserver(getApplicationContext()); ContentResolver contentResolver = getBaseContext().getContentResolver(); contentResolver.registerContentObserver(Uri.parse(CONTENT_SMS), true, contentObserver); } } <uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />


Según lo que he podido encontrar, parece que la respuesta es: "Es imposible" o que podría ser posible, pero necesitarías escribir tu propia aplicación de SMS para recibir el texto. antes de que se convirtiera en un SMS, y luego podría realizar las comprobaciones que desee antes de llamar a la API para que se envíe en cola.

Sorry = (


SMS entrante

Puede interceptar un sms entrante a través del receptor de sms usando Broadcast Receiver. Puede modificar el sms entrante o destruirlo para que no llegue a la bandeja de entrada.

SMS salientes

Puede escuchar los sms salientes colocando content observer sobre el content://sms/out pero no puede modificarlo con la aplicación nativa de sms. Obviamente, puede modificar el contenido del content://sms/out pero no tiene ningún punto.