使用场景
在某些情况下,没有对Android应用设置横屏竖屏,而Android手机一般随着陀螺仪加速器的方向进行旋转,假设我的手机是横向放置的,但是我又要求纵向显示。或者我的手机是纵向放置的,但是我又要求横向显示的时候,就会有挺麻烦的问题。
ADB方法
使用adb指令强行修改方向还是很方便的,问题在于某些手机权限不支持。
支持手机类型:小米,华为,VIVO,摩托罗拉,三星,魅族,一加(ACE除外)
不支持手机类型:OPPO系列,Realme系列,一加ACE系列
//先执行这条指令来取消自动旋转
adb shell content insert --uri content://settings/system --bind name:s:accelerometer_rotation --bind value:i:0
//旋转到横向:
adb shell content insert --uri content://settings/system --bind name:s:user_rotation --bind value:i:1
//旋转到纵向:
adb shell content insert --uri content://settings/system --bind name:s:user_rotation --bind value:i:0
执行成功后,可以很清楚地看到屏幕的方向变了,但是如果在不支持的手机类型执行失败时会报以下错误:
Error while accessing provider:settings
java.lang.SecurityException: com.android.shell was not granted this permission: android.permission.WRITE_SETTINGS.
at android.os.Parcel.createExceptionOrNull(Parcel.java:2389)
at android.os.Parcel.createException(Parcel.java:2373)
at android.os.Parcel.readException(Parcel.java:2356)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:190)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:142)
at android.content.ContentProviderProxy.insert(ContentProviderNative.java:550)
at com.android.commands.content.Content$InsertCommand.onExecute(Content.java:565)
at com.android.commands.content.Content$Command.execute(Content.java:521)
at com.android.commands.content.Content.main(Content.java:727)
at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:419)
Caused by: android.os.RemoteException: Remote stack trace:
at android.provider.Settings.isCallingPackageAllowedToPerformAppOpsProtectedOperation(Settings.java:15387)
at android.provider.Settings.checkAndNoteWriteSettingsOperation(Settings.java:15267)
at com.android.providers.settings.SettingsProvider.mutateSystemSetting(SettingsProvider.java:2053)
at com.android.providers.settings.SettingsProvider.insertSystemSetting(SettingsProvider.java:1987)
at com.android.providers.settings.SettingsProvider.insert(SettingsProvider.java:767)
主要的原因应该是手机厂商对系统权限进行了一定的限制,shell的权限级别不够修改setting,如果root了手机或者能够加上system权限的话就没这问题了。
代码方法
一般来讲都是在应用中的xml文件或者java代码里面写好了方向,但是我如果要强行指定全局的方向而不只是一个应用的话,最好的方式还是使用app_process的方法,在android里面运行个java程序。具体的代码也很简单。文章来源:https://www.toymoban.com/news/detail-519008.html
private final ServiceManager serviceManager = new ServiceManager();
//设置成横向
serviceManager.getWindowManager().freezeRotation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
//设置成纵向
serviceManager.getWindowManager().freezeRotation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
该方法目前应该能够比较好地适配所有机型的。文章来源地址https://www.toymoban.com/news/detail-519008.html
到了这里,关于强制设置Android手机方向问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!