【问题标题】:SecurityException: Permission Denial安全异常:权限被拒绝
【发布时间】:2014-11-24 21:46:54
【问题描述】:

背景

我正在开发一个控制屏幕旋转的 Android 应用。 The app is available on the Google Play store。为了控制屏幕旋转,应用禁用system auto rotation 并更改USER_ROTATION 的值。 The source code is available via Mercurial/hg.

问题

虽然该应用程序在我的手机上运行良好,这是一部已​​植根的 Sony Xperia M,但它在运行 Android 4.3 的朋友的三星 Galaxy S3 上崩溃。崩溃发生在我的代码之外,因此我在 Google Play 商店中没有收到崩溃报告,并且堆栈跟踪仅显示我无权访问的外部代码。

java.lang.SecurityException: Permission Denial: get/set setting for user asks to run as user -2 but is call from user 0;这需要 android.permission.INTERACT_ACROSS_USERS_FULL 在 android.os.Parcel.readException(Parcel.java:1431) 在 android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:185) 在 android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:137) 在 android.content.ContentProviderProxy.call(ContentProviderNative.java:602) 在 android.provider.Settings$NameValueCache.getStringForUser(Settings.java:934) 在 android.provider.Settings$System.getStringForUser(Settings.java:1162) 在 android.provider.Settings$System.getIntForUser(Settings.java:1232) 在 com.android.internal.policy.impl.WindowOrientationListener$ScreenOrientationEventListenerImpl.onSensorChanged(WindowOrientationListener.java:501) 在 android.hardware.SystemSensorManager$SensorE

此堆栈跟踪表明系统自动旋转仍在运行。它还显示操作系统代码在接收到屏幕方向更改事件后尝试以特定用户身份读取 int 系统设置。所以我怀疑这个问题与我禁用ACCELEROMETER_ROTATION或更改USER_ROTATION有关,两者都是int system settings

疑难解答

  • 我检查了有关此错误的其他问题。他们中的大多数只解释错误的含义而没有提供任何解决方案。我找不到任何具有完全相同的调用堆栈跟踪。
  • 我检查了the AOSP code for WindowOrientationListener,但它不包含发生错误的内部类ScreenOrientationEventListenerImpl。三星手机可能使用了自定义版本的代码,很可能部分是因为它具有非 AOSP 功能,Smart Rotation
  • 我不认为我的代码在做任何用户特定的事情;它只是使用普通的 Android API。
  • 我在没有 root 权限的 Sony Xperia M 和 Sony Xperia Ray 上测试了该应用程序,在它们上运行良好。
  • 我使用Samsung Remote Test Lab 在 4 个不同的三星 Galaxy S3 上测试了该应用程序。
  • 我试图找到发生错误的源代码。我找到了a smali file,乍一看表明它正试图以用户-0x2 的身份读取设置"intelligent_rotation_mode",这很有趣,因为我没有触及那个可能是三星特定的设置。我还下载了一份the official source code,但它似乎没有包含相关文件。

【问题讨论】:

  • 您的手机(可以使用的手机)是否已植根?
  • @JeffreyBlattman,是的。我还在运行 CyanogenMod 的索尼 Xperia Ray 上对其进行了测试,它也可以在上面运行。 (我不知道 CyanogenMod 是否带有根;我猜它可能。)您认为根是否掩盖了问题?我认为我远程测试的官方三星不会被植根。另外,我已经安装了 SuperSU,所以如果应用程序尝试执行任何与 root 相关的操作,它不应该提示我吗?
  • 是的,当然。您正在调用的操作似乎需要通常不会授予没有 root 运行的应用程序的权限。具体的错误很难解析,但似乎有些东西正在检查调用用户 ID 是否与其用户 ID 相同,如果不是,则不授予权限。
  • @JeffreyBlattman,是的;如果您查看堆栈跟踪的底部,您可以看到操作系统正在尝试getIntForUser 以响应手机的方向变化。因此,似乎我所做的某些事情导致该操作由于某种原因而失败。

标签: java android samsung-mobile android-4.3-jelly-bean securityexception


【解决方案1】:

该应用正在使用来自 AOSP 的 com.android.internal.policy.impl.WindowOrientationListener 的本地副本。但是,本地副本仍然使用原始包com.android.internal.policy.impl。事实证明,当应用程序尝试使用该类的本地副本时,它实际上使用的是具有相同完全限定名称的原始系统版本。所以问题是应用程序不小心直接使用了手机内置的WindowOrientationListener

【讨论】:

  • @MrsEd,我刚刚把WindowOrientationListener的包名改成了自己的包。
猜你喜欢
  • 1970-01-01
  • 2020-03-22
  • 2016-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多