背景
我正在开发一个控制屏幕旋转的 Android 应用程序。 The app is available on the Google Play store 。为了控制屏幕旋转,应用程序禁用 system auto rotation并更改 USER_ROTATION 的值。 The source code is available via Mercurial/hg .
问题
虽然该应用程序在我的手机(已 root 的索尼 Xperia M)上运行良好,但在 friend 运行 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 calling from user 0; this requires android.permission.INTERACT_ACROSS_USERS_FULL at android.os.Parcel.readException(Parcel.java:1431) at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:185) at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:137) at android.content.ContentProviderProxy.call(ContentProviderNative.java:602) at android.provider.Settings$NameValueCache.getStringForUser(Settings.java:934) at android.provider.Settings$System.getStringForUser(Settings.java:1162) at android.provider.Settings$System.getIntForUser(Settings.java:1232) at com.android.internal.policy.impl.WindowOrientationListener$ScreenOrientationEventListenerImpl.onSensorChanged(WindowOrientationListener.java:501) at android.hardware.SystemSensorManager$SensorE
此堆栈跟踪意味着系统自动旋转仍在运行。它还显示操作系统代码在收到屏幕方向更改事件后尝试以特定用户身份读取 int 系统设置。所以我怀疑问题与我禁用ACCELEROMETER_ROTATION有关或更改USER_ROTATION ,两者都是 int
system settings .
疑难解答
- 我检查了有关此错误的其他问题。他们大多数只解释错误的含义,而没有提供任何解决方案。我找不到任何具有完全相同的调用堆栈跟踪的内容。
- 我检查了the AOSP code for
WindowOrientationListener
,但它不包含发生错误的内部类ScreenOrientationEventListenerImpl
。三星手机可能使用自定义版本的代码,很可能部分是因为它具有非 AOSP 功能,Smart Rotation . - 我认为我的代码没有执行任何特定于用户的操作;它只是使用普通的 Android API。
- 我在未 Root 的索尼 Xperia M 和索尼 Xperia Ray 上测试了该应用,效果很好。
- 我使用 Samsung Remote Test Lab 在 4 台不同的 Samsung Galaxy S3 上测试了该应用程序.
- 我试图找到发生错误的源代码。我发现a smali file ,乍一看表明它正在尝试以用户
-0x2
的身份读取设置“intelligent_rotation_mode”
,这很有趣,因为我没有触及可能是三星特有的设置环境。我还下载了一份 the official source code ,但似乎没有包含相关文件。
最佳答案
该应用使用 AOSP 的 com.android.internal.policy.impl.WindowOrientationListener
的本地副本。但是,本地副本仍然使用原始包com.android.internal.policy.impl
。事实证明,当应用程序尝试使用该类的本地副本时,它实际上使用的是具有相同完全限定名称的原始系统版本。所以问题是应用程序意外地直接使用了手机的内置 WindowOrientationListener
。
关于java - 安全异常:权限被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27114764/