Как обрабатывать java.lang.SecurityException: требуется READ_PHONE_STATE для android.text.format.DateFormat.getDateFormat?

Моему приложению была отправлена ​​трассировка стека для устройства Y625-U21 (HWY625-U), приложение не запрашивает READ_PHONE_STATE, поскольку в документах ничего не говорится об использовании этого разрешения для получения dateFormat. Мы протестировали приложение на разных устройствах, и этого не произошло.

java.lang.SecurityException: Requires READ_PHONE_STATE: Neither user 10149 nor current process has android.permission.READ_PHONE_STATE.
at android.os.Parcel.readException(Parcel.java:1472)
at android.os.Parcel.readException(Parcel.java:1426)
at com.android.internal.telephony.IPhoneSubInfo$Stub$Proxy.getSubscriberId(IPhoneSubInfo.java:317)
at android.telephony.TelephonyManager.getSubscriberId(TelephonyManager.java:1094)
at android.text.format.DateFormat.getDateFormatStringForSetting(DateFormat.java:262)
at android.text.format.DateFormat.getDateFormatForSetting(DateFormat.java:250)
at android.text.format.DateFormat.getDateFormat(DateFormat.java:236)
at edu.usf.cutr.opentripplanner.android.util.ConversionUtils.getTimeWithContext(ConversionUtils.java:217)
at edu.usf.cutr.opentripplanner.android.util.ConversionUtils.getTimeWithContext(ConversionUtils.java:210)
at edu.usf.cutr.opentripplanner.android.fragments.MainFragment.fillItinerariesSpinner(MainFragment.java:3521)
at edu.usf.cutr.opentripplanner.android.fragments.MainFragment.onTripRequestComplete(MainFragment.java:3462)
at edu.usf.cutr.opentripplanner.android.tasks.TripRequest.onPostExecute(TripRequest.java:171)
at edu.usf.cutr.opentripplanner.android.tasks.TripRequest.onPostExecute(TripRequest.java:60)
at android.os.AsyncTask.finish(AsyncTask.java:632)
at android.os.AsyncTask.access$600(AsyncTask.java:177)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5135)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:606)
at dalvik.system.NativeStart.main(Native Method)

comment
Предположительно, производитель (или разработчик пользовательского ПЗУ на этом устройстве) облажался и добавил эту зависимость. Кроме того, чтобы обернуть getDateFormat() в блок try/catch и реализовать резервную реализацию, вы мало что можете с этим поделать.   -  person CommonsWare    schedule 02.11.2015


Ответы (2)


Я могу сказать, что когда ваше приложение получает много установок в Google Play, вы будете получать много странных отчетов о сбоях в консоли разработчика Google. Иногда вы ничего не можете с этим поделать, и вам нужно поместить свой код в блок try/catch.

Я не знаю всех подробностей о вашем случае, но в моем это было единственное решение.

try {
    //your code here
} catch (SecurityException e) {
    e.printStackTrace();
    //do smth in this scenario
} 
person Kirill Karmazin    schedule 24.05.2017
comment
насколько я знаю, вы не можете обрабатывать исключения безопасности. - person prudhvir3ddy; 08.04.2021

включить это разрешение в файл манифеста READ_PHONE_STATE Вы получаете это исключение, потому что вы не объявили это разрешение в файле манифеста.

person Developer_vaibhav    schedule 03.11.2015