Сбой Android на Android 8.0 Oreo: SecurityException: отказ в разрешении: null запрашивает запуск от имени пользователя 450, но звонит от пользователя 0

Я обновляю свой телефон до Android Oreo. Когда я запускаю свое приложение на этом устройстве. Мое приложение вылетает. Пока он хорошо работает на Android 7 и более ранних устройствах.

Это журнал:

E/AndroidRuntime: FATAL EXCEPTION: main
                                                         Process: com.test.test, PID: 28271
                                                         java.lang.SecurityException: Permission Denial: null asks to run as user 450 but is calling from user 0; this requires android.permission.INTERACT_ACROSS_USERS_FULL or android.permission.INTERACT_ACROSS_USERS
                                                             at android.os.Parcel.readException(Parcel.java:1942)
                                                             at android.os.Parcel.readException(Parcel.java:1888)
                                                             at android.view.autofill.IAutoFillManager$Stub$Proxy.addClient(IAutoFillManager.java:326)
                                                             at android.view.autofill.AutofillManager.ensureServiceClientAddedIfNeededLocked(AutofillManager.java:896)
                                                             at android.view.autofill.AutofillManager.notifyViewExited(AutofillManager.java:487)
                                                             at android.view.View.notifyEnterOrExitForAutoFillIfNeeded(View.java:6945)
                                                             at android.view.View.dispatchAttachedToWindow(View.java:17413)
                                                             at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3326)
                                                             at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3326)
                                                             at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3326)
                                                             at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3326)
                                                             at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3326)
                                                             at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3326)
                                                             at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3326)
                                                             at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3326)
                                                             at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3326)
                                                             at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3326)
                                                             at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3326)
                                                             at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3326)
                                                             at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3326)
                                                             at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3326)
                                                             at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3326)
                                                             at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1658)
                                                             at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1386)
                                                             at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6733)
                                                             at android.view.Choreographer$CallbackRecord.run(Choreographer.java:911)
                                                             at android.view.Choreographer.doCallbacks(Choreographer.java:723)
                                                             at android.view.Choreographer.doFrame(Choreographer.java:658)
                                                             at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:897)
                                                             at android.os.Handler.handleCallback(Handler.java:789)
                                                             at android.os.Handler.dispatchMessage(Handler.java:98)
                                                             at android.os.Looper.loop(Looper.java:164)
                                                             at android.app.ActivityThread.main(ActivityThread.java:6541)
                                                             at java.lang.reflect.Method.invoke(Native Method)
                                                             at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
                                                             at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

person wei wang    schedule 23.08.2017    source источник
comment
Это очень похоже на то, что было задано в этом вопросе. Как вы вызываете этот сбой?   -  person CommonsWare    schedule 23.08.2017


Ответы (3)


Я испытал эту проблему.

В моем случае после выполнения startActivity приложение выдало следующее исключение:

