Разрешение Android.INTERACT_ACROSS_USERS_FULL
У меня есть большое приложение в Android.
Время от времени приложение вылетает с непонятной ошибкой. Я не знаю точно, когда и почему это происходит.
java.lang.SecurityException: Permission Denial: get/set setting for user asks
to run as user -2 but is calling from user 0; this requires
android.permission.INTERACT_ACROSS_USERS_FULL
Любая помощь?
12 ответов
Подводя итог этому ответу, и глядя на источники UserHandle.java, мы видим значение идентификаторов пользователей фреймворка.
# | @UserIdInt | Value | Status | Description |
# | --------------------- | ------ | ---------- | ------------|
# | USER_OWNER | 0 | deprecated | "owner" user of the device
# | USER_SYSTEM | 0 | ok | "system" user of the device
# | USER_ALL | -1 | ok | ALL users on the device
| USER_CURRENT | -2 | ok | the currently active user
# | USER_CURRENT_OR_SELF | -3 | ok | id from which we would like to send to the current user
# | USER_NULL | -10000 | ok | An undefined user id
Тогда, чтобы понять, что android:protectionLevel="signature"
означает, что вам придется прочитать страницу о элементе разрешения. Который суммирован в таблице:
Итак, что вам нужно сделать в вашем AndroidManifest.xml
зависит от того, какие API вам нужно поддерживать, так как более 23 API также требуют android:permissionGroup=
определение, для ненормальных ("опасных") разрешений...
Также полезно знать (@CommonsWare)
Чтобы быть в состоянии держать INTERACT_ACROSS_USERS
Ваше приложение должно быть подписано ключом подписи прошивки или оно должно быть установлено в системном разделе.
Чтобы быть в состоянии держать INTERACT_ACROSS_USERS_FULL
Ваше приложение должно быть подписано ключом подписи прошивки.
java.lang.SecurityException: Отказ в разрешении: настройка get/set для пользователя запрашивает запуск от имени пользователя -2, но вызывает от пользователя 0; это требует android.permission.INTERACT_ACROSS_USERS_FULL
Добавь это android:protectionLevel="signature"
в вашем манифесте.
Для более подробной информации, вы можете проверить Permission-Element
Подобно:
<permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" android:protectionLevel="signature"/>
Одним из возможных решений является отключение автозаполнения, но оно работает только на Android Oreo. Проверьте эту ссылку
Просто добавьте этот код в ваше приложение:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
window.decorView.importantForAutofill =
View.IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS;
}
Та же проблема, которую я получал, когда использовал billingProcessor.subscribe() или billingProcessor.purchase() с двумя параметрами: Activity и product_id продукта. Там я передаю значение product_id пусто.
Пожалуйста, однажды убедитесь, что вы передаете значение в product_id не пусто.
Просто столкнулся с ней после обновления ОС на устройстве.
Жесткий перезапуск решил это.
Это очень странная ошибка... Я получил ее после того, как переключился с Java на Kotlin или, может быть, из любого обновления Android Studio. Я начал комментировать элементы один за другим из файлов XML и.kt, пока не обнаружил, что ошибка не имеет ничего общего ни с каким userId (который упоминался в ошибке), ни с каким-либо вызовом Retrofit, ошибка была вызвана одним Spinner элемент в XML, ничего о нем в файле.kt, когда я загружал элементы, только это:
<Spinner
android:id="@+id/number_people_sp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="text" />
Поэтому я удалил его, и все снова пошло хорошо. Я думаю, что проблема была вызвана некоторым расстоянием между элементами (потому что этот счетчик был в фрагменте в операции с вкладками), и я вижу в длинных строках ошибки что-то о пробелах и дочерних мерах.
Имейте в виду, чтобы просто проверить любую возможную мелочь в файле ошибок, ошибка может быть из-за чего-либо...
Я столкнулся с этой ошибкой сразу после обновления ОС телефона до Android 9. У меня ничего не сработало, кроме сброса (перезагрузки) телефона и перезапуска Android Studio.
Я столкнулся с той же проблемой "android.permission.INTERACT_ACROSS_USERS_FULL", когда я обновил версию ОС моего устройства Android. Я попытался очистить и восстановить проект, и проблемы были решены.
Это может помочь вам, потому что у меня возникла та же проблема, и я могу решить ее.
Поскольку у android 28 есть некоторые ограничения, все разработчики должны просмотреть эти изменения и изменить свои приложения, чтобы обеспечить их надлежащую поддержку, где это применимо к приложению.
https://developer.android.com/about/versions/pie/android-9.0-changes-all
Вот мои некоторые изменения в коде
Android 9 имеет новые функции, такие как вращение. Он может зависнуть, если вы постоянно устанавливаете его в портретный режим в манифесте. Лучше запрашивать ротацию из кода. поэтому я удаляю android:screenOrientation="портрет" из manifest.xml
Другая проблема в моем коде - статическая регистрация трансляции.
<intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> </intent-filter>
Действие android.net.conn.CONNECTIVITY_CHANGE устарело в android P., поэтому я динамически регистрирую его в BaseActivity.java как
@Override protected void onResume() { super.onResume(); registerReceiver(connectReceiver, newIntentFilter("android.net.conn.CONNECTIVITY_CHANGE")); }
Я обновляю всю библиотеку в build.gradle и удаляю ненужные реализации
Как вывод,
- пожалуйста, сначала прочитайте полную документацию об изменениях поведения Android
- внести необходимые изменения (ориентация, трансляция, сервис Backgroud и т. д.), так как они ограничены
Спасибо!
Это случилось со мной, когда я использовалnotificationChannel
. Я создал его с помощью, но в другом месте я пытался получить его из контекста службы с помощьюNotificationManager.getNotificationChannel()
. Так что, вероятно, используя один и тот же контекст в разных местах, напримерapplicationContext
может решить эту проблему.
вы можете видеть, что уровень защиты - это подпись, поэтому вам нужно подписать свое приложение тем же сертификатом (с сертификатом платформы), тогда только система предоставит ваше разрешение.
Я решил эту проблему по счастливой случайности. Я использовал экземпляр одного фрагмента, который вызвал эту проблему. Когда я заменил fragment.getInstance()
позвонить с new fragment()
Оно работало завораживающе. фрагменты не должны использоваться как синглтоны и должны быть возвращены (если требуется) с сохраненным состоянием.