我正在开发一款控制屏幕旋转的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。
WindowOrientationListener
,但它没有包含发生错误的内部类ScreenOrientationEventListenerImpl
。三星手机可能使用自定义版本的代码,很可能部分是因为它具有非AOSP功能,Smart Rotation。"intelligent_rotation_mode"
设置作为用户-0x2
来阅读,这很有趣,因为我没有接触过这个设置-Samsung特定的设置。我还下载了the official source code的副本,但它似乎没有包含相关文件。答案 0 :(得分:2)
该应用使用了AOSP的com.android.internal.policy.impl.WindowOrientationListener
本地副本。但是,本地副本仍在使用原始包com.android.internal.policy.impl
。事实证明,当应用程序尝试使用该类的本地副本时,它实际上使用的是具有相同完全限定名称的原始系统版本。所以问题是应用程序意外地直接使用了手机的内置WindowOrientationListener
。