SMS Broadcast Receiver no funciona después de reiniciar
Estoy tratando de obtener el número de teléfono y el nombre de la agenda de un mensaje de texto. Cuando lo ejecuto de la aplicación, y la aplicación de cierre, funciona, pero, cuando reinicio mi móvil, no funciona. ¿Nadie?
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); } } } } }
Mi XML:
- Content: // mms-sms / conversations / return NullPointerException en Android ICS Samsung
- Cómo obtener todos los mensajes de ThreadID en android
- ContentObserver en el contenido: // sms / in 1.6+?
- Android: documentación para el contenido: // sms / "type" values?
- ¿Abre la aplicación de Android enviando un mensaje de texto?
<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>
- Cómo desactivar mi aplicación sms como aplicación predeterminada en Android
- Manera a prueba de errores de iniciar la intención de SMS en Android
- Enviar SMS a través de la intención de múltiples números de teléfono
- Envío de SMS sin utilizar SmsManager de Android .. ¿Biblioteca nativa?
- Volver automáticamente a la anterior aplicación de SMS predeterminada
- Android - ¿Crear SMS de la API despreciada de PDU?
- ¿Cómo obtener el informe de entrega de cada SMS enviado en bucle Android?
- SMS no se puede prevenir usando abortBroadcast ()?
En tu AndroidManifest.xml
intenta agregar <action android:name="android.intent.action.BOOT_COMPLETED" />
en la etiqueta del receptor IncomingSMSReceiver
.
Para iniciar Services
o BroadcastReceiver
automáticamente después de reiniciar o iniciar el sistema Android, puede registrar un BroadcastReceiver
en el evento android.intent.action.BOOT_COMPLETED
sistema Android.
Pruebe este código.
<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>
Si ha intentado android.intent.action.BOOT_COMPLETED
entonces no funcionará en su caso porque se le olvidó agregar intención BOOT_COMPLETED
en su
IncomingSMSReceiver
y funcionará sólo en caso de android.provider.Telephony.SMS_RECEIVED
debido a si la condición que ha utilizado en IncomingSMSReceiver
. así que cambia si la condición de
if (_intent.getAction().equals(SMS_RECEIVED)) {
a
if (_intent.getAction().equals(SMS_RECEIVED) || _intent.getAction().equals(BOOT_COMPLETED)) {
y también definir private static final String BOOT_COMPLETED = "android.intent.action.BOOT_COMPLETED";
en IncomingSMSReceiver
. A continuación se muestra el código completo de IncomingSMSReceiver
.
Cambie su código IncomingSMSReceiver
a esto:
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); } } } } }
Así que cuando el teléfono se reinicie, recibirá android.intent.action.BOOT_COMPLETED
y llamará a su receptor IncomingSMSReceiver
para que inicie su IncomingSMSService
.
Espero que te ayude.
Asegúrese de que el receptor se inicia después de reiniciar el teléfono.
Añadir <action android:name="android.intent.action.BOOT_COMPLETED" />
en intent-filter
Utilicé esto en mi proyecto, encontrar esto desde Android SMS Receive Listener
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); } }
Usted tiene que quitar el androide: permission = "android.permission.BROADCAST_SMS" de la declaración del receptor. No se requiere BOOT_COMPLETED u otro permiso.
explícitamente exported
a true
en su manifiesto como un elemento para el Receiver
android:exported="true"
y asegúrese de que tanto el elemento de aplicación como el elemento receptor están habilitados
android:enabled="true"
El código de difusión parece estar bien y Asegúrese de que está utilizando otras aplicaciones de SMS en su dispositivo (Puede que esta transmisión de SMS pueda interrumpir la transmisión de sus aplicaciones). Si no está utilizando ninguna otra aplicación de SMS, entonces debería funcionar de lo contrario desinstalar esa aplicación de SMS y probar una vez.
y también comprueba que hayas añadido los siguientes permisos en tu 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" />
Espero que esto funcione.
Lo ideal sería que hubiera trabajado. Es extraño que no funciona.
Eliminar android: permission = "android.permission.BROADCAST_SMS" del receptor de difusión. No es necesario.
Intente aumentar la prioridad android:priority="2147483647"
al máximo. Puede ser que otra aplicación esté consumiendo el evento o pruebe la siguiente solución.
Agregue <action android:name="android.intent.action.BOOT_COMPLETED" />
en su filtro de intenciones y ver si funciona.
Algo como esto:
<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>
y agregar permiso:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission>
- Las incorporaciones de iframe de YouTube no pueden reproducirse automáticamente en Android
- Corregir el patrón para adquirir un WakeLock en un BroadcastReceiver y liberarlo en un servicio