Я пытаюсь написать широковещательный приемник для обработки полученных SMS и запустить диалоговое окно с предупреждением для получения входных данных от пользователя.Ожидается, что этот широковещательный приемник будет работать, когда основное приложение (MainActivity) будет закрыто (путем считывания).
Исходя из ввода пользователя, получатель добавляет некоторый контент в файл в файловой системе Android после запроса разрешения пользователя через предупреждение.Я заметил, что onReceive BroadcastReceiver вообще не вызывается
- Я получаю разрешения от пользователя, используя requestPermissions в MainActivity
- Я запускаю службу с именем ServiceCommunicator
- ServiceCommunicator регистрирует получателя для прослушивания SMS
- Приемник отображает предупреждающее сообщение
Я также пытался без 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 активна, но не когда оно закрыто