我正在开发一个需要接收短信的应用程序,并且不允许任何其他应用程序接收短信。
应用程序必须在Kitkat和旧版本上都能很好地工作。(我在kitkat中创建我的app默认短信应用程序)
这是我在我的showast文件中尝试的(不是全部):
<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,问题是我的所有代码都运行了两次(因为我有两个reciver)
在旧版本上,我的应用程序运行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
}
答案 0 :(得分:1)
支持旧版和旧版Android的短信处理的推荐方法是拥有两个不同的BroadcastReceiver
类:一个用于新SMS_DELIVER_ACTION
,另一个用于旧式{{} 1}},在KitKat或更高版本启动时禁用。
SMS_RECEIVED_ACTION
要在KitKat及更高版本中禁用旧接收器,请使用以下代码:
<receiver android:name=".SmsReceiver"
android:permission="android.permission.BROADCAST_SMS">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_DELIVER" />
</intent-filter>
</receiver>
<receiver android:name=".OldSmsReceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
您将无法在较新版本中中止广播,因为从KitKat开始无法中止if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT)
{
ComponentName receiver = new ComponentName(context, OldSmsReceiver.class);
PackageManager pm = context.getPackageManager();
pm.setComponentEnabledSetting(receiver,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
}
广播。
(Source)
请注意 - 从Android 4.4开始 - 您的应用尝试中止
SMS_RECEIVED_ACTION
广播的任何尝试都将被忽略,因此所有感兴趣的应用都有机会接收它。
至于您使用GO短信加强版的问题,您可能无法做任何事情。在其他来源中,this post thread表明您可以通过确保在GO短信加强版之前安装您的应用来解决问题。但是,您可以从评论中看到,这不是一个有保证的解决方案。您应该建议您的用户关闭GO SMS Pro的“禁用其他消息通知”选项,这样您的应用程序至少可以接收相关的广播,即使它不能中止它们。请注意,环聊经常会导致同样的问题。