Android 应用程序在后台时接收短信的服务
Android Service to receive SMS when app is in background
我是 Whosebug 的新手,目前正在开发一个处理传入短信的应用程序。在寻找解决方案时,我遇到了不同的方法,包括运行良好的独立 BroadcastReceivers 和服务。目标是即使应用程序处于后台且屏幕关闭(phone 已锁定)也能接收短信。
我目前的问题是:我在服务中收到任何带有 BroadcastReceiver 运行 的短信。此服务在我的 MainActivity 的 onResume() 中启动,不应停止。
- 当我的应用程序在前台时,接收方可以识别所有短信。
- 即使应用程序处于后台但我的 phone 仍在运行,我也可以收到这些消息。
奇怪的事情发生在这里:
- 应用程序在前台,我关闭屏幕 --> 短信被识别。
- 应用程序在后台运行,我关闭了屏幕 --> 无法识别短信。
这是我的服务代码-class:
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;
}
}
}
在我的 MainActivity 中声明一个 Intent
Intent smsServiceIntent
像这样在onCreate()中初始化的
smsServiceIntent = new Intent(MainAct.this, SmsProcessService.class);
我在 Activity onResume()
中启动服务
MainAct.this.startService(smsServiceIntent);
我的清单文件具有 <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" />
我真的希望,你能给我一些支持和帮助来弄清楚应用程序的行为。
问候史蒂芬
我现在在不同的 phone 上尝试了该应用程序,我想我已经找到了问题的根源。
在另一个 phone(相同的 OS 版本)上一切正常。我猜想其他几个应用程序也会收到 SMS-Broadcast,也许它们会互相干扰。我没能弄清楚哪些应用程序最糟糕。
我现在将尝试本地化具有类似用途的其他应用程序,希望卸载或更改它们的通知设置会有所帮助。您是否猜到那些其他应用程序(例如 "Auto Ring",我想进一步使用它)如何并行工作?
编辑:
我发现导致应用程序出现问题的原因是:Google-应用程序也已授予短信权限。我停用了它,一切正常
问候史蒂芬
将广播优先级设置为 2147483647
可能会解决上述问题 here。
<receiver android:name=".SmsReceiver">
<intent-filter android:priority="2147483647" >
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
我是 Whosebug 的新手,目前正在开发一个处理传入短信的应用程序。在寻找解决方案时,我遇到了不同的方法,包括运行良好的独立 BroadcastReceivers 和服务。目标是即使应用程序处于后台且屏幕关闭(phone 已锁定)也能接收短信。
我目前的问题是:我在服务中收到任何带有 BroadcastReceiver 运行 的短信。此服务在我的 MainActivity 的 onResume() 中启动,不应停止。
- 当我的应用程序在前台时,接收方可以识别所有短信。
- 即使应用程序处于后台但我的 phone 仍在运行,我也可以收到这些消息。
奇怪的事情发生在这里:
- 应用程序在前台,我关闭屏幕 --> 短信被识别。
- 应用程序在后台运行,我关闭了屏幕 --> 无法识别短信。
这是我的服务代码-class:
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;
}
}
}
在我的 MainActivity 中声明一个 Intent
Intent smsServiceIntent
像这样在onCreate()中初始化的
smsServiceIntent = new Intent(MainAct.this, SmsProcessService.class);
我在 Activity onResume()
中启动服务MainAct.this.startService(smsServiceIntent);
我的清单文件具有 <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" />
我真的希望,你能给我一些支持和帮助来弄清楚应用程序的行为。
问候史蒂芬
我现在在不同的 phone 上尝试了该应用程序,我想我已经找到了问题的根源。
在另一个 phone(相同的 OS 版本)上一切正常。我猜想其他几个应用程序也会收到 SMS-Broadcast,也许它们会互相干扰。我没能弄清楚哪些应用程序最糟糕。
我现在将尝试本地化具有类似用途的其他应用程序,希望卸载或更改它们的通知设置会有所帮助。您是否猜到那些其他应用程序(例如 "Auto Ring",我想进一步使用它)如何并行工作?
编辑:
我发现导致应用程序出现问题的原因是:Google-应用程序也已授予短信权限。我停用了它,一切正常
问候史蒂芬
将广播优先级设置为 2147483647
可能会解决上述问题 here。
<receiver android:name=".SmsReceiver">
<intent-filter android:priority="2147483647" >
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>