拦截传出的短信

是否有可能在实际发送之前拦截发送的SMS,获取其内容,然后根据某些标准忽略/发送它?

例如。 阻止所有国际文本(数字与前导00),但允许一切。

Solutions Collecting From Web of "拦截传出的短信"

传入短信

你可以拦截一个传入短信通过短信监听器使用广播接收器。您可以修改传入的短信或销毁,以便它不到达收件箱。

发送短信

您可以通过将content observer放在content://sms/out之外来监听传出的短信,但是您不能使用本地短信应用程序对其进行修改。您可以明显修改content://sms/out但没有意义。

根据我所能find的,似乎答案是“这是不可能的”,或者说,这是可能的,但是你需要编写自己的短信应用程序 ,以便收到文本在它成为一个短信之前,然后你可以执行任何检查你想在它之前调用API实际排队发送。

对不起=(

据我所知,你可以窥探短信,但是你不能阻止他们被送出去。

以下是如何检测传出的SMS消息: 在Android中收听传出的SMS或发送的邮箱

但是由于这基本上是通过从数据库中读取完成的,所以我怀疑你可以阻止SMS离开。

祝你好运。

灵光

这是我做了一个OutgoingSMSReceiver希望它可以帮助一些dya!

 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"); } } 

基于“Saad Akbar”响应,我使其工作,但只有拥有权限的根设备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" />