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
Любая помощь?
Ответы
Ответ 1
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"/>
Ответ 2
Подводя итог этому ответу, и глядя на источники 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"
, вам нужно будет прочитать страницу о access-element. Который суммирован в таблице:
![enter image description here]()
Поэтому то, что вам нужно сделать в вашем AndroidManifest.xml
многом зависит от того, какой API вам нужно поддерживать, поскольку более высокий API> 23 также требует android:permissionGroup=
definition для ненормальных ("опасных") разрешений...
Также полезно знать (@CommonsWare)
Для того, чтобы быть в состоянии держать INTERACT_ACROSS_USERS
, ваше приложение должно быть подписано с помощью ключа подписи прошивки или он должен быть установлен на системном разделе.
Чтобы иметь возможность хранить INTERACT_ACROSS_USERS_FULL
, ваше приложение должно быть подписано ключом подписи прошивки.
Ответ 3
Такая же проблема я получал, когда я использовал billingProcessor.subscribe() или billingProcessor.purchase() с двумя параметрами как Activity и product_id продукта. Было передано значение product_id пуст.
Пожалуйста, как только убедитесь, что вы передаете значение в product_id, не пусто.
Ответ 4
Одним из возможных решений является отключение автозаполнения, но оно работает только на Android Oreo. Проверьте эту ссылку
Просто добавьте этот код в свое приложение:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
window.decorView.importantForAutofill =
View.IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS;
}
И переименуйте метод getUserId(), если он у вас есть.
Ответ 5
Это очень странная ошибка... Я получил ее после того, как переключился с 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" />
Поэтому я удалил его, и все снова пошло хорошо. Я думаю, что проблема была вызвана некоторым расстоянием между элементами (потому что этот счетчик был в фрагменте в операции с вкладками), и я вижу в длинных строках ошибки что-то о пробелах и дочерних мерах.
Имейте в виду, чтобы просто проверить любую возможную мелочь в файле ошибок, ошибка может быть из-за чего-либо...
Ответ 6
Это может помочь вам, потому что у меня возникла та же проблема, и я могу решить ее.
Поскольку у 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 и т.д.), так как они ограничены
Спасибо !
Ответ 7
Я столкнулся с той же проблемой "android.permission.INTERACT_ACROSS_USERS_FULL" при обновлении версии ОС моего устройства Android. Я попытался очистить и восстановить проект, и проблемы были решены.
Ответ 8
я решил эту проблему по счастливой случайности. Я использовал экземпляр одного фрагмента, который вызвал эту проблему. Когда я заменил вызов fragment.getInstance()
new fragment()
он работал как шарм. фрагменты не должны использоваться как синглтоны и должны быть возвращены (если требуется) с сохраненным состоянием.