SecurityException: SubscriptionManager – Aber ich deklariere Berechtigungen

Oh mein! Dies ist eine dieser Zeiten mit Android, wo Sie sich einfach auf die Stirn schlagen, wie was!

Dies ist die offizielle Dokumentation zur Verwendung von SubscriptionManager.addOnSubscriptionChangedListener

Registrieren Sie sich für aktive Listenänderungen SubscriptionInfo Aufzeichnungen oder die einzelnen Aufzeichnungen selbst. Wenn eine Änderung auftritt, wird die Listener-Methode onSubscriptionsChanged sofort nach der Benachrichtigung aufgerufen. Zu Beginn dieses Funktionsaufrufs wird auch einmalig die Methode onSubscriptionChanged ausgelöst.

https://developer.android.com/reference/android/telephony/SubscriptionManager#addOnSubscriptionsChangedListener(android.telephony.SubscriptionManager.OnSubscriptionsChangedListener)

Es erhebt nicht den Anspruch, eine Android-Erlaubnis zu benötigen. Aber wenn Sie dies lesen, haben Sie wahrscheinlich denselben Stacktrace gesehen wie ich in Ihren Crashlytics- oder PlayStore-Berichten.

java.lang.RuntimeException: 
  at android.app.ActivityThread.handleBindApplication (ActivityThread.java:6654)
  at android.app.ActivityThread.-wrap2 (Unknown Source)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:2084)
  at android.os.Handler.dispatchMessage (Handler.java:109)
  at android.os.Looper.loop (Looper.java:166)
  at android.app.ActivityThread.main (ActivityThread.java:7555)
  at java.lang.reflect.Method.invoke (Method.java)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:469)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:963)
Caused by: java.lang.SecurityException: 
  at android.os.Parcel.readException (Parcel.java:2016)
  at android.os.Parcel.readException (Parcel.java:1962)
  at com.android.internal.telephony.ITelephonyRegistry$Stub$Proxy.addOnSubscriptionsChangedListener (ITelephonyRegistry.java:491)
  at android.telephony.SubscriptionManager.addOnSubscriptionsChangedListener (SubscriptionManager.java:518)

Hmm was ist passiert! Idealerweise wird der Rückruf so beschrieben, dass er verwendet wird von:

Eine Listener-Klasse zum Überwachen von Änderungen an SubscriptionInfo-Datensätzen.

Aber es gibt dir nicht die Wahrheit SubscriptionInfo Taste. Es gibt jedoch einen anderen Ansatz: getActiveSubscriptionInfo

https://developer.android.com/reference/android/telephony/SubscriptionManager#getActiveSubscriptionInfo(int)

Und siehe, diese Methode erfordert eine Android-Berechtigung:

Rufen Sie die aktive SubscriptionInfo mithilfe der eingegebenen subId ab.

Genehmigung erforderlich: READ_PHONE_STATE oder dass die anrufende App Betreiberrechte hat (siehe TelephonyManager#hasCarrierPrivileges).
müssen Manifest.permission.READ_PHONE_STATE

https://developer.android.com/reference/android/telephony/SubscriptionManager#getActiveSubscriptionInfo(int)

Die erste Schlussfolgerung, zu der ich kam, war also, dass Huawei (und die Anbieter, die auch die AOSP-Version verkauft haben) ihre Implementierung leicht modifiziert haben und dieser Listener genehmigt werden muss.

Ich habe das schon einmal gesehen, es könnte möglich sein, aber kommt 2020? es gibt keine Möglichkeit. Also mit ein wenig Graben und Lesen der Dokumentation aus eigentlich Zuhörer, ich habe es gefunden!

Android.Manifest.permission.READ_PHONE_STATE-Berechtigungen sind erforderlich, damit #onSubscriptionsChanged aufgerufen werden kann.

https://developer.android.com/reference/android/telephony/SubscriptionManager.OnSubscriptionsChangedListener

Sie benötigen keine Sicherheitserlaubnis, um einen modifizierten Listener hinzuzufügen, aber du brauchst eine erlaubnis um Ihr Publikum anzurufen. Das ist der Haken.

Wir haben dies gefunden, weil wir den Listener so eingestellt haben, dass er die App startet, aber nicht um Erlaubnis fragt, bis die Funktion benötigt wird (beste UX-Praxis). Die praktischen Lösungen, die wir wählen müssen, bestehen darin, die Berechtigung zum Starten der App zu überprüfen oder den Zuhörer dazu zu bringen, nur mit dem Zuhören zu beginnen, wenn der Benutzer die Erlaubnis erteilt.

Viel Spaß beim Androiden! Und denken Sie immer an RTFM.

Leave a Reply

Your email address will not be published. Required fields are marked *