使用SMS BroadcastReceiver同时使用Kitkat和旧版本

时间:2014-07-25 15:31:11

标签: android broadcastreceiver

我正在开发一个需要接收短信的应用程序,并且不允许任何其他应用程序接收短信。

应用程序必须在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

}

1 个答案:

答案 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的“禁用其他消息通知”选项,这样您的应用程序至少可以接收相关的广播,即使它不能中止它们。请注意,环聊经常会导致同样的问题。