1

我写了一个接收短信收入的短信接收器,一切看起来都很好,但它不起作用,接收器没有收到短信收入。这是代码和清单内容。我记得我有同样的应用程序写得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);
            }
        }
    }
}


}
4

2 回答 2

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
}

希望能帮助到你。

于 2013-08-02T09:25:15.167 回答
0

我和你有同样的问题,在网上查了很多资料后,我发现了问题。您的应用程序未启动,并且 Emulator Control 不会发送选项--include-stopped-packages,因为 adb 命令可以执行此操作。这是 Android 3.x 引入的一项功能。

因此,您的接收器永远不会收到广播,因为您的应用程序没有启动。首先,从您的系统中打开一个控制台并输入以下命令:

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

您的 BroadcastReceiver 收到一条空短信。

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

于 2013-10-27T22:24:52.947 回答