重启后短信广播接收器不工作

16

我正在尝试从文本消息中获取电话号码和电话簿名称。当我从应用程序运行它并关闭应用程序时,它可以正常工作,但是当我重新启动手机时,它就不起作用了。有人知道原因吗?

public class IncomingSMSReceiver extends BroadcastReceiver {
    private static final String queryString = "@zovi";
    private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";

    public void onReceive(Context _context, Intent _intent) {
        if (_intent.getAction().equals(SMS_RECEIVED)) {
            Intent intent = new Intent(_context, IncomingSMSService.class);
            _context.startService(intent);
            Bundle bundle = _intent.getExtras();
            if (bundle != null) {
                Object[] pdus = (Object[]) bundle.get("pdus");
                SmsMessage[] messages = new SmsMessage[pdus.length];
                for (int i = 0; i < pdus.length; i++)
                    messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
                for (SmsMessage message : messages) {
                    String msg = message.getMessageBody();
                    Log.i("Poruka", msg);
                    String to = message.getOriginatingAddress();
                    String contactName = TelefonUtils.getContact(_context, to);
                    Log.i("Od", contactName + "\n" + to);
                }
            }
        }
    }
}

我的XML:

<receiver android:name=".telefon.receivers.IncomingSMSReceiver"
          android:permission="android.permission.BROADCAST_SMS">
    <intent-filter android:priority="500">
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
</receiver>

1
你在重新启动设备之前退出了应用程序吗?你的设备上运行的是哪个版本的Android? - Steven Mark Ford
创建另一个接收器以接收BOOT_COMPLETE消息,并在其中注册您的消息接收器。 - Moinkhan
在Intent过滤器中添加此操作 <action android:name="android.intent.action.BOOT_COMPLETED" /> - Moinkhan
@Miljan Vulovic 如果我的回答对您有帮助,请标记为已接受。 - Rajesh Jadav
7个回答

9
在您的AndroidManifest.xml中,在IncomingSMSReceiver接收器标签下尝试添加<action android:name="android.intent.action.BOOT_COMPLETED" />动作。
要在Android系统重新启动或启动后自动启动ServicesBroadcastReceiver,可以向Android android.intent.action.BOOT_COMPLETED系统事件注册BroadcastReceiver
尝试使用以下代码。
<receiver android:name=".telefon.receivers.IncomingSMSReceiver"
 android:permission="android.permission.BROADCAST_SMS">
       <intent-filter android:priority="500">
       <action android:name="android.provider.Telephony.SMS_RECEIVED" />
       <action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>

如果您尝试过android.intent.action.BOOT_COMPLETED,但在您的情况下它不起作用,因为您忘记在您的IncomingSMSReceiver中添加BOOT_COMPLETED意图。它仅在IncomingSMSReceiver中使用了if条件时才会在android.provider.Telephony.SMS_RECEIVED的情况下起作用。因此,请更改if条件:

