Перехват, чтение и отмена смс сообщения - PullRequest
6 голосов
/ 08 апреля 2011

Я ищу способ перехватить SMSManager или механизм более низкого уровня, чтобы я мог перехватывать, читать и отменять любые исходящие SMS-сообщения перед их отправкой.

Ответы [ 3 ]

11 голосов
/ 28 июля 2014

Лучше поздно, чем никогда:)

Я потратил 2 дня на это ... И не хочу, чтобы кто-то другой тратил свое время :)зарегистрировать обозреватель контента в классе обслуживания

ОБНОВЛЕНИЕ: добавлено SMS Модель класса

      public class SMS {
        public Date date;
        public String from;
        public String message;
        public String to;

        public SMS(String paramString1, String paramString2, String paramString3,Date paramDate) {
            this.from = paramString1;
            this.to = paramString2;
            this.message = paramString3;
            this.date = paramDate;
        }
     }

    public class ServiceClass extends Service implements SMSListener {
    public static boolean sendSms = true;
    private final IBinder mBinder = new LocalBinder();
    public static MyContentObserver mSMSObserver;
    private Context ctx;
    public static SMS param_SMS;
    int myID = -1;

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
            // TODO Auto-generated method stub

            myID = startId;
            sendSms = true;
            Context localContext = getApplicationContext();
            ctx = localContext;

            mSMSObserver = new MyContentObserver(null);
            mSMSObserver.setSMSListener(this);
            mSMSObserver.start(localContext);

            return Service.START_STICKY;
     }

        @Override
        public void onDestroy() {
            // TODO Auto-generated method stub
            SharedPreferences prefs = getApplicationContext().getSharedPreferences(
                    "appData", 0);

            if (prefs.getBoolean(CommonStrings.KEY_PREFS_TOGGLE, false)) {

                super.onDestroy();
                Log.e("OnDestroy", "Stopping Service");
                Context localContext = getApplicationContext();
                mSMSObserver.stop(localContext);

                try {
                    stopSelf(myID);
                    Log.e("Stopping self", "Stopping Service");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }

        @Override
        public IBinder onBind(Intent intent) {
            // TODO Auto-generated method stub
            Log.e("OnBinder", "OnBinder");
            return null;
        }

        @Override
        public void reportIncomingSms(SMS paramSMS) {
            // TODO Auto-generated method stub

        }

        public void reportOutgoingSms(SMS paramSMS) {
            if (!MainActivity.stopped) {
                Log.e("OUT GOING SMS DETECTED", "OUT GOING SMS DETECTED");
                sendSms = true;
                param_SMS = paramSMS;

                // DO ANY THING, Out going Msg detected...

            }
        }

        public class LocalBinder extends Binder {
            public LocalBinder() {
            }

            public ServiceClass getService() {
                return ServiceClass.this;
            }
        }
    }

Расширение Content Observer

public class MyContentObserver extends ContentObserver {

public static final int MESSAGE_TYPE_ALL = 0;
public static final int MESSAGE_TYPE_DRAFT = 3;
public static final int MESSAGE_TYPE_FAILED = 5;
public static final int MESSAGE_TYPE_INBOX = 1;
public static final int MESSAGE_TYPE_OUTBOX = 4;
public static final int MESSAGE_TYPE_QUEUED = 6;
public static final int MESSAGE_TYPE_SENT = 2;
public static final String TYPE = "type";
private SMSListener mSMSListener;
public static long _id;
private ContentObserver observer;
    public MyContentObserver(Handler handler) {
    super(handler);
    // TODO Auto-generated constructor stub
    }
    private void readFromOutgoingSMS(Context paramContext) {
    if (!MainActivity.stopped) {
        Cursor localCursor = paramContext.getContentResolver().query(
        Uri.parse("content://sms"), null, null, null, null);
        long l = 0;
        int i;
        if (localCursor.moveToNext()) {
            l = localCursor.getLong(localCursor.getColumnIndex("_id"));
            String str1 = localCursor.getString(localCursor
                    .getColumnIndex("protocol"));
            i = localCursor.getInt(localCursor.getColumnIndex("type"));
            if ((str1 != null) || (i != 6))
                localCursor.close();
                if (i == 6) {
                int j = localCursor.getColumnIndex("body");
                int k = localCursor.getColumnIndex("address");
                Date localDate = new Date(localCursor.getLong(localCursor
                        .getColumnIndex("date")));
                String str2 = localCursor.getString(k);
                String str3 = localCursor.getString(j);
                localCursor.close();
                    _id = l;
                  // Delete SMS and Save the sms content to custom type variable
                if (deleteSms(paramContext, l)) {
                    SMS localSMS = new SMS("", str2, str3, localDate);
                    this.mSMSListener.reportOutgoingSms(localSMS);
                } else {
                    localCursor.close();
                }
            }
        }
    }
}

public static boolean deleteSms(Context paramContext, long paramLong) {
    Uri localUri = ContentUris.withAppendedId(Uri.parse("content://sms"),
            paramLong);
    boolean bool = false;
    if (localUri != null) {
        try {
            int j = paramContext.getContentResolver().delete(localUri,
                    null, null);
            if (j == 1)
                bool = true;
            else
                bool = false;
        } catch (Exception localException) {
            localException.printStackTrace();
            bool = false;
        }
    }
    return bool;
}

private void registerContentObserver(final Context paramContext) {
        this.observer = new ContentObserver(null) {
                public void onChange(boolean paramAnonymousBoolean) {
                    readFromOutgoingSMS(paramContext);
                }
            };
            paramContext.getContentResolver().registerContentObserver(
                Uri.parse("content://sms"), true, this.observer);
        }
            public void setSMSListener(SMSListener paramSMSListener) {
            this.mSMSListener = paramSMSListener;
        }
        public void start(Context paramContext) {
            registerContentObserver(paramContext);
            listenForIncomingSms(paramContext);
        }

        public void stop(Context paramContext) {
            paramContext.getContentResolver().unregisterContentObserver(
                    this.observer);
        }
        private void listenForIncomingSms(Context paramContext) {
        //.....
        }

}

SMS LIstener

 public abstract interface SMSListener {
 public abstract void reportIncomingSms(SMS paramSMS);

 public abstract void reportOutgoingSms(SMS paramSMS);
   }

Необходимые разрешения:

   <uses-permission android:name="android.permission.READ_SMS" />
   <uses-permission android:name="android.permission.READ_CONTACTS" />
11 голосов
/ 08 августа 2011

Очевидно, что это не то, что вы хотите услышать, но Android просто не предназначен для того, чтобы разрешать сторонним приложениям мешать друг другу или игнорировать свободный выбор пользователя.

Он не обеспечиваетМеханизм типа «ловушка» для жесткого перехвата основных функций, за исключением изменения сборки самого Android, установленного на устройстве.

Интерфейсы администратора устройства не включают ничего для регулирования SMS.

Да, иногда люди делают продукты, используя различные методы «взлома» для достижения таких целей, но они противоречат дизайну платформы и, таким образом, либо ненадежны, либо могут сломаться, когда в Android внесены различные улучшения типа «исправления ошибок».,Или же они имеют ограничение по объему, например, замену главного экрана и, таким образом, ограничение того, что легко запускается - но только до тех пор, пока это приложение домашнего экрана остается выбранным и не может регулировать другие источники намерений.

Вам может показаться, что идея достаточно привлекательна, чтобы вы решили использовать ее, но имейте в виду, что если это не будущее введение в API , предназначенное для такого рода вещей , вы, скорее всего, воспользуетесь упущениемв дизайне платформы, который, скорее всего, скоро будет исправлен.

3 голосов
/ 10 августа 2011

А как насчет компромисса?Почему бы не создать приложение для написания смс?Пользователи могут выбрать его в качестве приложения по умолчанию для написания смс, чтобы оно не беспокоило их постоянно.Я считаю, что это единственный способ приблизиться к своей цели без рутирования / предоставления собственной версии Android.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...