在应用程序启动之前崩溃:SecurityException:Permission Denial:INTERACT_ACROSS_USERS_FULL。

24

背景

我有一个已经ROOT的设备,Galaxy S3 I9300,使用的是基于Android 4.3的三星原生ROM。

在这个设备上运行我正在开发的应用程序时,从未出现过任何问题。

问题

自昨天以来(我并没有更改设备上的任何内容),每次打开应用程序时,它会显示很短的时间,然后自动关闭,没有任何崩溃对话框,但它会显示下一个日志:

01-30 09:27:18.325: E/DatabaseUtils(2366): Writing exception to parcel
01-30 09:27:18.325: E/DatabaseUtils(2366): 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
01-30 09:27:18.325: E/DatabaseUtils(2366):  at com.android.server.am.ActivityManagerService.handleIncomingUser(ActivityManagerService.java:13140)
01-30 09:27:18.325: E/DatabaseUtils(2366):  at android.app.ActivityManager.handleIncomingUser(ActivityManager.java:2038)
01-30 09:27:18.325: E/DatabaseUtils(2366):  at com.android.providers.settings.SettingsProvider.callFromPackage(SettingsProvider.java:607)
01-30 09:27:18.325: E/DatabaseUtils(2366):  at android.content.ContentProvider$Transport.call(ContentProvider.java:279)
01-30 09:27:18.325: E/DatabaseUtils(2366):  at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:273)
01-30 09:27:18.325: E/DatabaseUtils(2366):  at android.os.Binder.execTransact(Binder.java:388)
01-30 09:27:18.325: E/DatabaseUtils(2366):  at dalvik.system.NativeStart.run(Native Method)

它甚至没有进入扩展Application类的代码...

我发现的问题

这个问题似乎很常见(许多人报告了它),但我找不到除了具有root权限之外的任何解决方法和原因。

人们还说这里写的权限实际上是系统权限,但我甚至从未听说过它,更不用说使用它了(甚至不确定它是什么)。

问题是,我正在开发的应用程序与root无关,而且它几天前还能工作。

我尝试重新安装ROM(Omega ROM v54),并禁用与xposed框架相关的任何内容。但这些都没有帮助。

问题

我该如何解决这个问题?我怎样才能知道其他用户不会遇到此问题?

这是否与已获取root权限的设备有关?


编辑:我认为我找到了一个解决方法,可以在设置屏幕的开发人员部分中选择“撤消USB调试...”。一开始似乎有效,但后来问题又出现了,点击也没有任何帮助...


编辑:我认为这只是应用程序或ROM本身的错误,因为我再也无法重现它了。这非常奇怪,因为我几乎可以确定我曾尝试调试应用程序,并在acitivity的onCreate方法(以及可能是应用程序类本身的onCreate方法)上设置了断点,但它没有停在那里。


如果您的设备已经root,您可以执行系统权限。如果将所需权限添加到清单中会发生什么?它是否仍然导致错误?也许尝试在Android项目中添加ACRA,看看是否可以追踪错误。ACRA可以在此处找到。 - ChuongPham
我开始认为这一切都是因为一个导致当前活动结束而没有真正崩溃的错误。但是,很奇怪,因为我记得我曾经尝试过对活动进行调试,并在活动上放置了断点,发现它甚至没有停留在“onCreate()”方法上。现在我不知道问题是否已经解决,但是我再也无法复制该问题了。我现在不知道发生了什么情况。也许这也是因为我已经更新了设备上的ROM,所以我再也看不到这个问题了。 - android developer
好的。让我们保持这篇帖子开放,看看是否还有其他人遇到了相同的错误。 ;) - ChuongPham
我只想添加临时权限。 - Taylor Courtney
已经过时了。我不再遇到这个问题了。 - android developer
显示剩余6条评论
4个回答

1
01-30 09:27:18.325: E/DatabaseUtils(2366): 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

这个错误是由于你在应用程序中获取/设置任何用户/系统设置时引起的。这个特定的错误日志显示你的设置 get/set(从你的应用程序代码)正在从用户0(USER_OWNER)调用,但你正在更改的设置是针对用户-2(USER_CURRENT)的。

你不能在没有权限android.permission.INTERACT_ACROSS_USERS_FULL的情况下更改其他用户的设置。

你可能没有考虑到在代码中拥有不同的userID(调用userID和设置所属的userID之间的差异),并且使用不正确的userID 调用set/get设置(我不知道为什么在发生这种情况时它们会不同 - 例如,当设备上有多个用户帐户时可能会发生)。

你需要修改代码以将正确的userID纳入逻辑,并为适当的userID调用设置set/get(调用userID和为其修改设置的userID应该相同)。


我将关闭此问题线程,因为我不再拥有此设备,即使我曾经拥有,但在某个时候它停止出现此问题。 - android developer

0
将您的apk移动到/system/app/。它不会作为用户0执行,但它将允许您使用此权限:
android.permission.INTERACT_ACROSS_USERS_FULL

但我不使用这个权限,也不想要求用户将应用程序作为系统应用。 - android developer

0

我在Android Wear手表上执行通知操作时遇到了SecurityException异常。我也无法重现它,但注意到只有在使用IDE或adb install重新安装应用程序时才会发生。我从未在由我的Google Play密钥签名的正式构建中看到过它。


0

你可以尝试将apk移动到/system/app/并检查是否可以正常工作,因为在那里它将作为用户0执行。之后,您可以比较两个日志(工作的和常规的)以查看应用程序停止的位置。

要从shell安装它:

adb remount
adb push yourApp.apk /system/app/
adb reboot

该应用程序没有使用任何特殊权限。它不需要成为系统应用程序。无论如何,我认为这只是应用程序或ROM本身的一个错误,因为我无法再次复制此问题。 - android developer
@androiddeveloper:我最近几天一直遇到这个问题,但是找不到任何解决方案或变通方法。您能告诉我您是如何解决这个问题的吗? - Roll no1
@Rollno1 我没有修复任何东西。这种问题随着时间的推移自己解决了。也许是SDK更新的问题,或者是IDE的问题,或者是Android操作系统本身的问题。很抱歉我无法提供帮助。 - android developer
@androiddeveloper:我找到了问题,因为我正在使用带有自定义权限的库,而我忘记在主项目中添加它。 - Roll no1

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