Android BroadcastReceiver在启动完成后不工作
我正在尝试在启动完成后立即拦截传入的SMS,但我在这一行中遇到了NullPointerException问题:Android BroadcastReceiver在启动完成后不工作,android,sms,broadcastreceiver,Android,Sms,Broadcastreceiver,我正在尝试在启动完成后立即拦截传入的SMS,但我在这一行中遇到了NullPointerException问题: Object[] rawMsgs=(Object[])intent.getExtras().get("pdus"); <uses-permission android:name="android.permission.SEND_SMS"></uses-permission> <uses-permission android:name="
Object[] rawMsgs=(Object[])intent.getExtras().get("pdus");
<uses-permission android:name="android.permission.SEND_SMS"></uses-permission>
<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses- permission>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<application android:icon="@drawable/icon" android:label="@string/app_name" android:theme="@android:style/Theme.NoTitleBar">
<receiver android:name=".SMSReceiver"
android:permission="android.permission.BROADCAST_SMS"
>
<intent-filter android:priority="1000">
<action android:name="android.provider.Telephony.SMS_RECEIVED"></action>
<action android:name="android.intent.action.BOOT_COMPLETED"></action>
</intent-filter>
</receiver>
</application>
这是我的舱单:
<uses-permission android:name="android.permission.SEND_SMS"></uses-permission>
<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses- permission>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<application android:icon="@drawable/icon" android:label="@string/app_name" android:theme="@android:style/Theme.NoTitleBar">
<receiver android:name=".SMSReceiver"
android:permission="android.permission.BROADCAST_SMS"
>
<intent-filter android:priority="1000">
<action android:name="android.provider.Telephony.SMS_RECEIVED"></action>
<action android:name="android.intent.action.BOOT_COMPLETED"></action>
</intent-filter>
</receiver>
</application>
谢谢。这里的问题是,您的BroadcastReceiver实现已映射到两个意图-
android.provider.Telephony.SMS\u RECEIVED
和android.intent.action.BOOT\u已完成
——但在onReceive实现中,您没有检查正在处理的意图
<uses-permission android:name="android.permission.SEND_SMS"></uses-permission>
<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses- permission>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<application android:icon="@drawable/icon" android:label="@string/app_name" android:theme="@android:style/Theme.NoTitleBar">
<receiver android:name=".SMSReceiver"
android:permission="android.permission.BROADCAST_SMS"
>
<intent-filter android:priority="1000">
<action android:name="android.provider.Telephony.SMS_RECEIVED"></action>
<action android:name="android.intent.action.BOOT_COMPLETED"></action>
</intent-filter>
</receiver>
</application>
我的猜测是,android.intent.action.BOOT\u COMPLETED
已经收到,并且intent.getExtras()
返回空值。您可以通过向该方法添加一些日志并观察logcat窗口(如果您使用的是Eclipse)来确认这一点
<uses-permission android:name="android.permission.SEND_SMS"></uses-permission>
<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses- permission>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<application android:icon="@drawable/icon" android:label="@string/app_name" android:theme="@android:style/Theme.NoTitleBar">
<receiver android:name=".SMSReceiver"
android:permission="android.permission.BROADCAST_SMS"
>
<intent-filter android:priority="1000">
<action android:name="android.provider.Telephony.SMS_RECEIVED"></action>
<action android:name="android.intent.action.BOOT_COMPLETED"></action>
</intent-filter>
</receiver>
</application>
如果您编写了一个服务或广播接收器,并将其映射到多个意图,那么检查已接收到的意图并对其进行适当处理是一种良好的做法,这是必不可少的。就我个人而言,我会选择这样的方式:
<uses-permission android:name="android.permission.SEND_SMS"></uses-permission>
<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses- permission>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<application android:icon="@drawable/icon" android:label="@string/app_name" android:theme="@android:style/Theme.NoTitleBar">
<receiver android:name=".SMSReceiver"
android:permission="android.permission.BROADCAST_SMS"
>
<intent-filter android:priority="1000">
<action android:name="android.provider.Telephony.SMS_RECEIVED"></action>
<action android:name="android.intent.action.BOOT_COMPLETED"></action>
</intent-filter>
</receiver>
</application>
if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {
// boot-related processing here
}
else if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) {
// SMS-related processing here
}
else {
// intent not handled - log as a warning as you've registered to receive it
}
您不能假设故障安全行为。为清晰起见,将意图处理逻辑移动到单独的方法中:
<uses-permission android:name="android.permission.SEND_SMS"></uses-permission>
<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses- permission>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<application android:icon="@drawable/icon" android:label="@string/app_name" android:theme="@android:style/Theme.NoTitleBar">
<receiver android:name=".SMSReceiver"
android:permission="android.permission.BROADCAST_SMS"
>
<intent-filter android:priority="1000">
<action android:name="android.provider.Telephony.SMS_RECEIVED"></action>
<action android:name="android.intent.action.BOOT_COMPLETED"></action>
</intent-filter>
</receiver>
</application>
if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {
processBootCompletedIntent(intent);
}
else if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) {
processSmsReceivedIntent(intent);
}
else {
// intent not handled - log as a warning as you've registered to receive it
}
PS-大多数(如果不是全部)“本机”意图操作字符串作为常量保存在相关类中。例如,android.intent.action.BOOT_COMPLETED被定义为intent.action_BOOT_COMPLETED。在存在常量的地方使用这些常量,这样可以避免您输入错误。谢谢,我们将尝试查看它的运行情况。另外,请优先考虑999。@Phil,所以您建议使用“Intent.ACTION\u BOOT\u COMPLETED”作为常量,而不是“android.Intent.ACTION.BOOT\u COMPLETED”?
<uses-permission android:name="android.permission.SEND_SMS"></uses-permission>
<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses- permission>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<application android:icon="@drawable/icon" android:label="@string/app_name" android:theme="@android:style/Theme.NoTitleBar">
<receiver android:name=".SMSReceiver"
android:permission="android.permission.BROADCAST_SMS"
>
<intent-filter android:priority="1000">
<action android:name="android.provider.Telephony.SMS_RECEIVED"></action>
<action android:name="android.intent.action.BOOT_COMPLETED"></action>
</intent-filter>
</receiver>
</application>