Теперь я вижу, что в Lollipop (API 21) даже при использовании такой мягкой функции, как SmsManager.getDefault().divideMessage(String)
, требуется разрешение READ_PHONE_STATE
.Я уверен, что раньше это не требовалось и что это проблема ОС, поскольку я тестировал ее на устройствах Nexus 5 до и после обновления до Lollipop.Раньше, при запуске KitKat, SMS работала просто отлично без разрешения READ_PHONE_STATE
.А после этого это было необходимо.
Причина в том, что, я думаю, функции телефонии пытаются принимать мудрые решения обо всем.Так что простая задача, такая как разделение SMS (даже не отправка), проходит до SmsManager
, чтобы запросить его о состоянии телефона.
Я думаю, что это ошибка дизайна.И, как вы сказали выше, это может и должно пугать пользователей.С какой стати у них так много неоднозначных разрешений на Android?
Это моя трассировка стека, просто для удовольствия:
java.lang.SecurityException: Requires READ_PHONE_STATE: Neither user 10078 nor current process has android.permission.READ_PHONE_STATE.
at android.os.Parcel.readException(Parcel.java:1540)
at android.os.Parcel.readException(Parcel.java:1493)
at com.android.internal.telephony.IPhoneSubInfo$Stub$Proxy.getGroupIdLevel1(IPhoneSubInfo.java:465)
at android.telephony.TelephonyManager.getGroupIdLevel1(TelephonyManager.java:1666)
at android.telephony.SmsMessage.hasEmsSupport(SmsMessage.java:776)
at com.android.internal.telephony.gsm.SmsMessage.calculateLength(SmsMessage.java:808)
at android.telephony.SmsMessage.fragmentText(SmsMessage.java:322)
at android.telephony.SmsManager.divideMessage(SmsManager.java:328)
at mobi.chatfish.utils.CFCommunications.sendSMSDirect(CFCommunications.java:138)