Почему для sendTextMessage требуется разрешение READ_PHONE_STATE? - PullRequest
10 голосов
/ 05 января 2011

Мое приложение отправило домой эту трассировку стека, которая выглядит так, как будто что-то очень плохое происходит под капотом.

phone_model = SKY IM-A630K, android_version = 2.1-обновление1

java.lang.SecurityException: Requires READ_PHONE_STATE: Neither user 10089 nor current process has android.permission.READ_PHONE_STATE.

   at android.os.Parcel.readException(Parcel.java:1218)
   at android.os.Parcel.readException(Parcel.java:1206)
   at com.android.internal.telephony.IPhoneSubInfo$Stub$Proxy.getLine1Number(IPhoneSubInfo.java:223)
   at android.telephony.TelephonyManager.getLine1Number(TelephonyManager.java:764)
   at android.telephony.SmsManager.sendTextMessage(SmsManager.java:129)
   at android.telephony.SmsManager.sendTextMessage(SmsManager.java:108)
   at com.emergency.button.SMSSender.safeSendSMS(SMSSender.java:91)
   at com.emergency.button.EmergencyActivity$EmergencyThread.sendSMS(EmergencyActivity.java:294)
   at com.emergency.button.EmergencyActivity$EmergencyThread.sendMessages(EmergencyActivity.java:386)
   at com.emergency.button.EmergencyActivity$EmergencyThread.run(EmergencyActivity.java:266)

Так я должен просто поймать все исключения вокруг sendTextMessage? Кто виноват в этом?

Ответы [ 3 ]

9 голосов
/ 04 декабря 2014

Теперь я вижу, что в 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)
2 голосов
/ 05 января 2011

Мое приложение отправило домой эту трассировку стека, которая выглядит так, как будто что-то очень плохое происходит под капотом.

То, как вы это говорите, я предполагаю, что вы впервые сталкиваетесь с этой проблемой, и это не происходит на других телефонах.

Возможно ли, что в реализации Android на этой модели телефона SmsManager пытается проверить «состояние» телефона перед попыткой отправить SMS-сообщение. Это всего лишь предположение, но это не кажется неразумным, хотя в документах по Telephony API для SMS Manager об этом не говорится. Может быть нет, я не уверен.

Поскольку отправка SMS-сообщения очень важна для вашего приложения, тогда да, вы, безусловно, должны делать все возможное, чтобы перехватить любые исключения, возможно связанные с отправкой сообщений (и, если возможно, восстановлением из состояния исключения).

Поскольку эта конкретная проблема не может быть исправлена, почему бы не объявить в своем манифесте разрешение на использование READ_PHONE_STATE?

1 голос
/ 25 февраля 2017

У меня была такая же проблема с телефоном HTC (Desire 728G) Dual Sim , и мне пришлось включить «READ_PHONE_STATE», но теперь Google запрашивает политику конфиденциальности, и потому что мне лень это делать это :) Я провел небольшое исследование и нашел лучший способ без использования «READ_PHONE_STATE». Проблема заключается в том, что некоторым устройствам (в основном dual sim) требуется разрешение «READ_PHONE_STATE» для поиска «SubscriptionId» по умолчанию, что происходит при вызове «SmsManager.getDefault ()». Ниже приведен код, который я использую, чтобы избежать этой проблемы, присваивая значение (1) SubscriptionId, если возникло какое-либо исключение:

            SmsManager smsManager = SmsManager.getDefault();

            if (android.os.Build.VERSION.SDK_INT >= 22){
                Log.e("Alert","Checking SubscriptionId");
            try {
                Log.e("Alert","SubscriptionId is " + smsManager.getSubscriptionId());
            } catch (Exception e) {
                Log.e("Alert",e.getMessage());
                Log.e("Alert","Fixed SubscriptionId to 1");
                smsManager = SmsManager.getSmsManagerForSubscriptionId(1);
            }
            }

            smsManager.sendTextMessage(mobileNumber, null, msgStr, null, null);
...