Зарегистрированная трансляция не принимается приложением Android, если оно не на переднем плане (Java)JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Зарегистрированная трансляция не принимается приложением Android, если оно не на переднем плане (Java)

Сообщение Anonymous »

Я разрабатываю приложение для местной (крошечной) пожарной станции, потому что у них нет доступа к радио. Я хотел создать приложение, которое могло бы действовать как кнопка тревоги, которую можно было бы использовать вместо радио. (В настоящее время они отправляют SMS-сообщения во время пожара, но писать и отправлять их очень медленно). Поэтому я подумал, что приложение может автоматически писать эти сообщения и отправлять их, и даже «получать» предупреждающие сообщения и обрабатывать их. Для этого я использую BroadcastReceiver, который должен работать бесконечно. Проблема в том, что он получает сообщения только тогда, когда приложение открыто.
Примечание. Я использую Xiaomi Mi 11 для тестирования и знаю, что некоторые производители, в том числе Xiaomi реализовала массу ограничений относительно фоновых процессов. Я отключил ограничения заряда батареи, «Приостановить активность приложения, если оно не используется» и все ограничения отключить, которые смог найти.
Я читал, что начиная с Android 7 получатели регистрировались в манифест не всегда работает, и большинство неявных получателей работают только тогда, когда приложение находится на переднем плане (источник). К счастью, я обнаружил, что есть исключения, и Telephony.SMS_RECEIVED_ACTION является одним из них, как описано здесь и здесь. Однако он по-прежнему не работает, когда приложение закрыто, например, при перелистывании из раздела «Недавние» или принудительной остановке.
Манифест: Класс SmsReceiver:

Код: Выделить всё

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.provider.Telephony;
import android.telephony.SmsMessage;
import android.util.Log;

import java.util.Objects;

public class SmsReceiver extends BroadcastReceiver {

public SmsReceiver() {}

@Override
public void onReceive(Context context, Intent intent) {

Log.d("qvkrimp", "dbg1"); // line only prints when in foreground

if (alertListener != null && Objects.equals(intent.getAction(), Telephony.Sms.Intents.SMS_RECEIVED_ACTION)) {
SmsMessage[] smsMessages = Telephony.Sms.Intents.getMessagesFromIntent(intent);
StringBuilder sb = new StringBuilder();
for (SmsMessage message : smsMessages) {
sb.append(message.getMessageBody());
}

String sender = smsMessages[0].getOriginatingAddress();
String message = sb.toString();

// message has to start with "[QVKR ALERT]"
if (message.startsWith("[QVKR ALERT]")) {
Log.d("qvkrimp", "dbg2");
}
}
}
}
Последние 2 дня я читал соответствующие вопросы и документацию, но не смог найти работающую.
Я сделал что-то не так? Разве приемник не должен работать, если он описан как «исключение»? Или есть другой подход к надежному получателю SMS?
Спасибо за любую помощь!

Подробнее здесь: https://stackoverflow.com/questions/784 ... t-in-foreg
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»