我已经写了一个用于捕捉收入短信的短信接收器,一切看起来很好,但事实并非如此
接收器收到的工作和没有短信收入。这是代码和清单内容。
我记得我已经在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);
}
}
}
}
}
答案 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。