SecurityException выдается только на устройствах Samsung с Android версии 6 и выше.

Следующий вопрос относится к версиям Android 6 и выше.

Я сделал некоторое кодирование, которое работает на всех устройствах, таких как motoG, Nexus, Pixel и т. д., но код выдает исключение SecurityException на устройствах Samsung.

Сообщение об исключении

UiAutomatorTestRunner: java.lang.SecurityException: невозможно найти приложение для вызывающего абонента android.app.ApplicationThreadProxy@a70d2 (pid = 25949) при получении настроек поставщика контента

Я попробовал поймать на Samsung Galaxy S5, и это сработало. Но для Samsung J7 это исключение также выбрасывается где-то еще в коде. Я не думаю, что добавление блока try catch является правильным подходом.

Код, в котором выдается исключение:

Намерение намерения = AndroidServicesUtil.getPackageManager().getLaunchIntentForPackage(packageName);

Стек исключений: >

java.lang.SecurityException: Unable to find app for caller android.app.ApplicationThreadProxy@123375c (pid=6375) when getting content provider settings
at android.os.Parcel.readException(Parcel.java:1621)
at android.os.Parcel.readException(Parcel.java:1574)
at android.app.ActivityManagerProxy.getContentProvider(ActivityManagerNative.java:4292)
at android.app.ActivityThread.acquireProvider(ActivityThread.java:6570)
at android.app.ContextImpl$ApplicationContentResolver.acquireProvider(ContextImpl.java:2388)
at android.content.ContentResolver.acquireProvider(ContentResolver.java:1505)
at android.provider.Settings$NameValueCache.lazyGetProvider(Settings.java:1431)
at android.provider.Settings$NameValueCache.getStringForUser(Settings.java:1505)
at android.provider.Settings$Secure.getStringForUser(Settings.java:8662)
at android.provider.Settings$Secure.getIntForUser(Settings.java:8732)
at android.provider.Settings$Secure.getInt(Settings.java:8722)
at android.app.ApplicationPackageManager.getHiddenList(ApplicationPackageManager.java:814)
at android.app.ApplicationPackageManager.isHidden(ApplicationPackageManager.java:859)
at android.app.ApplicationPackageManager.queryIntentActivitiesAsUser(ApplicationPackageManager.java:925)
at android.app.ApplicationPackageManager.queryIntentActivities(ApplicationPackageManager.java:907)
at android.app.ApplicationPackageManager.getLaunchIntentForPackage(ApplicationPackageManager.java:302)
at com.myclass.launchApp(SessionManager.java:595)

Может ли кто-нибудь помочь мне понять, почему исключение SecurityException выдается только на устройствах Samsung для версии Android> = 6.

Спасибо.


person Mohit Agrawal    schedule 20.01.2018    source источник
comment
Пожалуйста, отредактируйте свой вопрос и предоставьте минимально воспроизводимый пример. Это будет включать в себя всю трассировку стека Java (а не только сообщение об ошибке) и ваш код Java, который вызывает сбой.   -  person CommonsWare    schedule 20.01.2018
comment
Я понимаю ваш запрос, но мой вопрос не связан с моим кодом, а является общим вопросом. (поскольку исключение выдается в разных местах кода для разных устройств) Почему SecurityException выдается только на устройстве Samsung, а не на любом другом устройстве для Android по сравнению с › = 6? Есть ли что-то еще, что нам нужно сделать для устройства Samsung?   -  person Mohit Agrawal    schedule 22.01.2018
comment
Почему SecurityException выдается только на устройстве Samsung, а не на любом другом устройстве для Android по сравнению с › = 6? -- во-первых, вы не протестировали все возможные устройства Android 6.0+, поэтому вам не обязательно знать точный список устройств, на которых этот код не работает. Что касается того, почему это не удается, мы не можем ответить на это, потому что вы не предоставили минимальный воспроизводимый пример, как запрошено в моем оригинальный комментарий. Производители устройств и разработчики пользовательских ПЗУ могут изменить Android; вопрос в том, ошибка в вашем коде или в их изменениях.   -  person CommonsWare    schedule 22.01.2018
comment
Обновлено трассировкой стека и кодом, в котором я получаю исключение безопасности.   -  person Mohit Agrawal    schedule 24.01.2018
comment
Возможно, значение packageName, которое вы передаете, недопустимо, хотя я ожидаю здесь другого сообщения об ошибке. Если этот код дает сбой для заведомо хороших имен пакетов, то вина ложится на Samsung (за изменение Android таким образом, что это сломало getLaunchIntentForPackage()) и, возможно, на Google (за отсутствие тестового примера CTS, охватывающего этот сценарий, если устройство поставлялось с этим ошибка).   -  person CommonsWare    schedule 24.01.2018


Ответы (1)


Если ваше устройство работает под управлением Android версии> = 6, для этого вам необходимо добавить разрешение времени выполнения, потому что эти версии Android получают разрешение только во время выполнения, а не в файле манифеста.

Те версии ниже 6, они будут автоматически получать доступ к разрешениям из файла манифеста. Если вы добавляете разрешения во время выполнения, ваша проблема будет решена.

person Soumya Priya Nayak    schedule 20.01.2018