SMS-сообщение не получено BroadcastReceiver - PullRequest
0 голосов
/ 09 июля 2019

Я пытаюсь написать широковещательный приемник для обработки полученных SMS и запустить диалоговое окно с предупреждением для получения входных данных от пользователя.Ожидается, что этот широковещательный приемник будет работать, когда основное приложение (MainActivity) будет закрыто (путем считывания).

Исходя из ввода пользователя, получатель добавляет некоторый контент в файл в файловой системе Android после запроса разрешения пользователя через предупреждение.Я заметил, что onReceive BroadcastReceiver вообще не вызывается

  1. Я получаю разрешения от пользователя, используя requestPermissions в MainActivity
  2. Я запускаю службу с именем ServiceCommunicator
  3. ServiceCommunicator регистрирует получателя для прослушивания SMS
  4. Приемник отображает предупреждающее сообщение

Я также пытался без ServiceCommunicator (Приемник зарегистрирован в самом MainActivity)

В обоих случаях выше, onCreate получателя не срабатывает.Получатель указан в команде оболочки adb:

Приемники запросов пакета cmd оболочки adb --brief -a android.provider.Telephony.SMS_RECEIVED

MainActivity имеет следующее в составе onCreateМетод:


int PERMISSION_ALL = 1;
String[] PERMISSIONS = {
        android.Manifest.permission.RECEIVE_SMS,
        android.Manifest.permission.SEND_SMS,
};

ActivityCompat.requestPermissions(this, PERMISSIONS, PERMISSION_ALL);

Intent serviceIntent = new Intent(this, ServiceCommunicator.class);
startService(serviceIntent);

...

    @Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults)
    {
        switch(requestCode)
        {
            case MY_PERMISSIONS_REQUEST_RECEIVE_SMS:
            {
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
                {
                    Toast.makeText(this, "Thanks for SMS receive permissions", Toast.LENGTH_LONG).show();
                }
                else
                {
                    Toast.makeText(this, "SMS can't be received", Toast.LENGTH_LONG).show();
                }
                break;
            }
            case MY_PERMISSIONS_REQUEST_SEND_SMS:
            {
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                    Toast.makeText(getApplicationContext(), "Thanks for SMS send permissions",
                            Toast.LENGTH_LONG).show();
                } else {
                    Toast.makeText(getApplicationContext(),
                            "SMS can't be sent", Toast.LENGTH_LONG).show();
                }
                break;
            }
        }
        return;
    }

ServiceCommunicator имеет следующее:

receiverIntentFilter = new IntentFilter();
receiverIntentFilter.addAction("android.provider.Telephony.SMS_RECEIVED");
myReceiver = new MyReceiver();

// Register SMS event receiver

registerReceiver(myReceiver, receiverIntentFilter);

Получатель имеет следующее в onReceive:


if (intent.getAction() == "android.provider.Telephony.SMS_RECEIVED")
{

...

Intent alertDialogIntent = new Intent(context, AlertDialogActivity.class);
                        alertDialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
alertDialogIntent.putExtra("ALERT_MSG", alertMsg);
alertDialogIntent.putExtra("MESSAGE", "\n" + msg);
context.startActivity(alertDialogIntent);

}

AlertDialogActivity имеет следующее:


AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder
        .setTitle("Add information to system?")
        .setMessage(alertMsg)
...

Manifest.xml имеет следующее.Обновил файл (извините, пропустил его ранее):

    <uses-permission android:name="android.permission.SEND_SMS" />
    <uses-permission android:name="android.permission.READ_SMS" />
    <uses-permission android:name="android.permission.RECEIVE_SMS" />

        <receiver android:priority="2147483647" android:name=".MyReceiver" android:enabled="true" android:exported="true">
            <intent-filter>
                <action android:name="android.provider.Telephony.SMS_RECEIVED">

                </action>
            </intent-filter>
        </receiver>
        <service android:process="com.example.rtien.ServiceCommunicator" android:enabled="true" android:exported="true" android:stopWithTask="false" android:name="com.example.rtien.ServiceCommunicator" />
        <activity android:name=".MainActivity" android:theme="@style/Theme.AppCompat">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

Ожидаемый результат: Когда MainActivity закрыта, приемник должен работать в фоновом режиме.Метод onReceive в приемнике должен быть запущен.Должно быть показано предупреждающее сообщение и данные, добавленные в файл

Наблюдаемый результат: onReceive получателя срабатывает, когда MainActivity активна, но не когда оно закрыто

1 Ответ

1 голос
/ 09 июля 2019

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

Попробуйте этот код, чтобы избежать прерывания работы службы, и убедитесь, что у вас есть разрешение на автозапуск и все остальные разрешения

Добавьте его в свой сервис

@Override
    public void onTaskRemoved(Intent rootIntent) {
        try {
            Intent restartService = new Intent(getApplicationContext(),this.getClass());
            restartService.setPackage(getPackageName());
            PendingIntent restartServicePI = PendingIntent.getService(
                        getApplicationContext(), 1, restartService,
                        PendingIntent.FLAG_ONE_SHOT);
            AlarmManager alarmService = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
                alarmService.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + 1000, restartServicePI);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
...