短信广播接收器重启后无法正常工作

Mil*_*vic 16 service sms android broadcastreceiver

我正在尝试从短信中获取电话号码和电话簿名称.当我从应用程序运行它并关闭应用程序时,它可以工作,但是,当我重新启动我的手机时,它不起作用.任何人?

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);
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的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>
Run Code Online (Sandbox Code Playgroud)

Raj*_*esh 9

在您AndroidManifest.xml尝试<action android:name="android.intent.action.BOOT_COMPLETED" />IncomingSMSReceiver接收器标记下添加 操作.

要在Android系统重新启动或启动后启动ServicesBroadcastReceiver自动启动,您可以注册BroadcastReceiver到Android 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>
Run Code Online (Sandbox Code Playgroud)

如果你已经尝试过android.intent.action.BOOT_COMPLETED那么它将无法在你的情况下工作,因为你忘了BOOT_COMPLETED在你的意图中添加意图
IncomingSMSReceiver,它只会android.provider.Telephony.SMS_RECEIVED因为你使用过的条件而有效IncomingSMSReceiver.所以改变条件来自

if (_intent.getAction().equals(SMS_RECEIVED)) {
Run Code Online (Sandbox Code Playgroud)

if (_intent.getAction().equals(SMS_RECEIVED) || _intent.getAction().equals(BOOT_COMPLETED)) {
Run Code Online (Sandbox Code Playgroud)

并且还定义private static final String BOOT_COMPLETED = "android.intent.action.BOOT_COMPLETED";IncomingSMSReceiver.以下是完整的代码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);
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,当您的手机重新启动时,它将接收android.intent.action.BOOT_COMPLETED并呼叫您的IncomingSMSReceiver接收器然后它将启动您的IncomingSMSService.

我希望它会对你有所帮助.


rup*_*ain 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>
Run Code Online (Sandbox Code Playgroud)

并添加权限:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission>    
Run Code Online (Sandbox Code Playgroud)