Android BroadcastReceiver在启动完成后不工作

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="

我正在尝试在启动完成后立即拦截传入的SMS,但我在这一行中遇到了NullPointerException问题:

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>