Подтвердить что ты не робот

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

Любая помощь?

4b9b3361

Ответ 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

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

  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 и т.д.), так как они ограничены

Спасибо !

Ответ 7

Я столкнулся с той же проблемой "android.permission.INTERACT_ACROSS_USERS_FULL" при обновлении версии ОС моего устройства Android. Я попытался очистить и восстановить проект, и проблемы были решены.

Ответ 8

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