当应用程序在后台时接收短信的 Android 服务

Ste*_*oid 6 service sms android background broadcastreceiver

我是 Stackoverflow 的新手,目前正在开发一个处理传入 SMS 的应用程序。在我寻找解决方案时,我遇到了不同的方法,包括工作正常的独立广播接收器和服务。目标是即使在应用程序处于后台且屏幕关闭(手机锁定)时也能接收短信。

我目前的问题是:我收到任何在服务中运行的广播接收器的短信。此服务在我的 MainActivity 的 onResume() 中启动,不应停止。

  • 当我的应用程序在前台时,接收器可以识别所有短信。
  • 即使应用程序在后台但我的手机仍在运行,我也可以收到这些消息。

奇怪的事情发生在这里:

  • 应用程序在前台,我关闭了屏幕 --> 短信被识别。
  • 应用程序在后台,我关闭了屏幕 --> 无法识别短信。

这是我的服务级代码:

public class SmsProcessService extends Service {
    SmsReceiver smsReceiver = new SmsReceiver();

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        registerReceiver(smsReceiver, new IntentFilter("android.provider.Telephony.SMS_RECEIVED"));

        return START_STICKY;
    }

    private class SmsReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            String telnr = "", nachricht = "";

            Bundle extras = intent.getExtras();

            if (extras != null) {
                Object[] pdus = (Object[]) extras.get("pdus");
                if (pdus != null) {

                    for (Object pdu : pdus) {
                        SmsMessage smsMessage = getIncomingMessage(pdu, extras);
                        telnr = smsMessage.getDisplayOriginatingAddress();
                        nachricht += smsMessage.getDisplayMessageBody();
                    }

// Here the message content is processed within MainAct
                    MainAct.instance().processSMS(telnr.replace("+49", "0").replace(" ", ""), nachricht);
                }
            }
        }

        private SmsMessage getIncomingMessage(Object object, Bundle bundle) {
            SmsMessage smsMessage;

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                String format = bundle.getString("format");
                smsMessage = SmsMessage.createFromPdu((byte[]) object, format);
            } else {
                smsMessage = SmsMessage.createFromPdu((byte[]) object);
            }

            return smsMessage;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的 MainActivity 中,我声明了一个 Intent

Intent smsServiceIntent
Run Code Online (Sandbox Code Playgroud)

像这样在 onCreate() 中初始化

smsServiceIntent = new Intent(MainAct.this, SmsProcessService.class);
Run Code Online (Sandbox Code Playgroud)

我在 Activity onResume() 中启动服务

MainAct.this.startService(smsServiceIntent);
Run Code Online (Sandbox Code Playgroud)

我的清单文件必须<service android:name=".SmsProcessService" />声明服务和以下权限:

<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.SEND_SMS" />
Run Code Online (Sandbox Code Playgroud)

我真的希望,你能给我一些支持和帮助,以找出应用程序的行为。

问候斯蒂芬

Ste*_*oid 3

我现在在不同的手机上尝试了该应用程序,我想我已经找到了问题的根源。

在另一部手机(相同的操作系统版本)上一切正常。我猜想其他几个应用程序也会收到短信广播,也许它们会互相干扰。我无法准确找出哪些应用程序最差。

我现在将尝试本地化具有类似用途的其他应用程序,并希望卸载或更改其通知设置会有所帮助。您猜其他应用程序(例如我想进一步使用的“自动响铃”)如何并行工作?

编辑:

我发现导致应用程序出现问题:它是 Google 应用程序,也授予了 SMS 权限。我停用了它,一切正常

问候史蒂芬