SecurityException:权限拒绝

时间:2014-11-24 21:46:55

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

背景

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

问题

虽然这款应用程序在我的手机上工作正常,一台扎根的索尼Xperia M,它在朋友的运行Android 4.3的三星Galaxy S3上崩溃了。崩溃发生在我的代码之外,因此我不会在Google Play商店中收到崩溃报告,而堆栈跟踪只显示我无法访问的外部代码。

  

java.lang.SecurityException:Permission Denial:用户的get / set设置要求以用户-2运行,但是从用户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

此堆栈跟踪意味着系统自动旋转仍在运行。它还显示OS代码在接收到屏幕方向更改事件后尝试将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个不同的三星Galaxy S3上测试了该应用。
  • 我试图找到发生错误的源代码。我找到了a smali file,它一眼就表明它正在尝试将"intelligent_rotation_mode"设置作为用户-0x2来阅读,这很有趣,因为我没有接触过这个设置-Samsung特定的设置。我还下载了the official source code的副本,但它似乎没有包含相关文件。

1 个答案:

答案 0 :(得分:2)

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