Подтвердить что ты не робот

Перехват исходящих SMS-сообщений

Возможно ли перехватить исходящие SMS до того, как они будут отправлены, получить его содержимое, затем проигнорировать/отправить его в соответствии с некоторыми критериями?

например. заблокировать весь международный текст (номера с ведущим номером 00), но разрешить все остальное.

4b9b3361

Ответ 1

Входящие SMS

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

Исходящие SMS

Вы можете прослушивать исходящие sms, помещая content observer поверх content://sms/out, но вы не можете его модифицировать с помощью собственного sms-приложения. Очевидно, вы можете изменить содержимое content://sms/out, но в нем нет точки.

Ответ 2

Основываясь на том, что я смог найти, кажется, что и ответ: "Это невозможно" или, что это возможно, но вам нужно написать собственное приложение для SMS, чтобы вы получили текст до того, как он стал SMS, а затем вы можете выполнить любые проверки вы хотели бы на нем, прежде чем обращаться к API, чтобы фактически отправить его в очередь.

Извините = (

Ответ 3

Насколько я знаю, вы можете отслеживать исходящие SMS-сообщения, но вы не можете остановить их отправку.

Здесь вы можете обнаружить исходящие SMS-сообщения: Слушайте исходящие SMS или отправленные сообщения в Android

Но так как это делается в основном путем чтения из базы данных, я сомневаюсь, что вы можете остановить отправку SMS.

Я желаю вам удачи.

Эммануэль

Ответ 4

Это то, что я сделал, чтобы заставить OutgoingSMSReceiver надеяться, что это поможет кому-то немного!

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

Ответ 5

На основе ответа "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" />