2016-03-13 7 views
6

Nachdem ich mehrere Ressourcen und Fragen durchgespielt habe, habe ich immer noch ein Problem mit der Erkennung einer eingehenden SMS-Nachricht.BroadcastReceiver SMS_Received funktioniert nicht auf neuen Geräten

Der folgende Code zeigt die Grundlagen:

Rundfunkempfänger-Klasse, die Toast zeigt OnReceive

public class IncomingSms extends BroadcastReceiver { 
    public void onReceive(Context context, Intent intent) { 
     Toast.makeText(context, "something received", Toast.LENGTH_SHORT).show(); 
    } 
} 

Einfach Manifest mit

<application 
    <receiver 
     android:name=".IncomingSms" 
     android:permission="android.permission.BROADCAST_SMS" 
     android:exported="true"> 

     <intent-filter android:priority="2147483647" > 
      <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
     </intent-filter> 
    </receiver> 

</application> 

<uses-permission android:name="android.permission.RECEIVE_SMS" /> 
<uses-permission android:name="android.permission.READ_SMS" /> 
<uses-permission android:name="android.permission.SEND_SMS" /> 

Der obige Code Empfänger und Berechtigungen Registrierung erklärt und registriert den Empfänger und hat prope r Berechtigungen. Darüber hinaus ist die Priorität auf MAX_INT oder 2147483647 festgelegt.

Mein Gerät ist Nexus 6P, mit Standard-Messenger-App installiert (ich habe auch Hangouts probiert). Die App zeigt meine Toasts immer noch nicht an. Nach dem Anprobieren eines älteren Samsung-Geräts wurden die Toasts ordnungsgemäß gedruckt.

Priority Ausgabe

ich auf der 6P eine App namens installiert Manifest-Viewer, die ich die manifest.xml von Anwendungen auf dem Gerät installiert sehen kann. Ich überprüfte die Manifeste von Messenger und Hangouts für den Empfänger des SMS-Tags und stellte fest, dass beide auch eine Priorität von 2147483647 angeben. Es scheint, als ob beide Messenger-Apps die Priorität maximal ausschöpfen, und sobald sie die Nachricht konsumieren Andere Anwendungen dürfen nicht eingreifen. Beachten Sie, dass es sich um Google-Apps handelt und nicht um Drittanbieter.

An diesem Punkt bin ich ganz verwirrt,:

  • warum sollten sie das tun?
  • wie umgehen?

Vielen Dank

Antwort

13

Okay, das Problem wurde behoben. Das Problem lag nicht in den Prioritäten, aber mein Telefon ist ein Nexus 6P (a.k.a. API 23).

Die Bereitstellung von Berechtigungen in der manifest.xml allein war nicht genug und ich musste Code für die Laufzeitberechtigungsanforderung hinzufügen.Siehe Android documentation for runtime permissions

diesen Code in Ihre MainActiviy:

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

diese Definition an der Spitze der MainActivity Klasse:

private int MY_PERMISSIONS_REQUEST_SMS_RECEIVE = 10; 

Und fügen ebenfalls diese Überschreibung:

@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
    super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    if (requestCode == MY_PERMISSIONS_REQUEST_SMS_RECEIVE) { 
     // YES!! 
     Log.i("TAG", "MY_PERMISSIONS_REQUEST_SMS_RECEIVE --> YES"); 
    } 
} 
+0

Auch Nexus 6P. Danke, was ich brauchte! Danke – RJB

+2

Danke, toller Beitrag, sehr hilfreich. Ich habe zwar den Eindruck, dass das Problem eher mit der API-Stufe 23 und nicht mit dem Nexus-Gerät zu tun hat. Und vielleicht solltest du beachten, dass die letzte Überschreibung nicht wirklich erforderlich ist, nur für Code-Copy-Zombies wie mich da draußen ;-) – anhoppe

0

Bitte stellen Sie sicher, dass Ihre Implementierung so ist.

SMS-Empfänger Klasse

public class SmsReceiver extends BroadcastReceiver { 

     private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED"; 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      if (intent.getAction().equals(SMS_RECEIVED)) { 
       Bundle bundle = intent.getExtras(); 
       if (bundle != null) { 
        // get sms objects 
        Object[] pdus = (Object[]) bundle.get("pdus"); 
        if (pdus.length == 0) { 
         return; 
        } 
        // large message might be broken into many 
        SmsMessage[] messages = new SmsMessage[pdus.length]; 
        StringBuilder sb = new StringBuilder(); 
        for (int i = 0; i < pdus.length; i++) { 
         messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); 
         sb.append(messages[i].getMessageBody()); 
        } 
        String sender = messages[0].getOriginatingAddress(); 
        String message = sb.toString(); 
        Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); 
        // prevent any other broadcast receivers from receiving broadcast 
        // abortBroadcast(); 
       } 
      } 
     } 
    } 

Manifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.smsreceiver" 
    android:versionCode="1" 
    android:versionName="1.0"> 
    <uses-sdk android:minSdkVersion="4" /> 
    <uses-permission android:name="android.permission.RECEIVE_SMS" /> 
    <application android:icon="@drawable/icon" android:label="@string/app_name"> 
     <activity 
      // your activity 
     </activity> 
     <receiver android:name="com.example.smsreceiver.SmsReceiver" android:enabled="true"> 
      <intent-filter android:priority="2147483647"> 
       <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
      </intent-filter> 
     </receiver> 
    </application> 
</manifest> 

Stellen Sie sicher, Ihr eigenes definierten Paket verwenden. Das hier definierte Paket ist dummy.

+0

würde ich Ich möchte zuerst sicherstellen, dass ich irgendetwas in "onReceive" feststelle, bevor ich mich einer detaillierteren Implementierung zuwende . Ich habe Ihre Schnipsel nur zur Bestätigung ausprobiert, und es gibt immer noch keine Ausgabe. Ich glaube immer noch, dass es mit der Priorität der Nexus Stock Apps zu tun hat. – Khorkhe

+0

Überprüfen Sie dieses Tutorial, wenn es Ihnen helfen kann. http://androidexample.com/Incomming_SMS_Broadcast_Receiver_-_Android_Example/index.php?view=article_discription&aid=62&aaid=87 –

+0

ahh leider habe ich diese Ressource bereits versucht ... – Khorkhe