Разрешение 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

Вот мои некоторые изменения в коде

  1. Android 9 имеет новые функции, такие как вращение. Он может зависнуть, если вы постоянно устанавливаете его в портретный режим в манифесте. Лучше запрашивать ротацию из кода. поэтому я удаляю android:screenOrientation="портрет" из manifest.xml

  2. Другая проблема в моем коде - статическая регистрация трансляции.

    <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"));
       }
    
  3. Я обновляю всю библиотеку в build.gradle и удаляю ненужные реализации

Как вывод,

  • пожалуйста, сначала прочитайте полную документацию об изменениях поведения Android
  • внести необходимые изменения (ориентация, трансляция, сервис Backgroud и т. д.), так как они ограничены

Спасибо!

Это случилось со мной, когда я использовалnotificationChannel. Я создал его с помощью, но в другом месте я пытался получить его из контекста службы с помощьюNotificationManager.getNotificationChannel(). Так что, вероятно, используя один и тот же контекст в разных местах, напримерapplicationContextможет решить эту проблему.

вы можете видеть, что уровень защиты - это подпись, поэтому вам нужно подписать свое приложение тем же сертификатом (с сертификатом платформы), тогда только система предоставит ваше разрешение.

Я решил эту проблему по счастливой случайности. Я использовал экземпляр одного фрагмента, который вызвал эту проблему. Когда я заменил fragment.getInstance() позвонить с new fragment() Оно работало завораживающе. фрагменты не должны использоваться как синглтоны и должны быть возвращены (если требуется) с сохраненным состоянием.

Другие вопросы по тегам