Приемник SMS-вещания не работает после перезапуска

Я пытаюсь получить номер телефона и название телефонной книги из текстового сообщения. Когда я запускаю его из приложения и закрываю приложение, он работает, но когда я перезапускаю свой мобильный телефон, он не работает. Кто-нибудь?

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

В AndroidManifest.xml попробуйте добавить <action android:name="android.intent.action.BOOT_COMPLETED" /> действие в тег приемника IncomingSMSReceiver.

Чтобы запустить Services или BroadcastReceiver автоматически после перезагрузки или запуска системы Android, вы можете зарегистрировать 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>

Если вы пробовали android.intent.action.BOOT_COMPLETED, тогда это не будет работать в вашем случае, потому что вы забыли добавить BOOT_COMPLETED намерение в свой
IncomingSMSReceiver, и он будет работать только в случае android.provider.Telephony.SMS_RECEIVED из-за того, что вы использовали в IncomingSMSReceiver. поэтому измените, если условие из

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

к

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

а также определить 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);
                }
            }
        }
    }
}

Поэтому, когда ваш телефон перезапустится, он получит android.intent.action.BOOT_COMPLETED и вызовет ваш приемник IncomingSMSReceiver, после чего он запустит ваш IncomingSMSService.

Надеюсь, это поможет вам.

Ответ 2

Убедитесь, что приемник запускается после перезагрузки телефона.

Добавить <action android:name="android.intent.action.BOOT_COMPLETED" /> в intent-filter

Ответ 3

Я использовал это в своем проекте, найти это из прослушиватель SMS-сообщений для Android

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 <[email protected]> 
* 
* <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);
}
}

Ответ 4

В идеале это должно было сработать. Странно, что он не работает.

Удалите 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>    

Ответ 5

Вы должны удалить андроид: permission = "android.permission.BROADCAST_SMS" из декларации получателя. Нет BOOT_COMPLETED или другого разрешения.

Ответ 6

явно помещает exported в true в ваш манифест в качестве элемента для Receiver

 android:exported="true"

и убедитесь, что оба элемента приложения и элемент-получатель включены

android:enabled="true"

Ответ 7

Широковещательный код, похоже, в порядке и убедитесь, что вы используете любые другие приложения SMS на своем устройстве (пусть это SMS-трансляция может прерывать широковещательные передачи ваших приложений). Если вы не используете никакие другие приложения для SMS, тогда он должен работать в противном случае, не устанавливая это приложение для SMS и попробуйте один раз.

а также проверьте, что вы добавили следующие разрешения в свой 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" />

Надеюсь, что это сработает.