Fatal Exception: java.lang.SecurityException: Permission Denial: null asks to run as user 66853 but is calling from user 0; this requires android.permission.INTERACT_ACROSS_USERS_FULL or android.permission.INTERACT_ACROSS_USERS
       at android.os.Parcel.readException(Parcel.java:1942)
       at android.os.Parcel.readException(Parcel.java:1888)
       at android.view.autofill.IAutoFillManager$Stub$Proxy.addClient(IAutoFillManager.java:326)
       at android.view.autofill.AutofillManager.ensureServiceClientAddedIfNeededLocked(AutofillManager.java:896)
       at android.view.autofill.AutofillManager.notifyViewExited(AutofillManager.java:487)
       at android.view.View.notifyEnterOrExitForAutoFillIfNeeded(View.java:6945)
       at android.view.View.dispatchAttachedToWindow(View.java:17413)
       at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3326)
       at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3326)
       at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3326)
       at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3326)
       at android.view.ViewGroup.addViewInner(ViewGroup.java:4955)
       at android.view.ViewGroup.addView(ViewGroup.java:4746)
       at android.view.ViewGroup.addView(ViewGroup.java:4686)
       at android.support.v7.widget.RecyclerView$5.addView(RecyclerView.java:711)
       at android.support.v7.widget.ChildHelper.addView(ChildHelper.java:107)
       at android.support.v7.widget.RecyclerView$LayoutManager.addViewInt(RecyclerView.java:7877)
       at android.support.v7.widget.RecyclerView$LayoutManager.addView(RecyclerView.java:7835)
       at android.support.v7.widget.RecyclerView$LayoutManager.addView(RecyclerView.java:7823)
       at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1565)
       at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1511)
       at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:595)
       at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3583)
       at android.support.v7.widget.RecyclerView.onMeasure(RecyclerView.java:3025)
       at android.view.View.measure(View.java:21998)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6580)
       at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1514)
       at android.widget.LinearLayout.measureVertical(LinearLayout.java:806)
       at android.widget.LinearLayout.onMeasure(LinearLayout.java:685)
       at android.view.View.measure(View.java:21998)
       at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:715)
       at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:461)
       at android.view.View.measure(View.java:21998)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6580)
       at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1514)
       at android.widget.LinearLayout.measureVertical(LinearLayout.java:806)
       at android.widget.LinearLayout.onMeasure(LinearLayout.java:685)
       at android.view.View.measure(View.java:21998)
       at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:715)
       at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:461)
       at android.view.View.measure(View.java:21998)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6580)
       at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1514)
       at android.widget.LinearLayout.measureVertical(LinearLayout.java:806)
       at android.widget.LinearLayout.onMeasure(LinearLayout.java:685)
       at android.view.View.measure(View.java:21998)
       at android.widget.ScrollView.measureChildWithMargins(ScrollView.java:1308)
       at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
       at android.widget.ScrollView.onMeasure(ScrollView.java:350)
       at android.view.View.measure(View.java:21998)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6580)
       at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
       at android.view.View.measure(View.java:21998)
       at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:715)
       at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:461)
       at android.view.View.measure(View.java:21998)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6580)
       at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
       at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:139)
       at android.view.View.measure(View.java:21998)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6580)
       at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1514)
       at android.widget.LinearLayout.measureVertical(LinearLayout.java:806)
       at android.widget.LinearLayout.onMeasure(LinearLayout.java:685)
       at android.view.View.measure(View.java:21998)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6580)
       at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
       at android.view.View.measure(View.java:21998)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6580)
       at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1514)
       at android.widget.LinearLayout.measureVertical(LinearLayout.java:806)
       at android.widget.LinearLayout.onMeasure(LinearLayout.java:685)
       at android.view.View.measure(View.java:21998)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6580)
       at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
       at com.android.internal.policy.DecorView.onMeasure(DecorView.java:721)
       at android.view.View.measure(View.java:21998)
       at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2410)
       at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1498)
       at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1751)
       at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1386)
       at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6733)
       at android.view.Choreographer$CallbackRecord.run(Choreographer.java:911)
       at android.view.Choreographer.doCallbacks(Choreographer.java:723)
       at android.view.Choreographer.doFrame(Choreographer.java:658)
       at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:897)
       at android.os.Handler.handleCallback(Handler.java:789)
       at android.os.Handler.dispatchMessage(Handler.java:98)
       at android.os.Looper.loop(Looper.java:164)
       at android.app.ActivityThread.main(ActivityThread.java:6541)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

После нескольких часов исследований я обнаружил, что мой класс BaseActivity, расширенный всеми действиями приложения, реализовал защищенный метод с именем getUserId, как в примере ниже:

 class BaseActivity extends AppCompatActivity {

   ...

   protected int getUserId() {
     return getCurrentUserRepository().getId();
   }
 }

Я просто изменил имя метода на другое, и приложение снова заработало:

 class BaseActivity extends AppCompatActivity {

   ...

   protected int getApplicationUserId() {
     return getCurrentUserRepository().getId();
   }
 }

Я не смог найти ни одного метода с таким же именем в базовых классах, но, как мы видим в трассировке стека, этот метод, вероятно, был вызван Reflection.

Еще один важный момент заключается в том, что только действия, которые реализуют любое представление EditText, вызывают исключение. Проблема возникла после внедрения Autofill Framework в API 26< /сильный>.

person Isac    schedule 09.09.2017
comment
У меня была та же проблема, у меня был метод getUserId, я переименовал его в getUserID, и тогда я заработал - невероятно - person Kasper Finne Nielsen; 25.09.2017
comment
У меня тоже работает после изменения имени метода getUserId(). - person Ilanthirayan Paramanathan; 13.02.2018
comment
Та же проблема здесь. Переименовано имя метода, и теперь он работает - person Daan Geurts; 22.03.2018
comment
я не могу импортировать или найти имя класса getCurrentUserRepository() в студии Android @KasperFinneNielsen - person Archu Mohan; 26.06.2019

Подводя итог этому ответу и просмотрев источники 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= определение для ненормальных ("опасных") разрешений...

Чтобы иметь возможность удерживать INTERACT_ACROSS_USERS, ваше приложение должно быть подписано ключом подписи микропрограммы или оно должно быть установлено в системном разделе.

Чтобы иметь возможность хранить INTERACT_ACROSS_USERS_FULL, ваше приложение должно быть подписано ключом подписи микропрограммы.

Поэтому, наконец, добавьте это в свой файл манифеста:

<permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" android:protectionLevel="signature"/>

Надеюсь, поможет...

person Community    schedule 23.08.2017
comment
Сбой происходит только на Android 8.0. Я пробовал это, но это не работает - person wei wang; 24.08.2017
comment
@weiwang попробуйте изменить метод getUserId() на getUserID() - person user7856586; 13.02.2019

У меня возникла такая же проблема в kotlin. Эта проблема возникает только в том случае, если Edittext реализован в действии и имеет метод getUserId() в этом классе или его родительском классе. Замена getUserId() на getUserIdd() устранила мою проблему.

В Котлине у меня была переменная

var userId=0

я изменил его на

var userIdd=0

Решил мою проблему.

person Sayandh    schedule 10.07.2020