web-dev-qa-db-fra.com

Oreo BroadcastReceiver SMS Reçu ne fonctionne pas

Une application sur laquelle je travaille permet à l'utilisateur de lui permettre de lire le contenu d'une confirmation SMS afin de saisir lui-même le code de vérification. Pour tous les périphériques utilisant un système d'exploitation antérieur à Oreo (API 26), la mise en œuvre de BroadcastReceiver fonctionne correctement et permet une réception correcte du SMS. Par cette implémentation, je veux dire placer l'objet récepteur dans le Manifeste Android.

<receiver Android:name=".SmsReceiver">
        <intent-filter>
            <action Android:name="Android.provider.Telephony.SMS_RECEIVED"/>
        </intent-filter>
</receiver>

Cependant, en commençant par Oreo, il faut explicitement enregistrer BroadcastReceivers dans le contexte approprié. J'ai implémenté ceci comme suit:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            smsReceiver = new SmsReceiver();
            IntentFilter intentFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
            intentFilter.addAction(Telephony.Sms.Intents.DATA_SMS_RECEIVED_ACTION);
            this.registerReceiver(smsReceiver, intentFilter);
        }

Ce bloc de code est exécuté lors de la réception de l'autorisation pour Manifest.permission.READ_SMS. La classe SmsReceiver étend BroadcastReceiver et remplace sa méthode onReceive ().

Ici, j'ai plusieurs questions:

  1. J'ai testé cette implémentation et défini des points d'arrêt sur ma méthode onReceive () dans SmsReceiver. Lorsqu'un SMS arrive, l'application n'entre jamais dans la méthode onReceive (). Pourquoi cela peut-il être?

  2. J'ai instancié mon IntentFilter de la manière décrite sur le site Web du développeur Android, c'est-à-dire avec l'action ConnectivityManager.CONNECTIVITY_ACTION. Je sais que SmsReceiver fonctionne, car le point d'arrêt de onReceive () est toujours atteint lors de l'enregistrement du destinataire. Cependant, l'action est simplement le CONNECTIVITY_ACTION. SMS_RECEIVED_ACTION n'est jamais intercepté par le destinataire. Est-il absolument nécessaire d'instancier IntentFilter avec cette action ou peut-on l'omettre?

  3. Y a-t-il autre chose qui me manque qui pourrait empêcher mon destinataire de recevoir le SMS qui arrive?

6
oldsport76

Auparavant, je demandais pour -Manifest.permission.READ_SMS qui ne fonctionnait pas, puis j'ai modifié les autorisations en - Manifest.permission.RECEIVE_SMS, puis il a commencé à fonctionner dans oreo et j'ai également spécifié le destinataire dans le manifeste. Je ne sais pas si cela a aidé. ou pas mais cela fait le jour pour moi

   public static void requestPermissionForReadSMS(Fragment fragment) {
    //        if (fragment.shouldShowRequestPermissionRationale(Manifest.permission.READ_SMS)) {
    //            Helpers.showRequestPermissionAlertDialog(fragment, fragment.getString(R.string.read_sms_permission), fragment.getString(R.string.permission_request));

    //        } else {
            fragment.requestPermissions(new String[]{Manifest.permission.RECEIVE_SMS},
                    Constants.READ_SMS_PERMISSION);
   // }

        }
10
Rohit Sharma

Pour moi ça marche:

private int MY_PERMISSIONS_REQUEST_SMS_RECEIVE = 10;
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.RECEIVE_SMS},
        MY_PERMISSIONS_REQUEST_SMS_RECEIVE);

Mentionnez que le code ci-dessus dans votre activité principale après autorisation accordée . Après cela, remplacez ceci:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] 
            permissions, @NonNull int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            if (requestCode == MY_PERMISSIONS_REQUEST_SMS_RECEIVE) {
                Log.d("TAG", "My permission request sms received successfully");
            }
 }

c'est tout. Alors maintenant, plus besoin d'activer et de désactiver manuellement l'autorisation SMS après quelques secondes.

4
Prantik Mondal

Activer et désactiver la permission SMS après quelques secondes manuellement et cela a fonctionné.

3
Pranav Wani

La réponse donnée par @rohit sharma a d'abord fonctionné pour moi, mais j'ai aussi testé mon application sur divers appareils tels que oneplus, mi, oppo et vivo, et j'ai constaté que 

1.On vivo, oppo et mi (ayant miui) il existe quelque chose appelé autostart qui est désactivé par défaut de sorte que SMS_RECIEVED_ACTION ne fonctionne pas (ici, par travail, je veux dire lancer l'application ou exécuter un service en arrière-plan sur sms_recieved) même en liste blanche de la liste des interdictions implicites récentes données.

2. Sur les appareils oneplus, la fonction d'optimisation de la batterie est disponible et si votre application est répertoriée pour l'optimisation de la batterie (oui par défaut), SMS_RECIEVED_ACTION ne fonctionnera que si votre application est à l'avant-plan ou à l'arrière-plan, si votre application est supprimée ou après un téléphone. redémarrer le récepteur de diffusion ne fonctionnera pas. Pour que SMS_RECIEVD_ACTION fonctionne, vous devez supprimer l'application des optimisations de batterie. Pour plus d'informations à ce sujet, suivez ce fil ici

2
shashank chandak

Il suffit d'ajouter 

Android:permission="Android.permission.BROADCAST_SMS"

à l'étiquette du destinataire dans Manifest.

Récepteur de diffusion inscrit manifeste idéal: -

<receiver Android:name=".receivers.SMSBroadCastReceiver"
        Android:exported="true"
        Android:permission="Android.permission.BROADCAST_SMS">
        <intent-filter
            Android:priority="2147483647">
            <action Android:name="Android.provider.Telephony.SMS_RECEIVED" />
        </intent-filter>
    </receiver>
2
Santanu Sur