2017-09-13 2 views
2

J'ai une application qui a essentiellement deux récepteurs, un qui reçoit des messages SMS et un qui reçoit des messages MMS. Lorsque l'application fonctionne, elle fonctionne parfaitement, les messages sont reçus et les récepteurs fonctionnent tous les deux. Lorsqu'ils ne sont pas en cours d'exécution, les récepteurs de l'application ne sont pas appelés.L'application ne répond pas à un message SMS reçu, sauf si l'application est en cours d'exécution.

Voici le code de base dans le SMSReceiver:

@Override 
public void onReceive(Context context, Intent intent) { 
    this.context = context; 
    Log.i(TAG, "Intent received: " + intent.getAction()); 
    Toast.makeText(context,"Message Received SMS",Toast.LENGTH_LONG).show(); 
} 

autorisations Manifest tous là et correcte. Exécution d'un Samsung S7 Edge Android 7.0 (Android 24). Il devrait recevoir les textes quoi qu'il arrive, même s'ils ne sont pas en cours d'exécution ou en arrière-plan.

Manifest:

<uses-permission android:name="android.permission.RECEIVE_MMS"/> 
    <uses-permission android:name="android.permission.RECEIVE_SMS"/> 
    <receiver android:name="com.webnation.text2email.receivers.SMSBroadcastReceiver"> 
     <intent-filter android:priority="2147483647"> 
      <action android:name="android.provider.Telephony.SMS_RECEIVED"/> 
     </intent-filter> 
    </receiver> 
    <receiver android:name="com.webnation.text2email.receivers.MMSBroadcastReceiver" > 
     <intent-filter> 
      <action android:name="android.provider.Telephony.WAP_PUSH_RECEIVED" /> 

      <data android:mimeType="application/vnd.wap.mms-message" /> 
     </intent-filter> 
    </receiver> 
+0

Il vous manque probablement l'attribut '' '' '' exporté''' dans le manifeste – ahasbini

Répondre

0

Vous devez utiliser un Service et passer le intent sur lui au lieu de le manipuler avec onReceive(). Le paramètre context du onReceive() ne peut pas non plus être utilisé pour effectuer des actions d'interface utilisateur, mais il peut être utilisé pour démarrer un Activity ou un Service.

Voici un exemple de la façon dont la mise en œuvre sera pour le onReceive():

@Override 
public void onReceive(Context context, Intent intent) { 
    if (intent.getAction().equals(Telephony.Sms.Intents.SMS_RECEIVED_ACTION)) { 
     Logger.LogI(TAG, "onReceive: received sms"); 
     Intent serviceIntent = new Intent(intent); 
     serviceIntent.setClassName(context, SmsParserService.class.getCanonicalName()); 
     context.startService(serviceIntent); 
    } 
} 

Et voici un exemple pour la mise en œuvre du SmsParserService:

/** 
* Service for parsing the SMS and retrieving the message 
*/ 
public class SmsParserService extends IntentService { 

    private static final String TAG = SmsParserService.class.getSimpleName(); 

    public SmsParserService() { 
     this("SmsParserService"); 
    } 

    /** 
    * Creates an IntentService. Invoked by your subclass's constructor. 
    * 
    * @param name Used to name the worker thread, important only for debugging. 
    */ 
    public SmsParserService(String name) { 
     super(name); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     Bundle extras = intent.getExtras(); 

     if (extras != null) { 
      Object[] objects = (Object[]) extras.get("pdus"); 

      if (objects != null) { 
       for (Object object : objects) { 
        SmsMessage smsMessage; 
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) { 
         smsMessage = SmsMessage.createFromPdu((byte[]) object, extras.getString("format")); 
        } else { 
         smsMessage = SmsMessage.createFromPdu((byte[]) object); 
        } 

        String message = smsMessage.getMessageBody(); 
       } 
      } 
     } 
    } 
} 

Et dans le AndroidManifest.xml:

<receiver 
    android:name=".services.SmsReceiver" 
    android:enabled="true" 
    android:exported="true" 
    android:permission="android.permission.BROADCAST_SMS"> 
    <intent-filter> 
     <action android:name="android.provider.Telephony.SMS_RECEIVED"/> 
    </intent-filter> 
</receiver> 

<service 
    android:name=".services.SmsParserService" 
    android:enabled="true" 
    android:exported="false"> 
</service> 

Rappelez-vous aussi à Service est un processus d'arrière-plan, ce qui signifie que certains éléments d'interface utilisateur (tels que Dialog et Toast) peuvent ne pas fonctionner correctement. Au lieu de cela, vous devriez utiliser un Activity pour de tels cas.

+0

Il n'appelle même jamais onReceive(), donc votre suggestion ne sera même pas appelée. Le Toast n'est jamais affiché. En outre, avec Oreo, l'exécution de tâches dans un service n'est peut-être pas la meilleure solution. https://medium.com/exploring-android/exploring-background-execution-limits-on-android-oreo-ab384762a66c –

+0

J'ai mis à jour la réponse avec les entrées '' 'AndroidManifest.xml'''. Vous ne recevez probablement pas les entrées que vous utilisez. Si '' 'Service''' ne vous convient pas parce que vous devez supporter Android Oreo, je crois que vous devriez utiliser le' '' 'Activity''', mais je n'ai pas essayé de démarrer' '' Service''' à partir de '' '' Receiver''' dans Oreo et aussi l'article ne mentionne rien à ce sujet – ahasbini

+0

Étiez-vous en mesure de comprendre celui-ci? – ahasbini