Автоматический ответ на сообщение, полученное Broadcastreciever - PullRequest
0 голосов
/ 06 апреля 2020

Добрый день всем.

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

Джон Доу посылает мне: «Привет», приложение получает тело сообщения, проверяет его в моей базе данных, где у меня есть потенциальный ответ:

ID | Текст | Потенциальный ответ 01 | Привет | Привет как дела?

и приложение отправляет потенциальный ответ.

Пока что я достиг - приложение получает сообщение, проверяет его с базой данных (используя «%») и получает правильный столбец «Потенциальный ответ» и передает его как текст сообщения, но для отправки это я использую кнопку.

Мой приемник - это отдельный класс файлов

public class MyReceiver extends BroadcastReceiver {
    public static String textSmsbody="";
    private static final String TAG=MyReceiver.class.getSimpleName();
    public static final String pdu_type="pdus";
    @TargetApi(Build.VERSION_CODES.M)
    @Override
    public void onReceive(Context context, Intent intent) {
        // Get the SMS message.
        Bundle bundle = intent.getExtras();
        SmsMessage[] msgs;
        String strMessage = "";
        String format = bundle.getString("format");
        // Retrieve the SMS message received.
        Object[] pdus = (Object[]) bundle.get(pdu_type);
        if (pdus != null) {
            // Check the Android version.
            boolean isVersionM =
                    (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M);
            // Fill the msgs array.
            msgs = new SmsMessage[pdus.length];
            for (int i = 0; i < msgs.length; i++) {
                // Check Android version and use appropriate createFromPdu.
                if (isVersionM) {
                    // If Android version M or newer:
                    msgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i], format);
                } else {
                    // If Android version L or older:
                    msgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
                }
                // Build the message to show.
                String a=msgs[i].getMessageBody();
                    textSmsbody=msgs[i].getMessageBody();
                if (a.contains("?")) {


                    strMessage=msgs[i].getOriginatingAddress();
                    // strMessage += " :" + msgs[i].getMessageBody() + "\n";

                }
                else {
                    strMessage=a;
                    //  strMessage += "SMS from" + msgs[i].getOriginatingAddress();
                    // strMessage += "ELSE:" + msgs[i].getMessageBody() + "\n";
                }

                // Log and display the SMS message.
                Log.d(TAG, "onReceive: " + strMessage);
                Toast.makeText(context, strMessage, Toast.LENGTH_LONG).show();
            }
        }
    }
}

Метод отправки находится в моей функции MainActivity.

public  void smsSendMessage(View view) {
           databaseSearch();
        // Set the destination phone number to the string in editText.
        String destinationAddress = "2020";
        // Find the sms_message view.


        // Get the text of the SMS message.
        String smsMessage = sendingText;
        // Set the service center address if needed, otherwise null.
        String scAddress = null;
        // Set pending intents to broadcast
        // when message sent and when delivered, or set to null.
        PendingIntent sentIntent = null, deliveryIntent = null;
        // Use SmsManager.
        SmsManager smsManager = SmsManager.getDefault();
        smsManager.sendTextMessage
                (destinationAddress, scAddress, smsMessage,
                        sentIntent, deliveryIntent);
    }

В макете у меня есть кнопка, которая вызывает smsSendMessage ();

У меня вопрос, как я могу сделать это автоматически без кнопки.

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

Пожалуйста, скажите мне, если вам нужен мой файл манифеста или база данныхhelper.

1 Ответ

0 голосов
/ 06 апреля 2020

Использование JobService должно быть подходящим вариантом в вашем случае.

Создайте класс JobService, подобный этому

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public class ExampleJobService extends JobService {

    @Override
    public boolean onStartJob(JobParameters params) {
        //send a message
        return true;
    }

    @Override
    public boolean onStopJob(JobParameters params) {
        return true;
    }
}

Также объявите в ваш манифест

    <service
android:name=".ExampleJobService"
                android:permission="android.permission.BIND_JOB_SERVICE" />

Теперь в вашем приемнике вы можете запустить его следующим образом

ComponentName componentName = new ComponentName(context, ExampleJobService.class);

PersistableBundle bundle = new PersistableBundle();
bundle.putLong("lat", lat);
bundle.putLong("lon", lon);

JobInfo jobInfo = new JobInfo.Builder(0, componentName)
        .setExtras(bundle)
        .build();

Подробнее о JobServices https://www.vogella.com/tutorials/AndroidTaskScheduling/article.html

...