Приемник 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" />
Надеюсь, что это сработает.