Android广播接收器没有接收传入的短信

时间:2013-08-02 09:08:33

标签: android broadcastreceiver

我已经写了一个用于捕捉收入短信的短信接收器,一切看起来很好,但事实并非如此 接收器收到的工作和没有短信收入。这是代码和清单内容。 我记得我已经在android 2.3写了相同的应用程序工作正常,但此代码在android 4.x运行,但运行不正常。问题是什么 ?是否取决于android 4.x的安全问题?

清单:               

<receiver android:name="SmsReceiver">
        <intent-filter android:priority="100">
            <action android:name="android.provider.telephony.SMS_RECEIVED"/>
        </intent-filter>
    </receiver>

Java代码:

 public class SmsReceiver extends BroadcastReceiver {

private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";

@Override
public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();
    Logger.i("INCOMMING SMS...");
    if (action == SMS_RECEIVED) {
        Bundle bundle = intent.getExtras();
        if (bundle != null) {
            Object[] pdus = (Object[]) bundle.get("pdus");
            final SmsMessage[] messages = new SmsMessage[pdus.length];
            for (int i = 0; i < pdus.length; i++) {
                messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
            }
            if (messages.length > -1) {
                String sendr = messages[0].getOriginatingAddress();
                Logger.i(sendr);
            }
        }
    }
}


}

2 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,我通过向清单注册的接收器添加两个动作来修复它,所以它看起来像这样:

<receiver android:name=".SmsReceiver">
    <intent-filter android:priority="100">
    <action android:name="android.intent.action.PHONE_STATE"/>
        <action android:name="android.provider.telephony.SMS_RECEIVED"/>
        <action android:name="com.your.package.android.action.broadcast"/>
    </intent-filter>
  </receiver>

还添加权限:

 <uses-permission android:name="android.permission.RECEIVE_SMS" />

对于字符串的比较,不要使用equals运算符,而是使用equals方法。(注意:equalsIgnoreCase()应该更适合你。)

所以它会像:

if(SMS_RECEIVED.equalsIgnoreCase(action))
{
//continue
}

希望它有所帮助。

答案 1 :(得分:0)

我和你有同样的问题,经过网上的大量研究后,我发现了问题。您的应用程序未启动且模拟器控件未发送选项 - include-stopped-packages ,因为adb命令可以执行此操作。这是Android 3.x引入的功能。

因此,您的接收器永远不会收到广播,因为您的应用程序未启动。 要首先启动它,请从系统中打开控制台,然后键入以下命令:

*adb -e shell am broadcast -a android.provider.Telephony.SMS_RECEIVED --include-stopped-packages*

您的BroadcastReceveiver会收到空的短信。

执行此命令后,您的进程将显示在“设备”视图中,您可以从模拟器控件发送SMS。