if (_intent.getAction().equals(SMS_RECEIVED)) {

为了

if (_intent.getAction().equals(SMS_RECEIVED) || _intent.getAction().equals(BOOT_COMPLETED)) {

还需要在 IncomingSMSReceiver 中定义 private static final String BOOT_COMPLETED = "android.intent.action.BOOT_COMPLETED";。以下是 IncomingSMSReceiver 的完整代码。

将你的 IncomingSMSReceiver 代码更改为:

public class IncomingSMSReceiver extends BroadcastReceiver {
    private static final String queryString = "@zovi";
    private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
    private static final String BOOT_COMPLETED = "android.intent.action.BOOT_COMPLETED";

    public void onReceive(Context _context, Intent _intent) {
        if (_intent.getAction().equals(SMS_RECEIVED) || _intent.getAction().equals(BOOT_COMPLETED)) {
            Intent intent = new Intent(_context, IncomingSMSService.class);
            _context.startService(intent);
            Bundle bundle = _intent.getExtras();
            if (bundle != null) {
                Object[] pdus = (Object[]) bundle.get("pdus");
                SmsMessage[] messages = new SmsMessage[pdus.length];
                for (int i = 0; i < pdus.length; i++)
                    messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
                for (SmsMessage message : messages) {
                    String msg = message.getMessageBody();
                    Log.i("Poruka", msg);
                    String to = message.getOriginatingAddress();
                    String contactName = TelefonUtils.getContact(_context, to);
                    Log.i("Od", contactName + "\n" + to);
                }
            }
        }
    }
}

当您的手机重新启动时,它会接收到 android.intent.action.BOOT_COMPLETED 并调用您的 IncomingSMSReceiver 接收器,然后启动您的 IncomingSMSService 服务。
希望这可以帮助您。

3

确保接收器在手机重启后启动。

intent-filter中添加<action android:name="android.intent.action.BOOT_COMPLETED" />


尝试在您的清单文件中添加启动完成权限,例如 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> - Alfred Woo

2

我在我的项目中使用了这个功能,从Android SMS接收监听器中找到的。

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;

import java.util.ArrayList;

/**
* @@author Chathura Wijesinghe <cdanasiri@gmail.com> 
* 
* <receiver android:name=".SMSReceiver" >
        <intent-filter>
            <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
        </intent-filter>
    </receiver>
*/
public class SMSReceiver extends BroadcastReceiver {

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

private static ArrayList<SMSReceivedListner> smsListner = new ArrayList<SMSReceivedListner>();

@Override
public void onReceive(Context context, Intent intent) {
    final String action = intent.getAction();
    final Bundle extras = intent.getExtras();


    if (action.equals(SMSReceiver.SMS_RECEIVED)) {
        final boolean smsValid = extras != null;

        if (smsValid) {
            //Create SMSMessages from PDUs in the Bundle
            final Object[] pdus = (Object[])extras.get("pdus");
            final SmsMessage[] messages = new SmsMessage[pdus.length];
            for (int i = 0; i < pdus.length; i++)
                messages[i] = SmsMessage.createFromPdu((byte[])pdus[i]);

            //Assemble
            final ArrayList<Long> vibrations = new ArrayList<Long>();

            for (SmsMessage message : messages) {
                for (SMSReceivedListner smsReceivedListner : smsListner )
                    smsReceivedListner.message(message);
            }
        }
    }
}

public static void addSMSListner(SMSReceivedListner listner){
    smsListner.add(listner);
}

public static void removeSMSListner(SMSReceivedListner listner){
    smsListner.remove(listner);
}

public interface SMSReceivedListner{
    public void message(SmsMessage message);
}
}

1
你需要从接收器声明中删除android:permission="android.permission.BROADCAST_SMS"。 不需要BOOT_COMPLETED或其他权限。

1
理想情况下,它应该能够正常运行。奇怪的是它不能工作。 从广播接收器中删除android:permission="android.permission.BROADCAST_SMS"。这不是必需的。 尝试将优先级android:priority="2147483647"增加到最大。可能是其他应用正在使用该事件,也可以尝试以下解决方案。 在意图过滤器中添加<action android:name="android.intent.action.BOOT_COMPLETED" />,看看是否有效。 类似于这样的东西:
<receiver android:name=".telefon.receivers.IncomingSMSReceiver"
          android:permission="android.permission.BROADCAST_SMS">
    <intent-filter android:priority="500">
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>

并添加权限:

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

尝试过了,不起作用。还尝试从BOOT_COMPLETED接收器中调用活动,也不起作用... - Miljan Vulovic
是的,我有一个接收器是BOOT_COMPLETED,它可以工作,只是这个传入消息不行。 - Miljan Vulovic
将优先级设置为最高。 - rupesh jain
@Miljan Vulovic 你的意思是没有活动?你没有一个活动吗?从Android 3.1+开始,你需要一个活动。这是一项安全政策。如果你有一个非root的手机,也可以尝试一下。 - KISHORE_ZE
@rupeshjain 怎样将其设置为默认短信处理程序? - Miljan Vulovic
显示剩余10条评论

1
在您的清单中,将Receiverexported明确设置为true元素。
 android:exported="true"

确保应用程序元素和接收器元素都已启用

android:enabled="true"

尝试这个,先在onReceive中作为第一行添加一个Log并查看是否被调用,如果被调用则很可能是你的代码有问题,然后我们可以深入挖掘。@VulovicVukasin - Elltz
已在每个接收器的启动处添加了日志记录。 重新启动后,所有内容都会被调用,只有短信接收器不会。 - Vulovic Vukasin

1
广播代码似乎没问题,请确保您的设备中没有使用其他短信应用程序(可能会干扰您的应用程序广播)。如果您没有使用任何其他短信应用程序,则应该可以正常工作,否则卸载该短信应用程序并重试一次。
还要检查您是否在AndroidManifest.xml中添加了以下权限。
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.WRITE_SMS" />

希望这个能够工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接