【发布时间】:2021-05-13 12:59:01
【问题描述】:
我正在开发一个需要接收短信的应用程序,并且不允许任何其他应用程序接收短信。
应用必须在 Kitkat 和旧版本上都能正常运行。(我在 kitkat 中将我的应用设为默认短信应用)
这是我在 manifast 文件中尝试的内容(不是全部):
<receiver android:name=".SmsReceiver"
android:permission="android.permission.BROADCAST_SMS">
<intent-filter android:priority="2147483647" >
<action android:name="android.provider.Telephony.SMS_DELIVER" />
</intent-filter>
</receiver>
<receiver android:name=".SmsReceiver" android:enabled="true">
<intent-filter android:priority="2147483647">
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
第一个接收器用于 kitkat 让我的应用成为默认短信应用(当我删除这部分 kitkat 时,不要让我的应用成为默认短信应用),第二个接收器用于旧版本
在 kitkat 上,问题是我所有的代码都运行了两次(因为我有两个接收器)
在旧版本上,我的应用程序运行一次 onReceive 方法,但我从 Go SMS Pro 收到了新消息通知,但我只需要我的应用程序接收短信
这是我的 SmsReceiver 类:
public class SmsReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
Bundle bundle = intent.getExtras();
if (bundle != null)
{
Object[] pdus = (Object[]) bundle.get("pdus");
if (pdus.length == 0)
{
return;
}
SmsMessage[] messages = new SmsMessage[pdus.length];
StringBuilder sb = new StringBuilder();
for (int i = 0; i < pdus.length; i++)
{
messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
sb.append(messages[i].getMessageBody());
}
String sender = messages[0].getOriginatingAddress();
String message = sb.toString();
abortBroadcast();// prevent any other broadcast receivers from receiving broadcast
// things I need to do on SMS
}
}// on Rec
}
【问题讨论】:
-
记录您看到的每次调用的操作。
-
你可以测试广播是否被订购。我希望不再订购新的
SMS_RECEIVED_ACTION,因为它不可中止。