SecurityException: SubscriptionManager – Ancak izinleri beyan ettim

java.lang.SecurityException with SubscriptionManager – But I declared the permissions!..

Aman! Bu, Android’de alnınızı tokatladığınız zamanlardan biri, ne gibi!

Bu, SubscriptionManager.addOnSubscriptionChangedListener kullanımına ilişkin resmi belgedir.

Aktif listedeki değişiklikler için kaydolun SubscriptionInfo kayıtlara veya bireysel kayıtların kendilerine. Bir değişiklik meydana geldiğinde, bir bildirim olması durumunda dinleyicinin onSubscriptionsChanged yöntemi derhal çağrılır. onSubscriptionChanged yöntemi de bu işlev çağrılırken başlangıçta bir kez tetiklenir.

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

Herhangi bir Android izninin gerekli olduğunu iddia etmez. Ancak bunu okuyorsanız, Crashlytics veya PlayStore raporlarınızda muhtemelen benimle aynı yığın izini görmüşsünüzdür.

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)

Hımm neler oluyor! Görünüşe göre geri arama şu şekilde kullanılıyor:

SubscriptionInfo kayıtlarındaki değişiklikleri izlemek için bir dinleyici sınıfı.

Ama aslında size vermiyor SubscriptionInfo nesne. Ancak başka bir yöntem şunları yapar: getActiveSubscriptionInfo

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

Ve bu yöntemin bir Android izni gerektirdiğine bakın:

SubId girişi ile aktif SubscriptionInfo’yu alın.

İzin Gerektirir: READ_PHONE_STATE veya arayan uygulamanın operatör ayrıcalıklarına sahip olduğunu (bkz. TelephonyManager#hasCarrierPrivileges).
Gereklilikler Manifest.permission.READ_PHONE_STATE

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

Bu yüzden atladığım ilk sonuç, Huawei (ve AOSP sürümünü de satan satıcılar) uygulamalarını biraz değiştirdi ve bu dinleyici izin gerektiren hale geldi.

Bunun olduğunu daha önce görmüştüm, tamamen mümkün, ama 2020’de olur mu? imkanı yok. Yani biraz daha kazma ve belgelerin okunmasıyla gerçek Dinleyici, buldum!

#onSubscriptionsChanged’ın çağrılması için izinler android.Manifest.permission.READ_PHONE_STATE gereklidir.

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

Değiştirilmiş bir dinleyici eklemek için Güvenlik İznine ihtiyacınız yoktur, ama izne ihtiyacın var dinleyicinizin çağrılması için. Ovmak budur.

Uygulama başladığında dinleyiciyi ayarladığımız, ancak özellik gerekli olana kadar izin istemediğimiz için bununla karşılaştık (en iyi UX uygulaması). Seçmemiz gereken pratik çözümler, uygulama başladığında izni kontrol etmek veya dinleyiciyi yalnızca kullanıcı izin verdiğinde dinlemeye başlayacak şekilde taşımaktı.

Mutlu Androidler! Ve her zaman RTFM’yi unutmayın.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.