安卓8.0奥利奥系统上的安卓崩溃问题:SecurityException: Permission Denial: null要求以用户450身份运行,但却是由用户0调用。

7
我把手机升级到了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)

1
这看起来很像这个问题中所问的。你是如何导致这个崩溃的? - CommonsWare
3个回答

25

我遇到过这个问题。

在我的情况下,在执行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();
   }
 }

我在基类中找不到任何具有相同名称的方法,但是正如我们在堆栈跟踪中看到的那样,这个方法很可能是由反射调用的。

另一个重要的问题是只有实现了任何EditText视图的活动才会抛出异常。该问题发生在API 26中实施Autofill Framework之后。


5
我有同样的问题,有一个叫做getUserId的方法,我把它重命名为getUserID,然后它就奇迹般地起作用了。 - Kasper Finne Nielsen
1
更改 getUserId() 方法名称后,对我也起作用。 - Ilanthirayan Paramanathan
1
这里也遇到了同样的问题。重命名了方法名称,现在它可以正常工作了。 - Daan Geurts
我无法在Android Studio中导入或找到getCurrentUserRepository()类名 @KasperFinneNielsen - Archu Mohan

1

我在Kotlin中遇到了同样的问题。只有在activity中实现Edittext并且在该类或其父类中有getUserId()方法时才会出现此问题。将getUserId()更改为getUserIdd()解决了我的问题。

在Kotlin中,我有一个变量

var userId=0

我把它改成了。
var userIdd=0

解决了我的问题。

0

总结this的答案,再看一下UserHandle.java的源代码,我们就可以了解框架用户 ID 的含义。

# | @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"的含义,您需要阅读关于permission-element的页面。该页面总结如下表格:

enter image description here

因此,在您的AndroidManifest.xml中需要做的事情很大程度上取决于您需要支持哪些API,因为高于23个API的版本还需要一个android:permissionGroup=definition,用于非正常(“危险”)权限...

要能够保持INTERACT_ACROSS_USERS,您的应用程序必须由固件签名密钥签名或安装在系统分区中。

要能够保持INTERACT_ACROSS_USERS_FULL,您的应用程序必须由固件签名密钥签名。

因此最后将以下内容添加到您的清单文件中:

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

希望能有所帮助...


崩溃只发生在Android 8.0上。我尝试过了,但它不起作用。 - wei wang
2
@weiwang 请尝试将方法getUserId()更改为getUserID()。 - Roman Soviak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接