Android强制设置屏幕旋转方向 Force rotation
第一种方法:
首先检查有没有权限,没有就去申请。申请时会触发frameworks/base/services/core/java/com/android/server/wm/AlertWindowNotification.java里面
弹出可以覆盖view的权限窗口。
检查和处理的code如下:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){if (!Settings.canDrawOverlays(this)){Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,Uri.parse("package:" + getPackageName()));startActivityForResult(intent, OVERLAY_PERMISSION_REQ_CODE);return;}}
@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data){if (requestCode == OVERLAY_PERMISSION_REQ_CODE){if (Settings.canDrawOverlays(this)){//Already has permission }}}
实际去锁定旋转和恢复的code如下:
public final static int STATE_DEFAULT = 0;
public final static int STATE_PORTRAIT = 1;
public final static int STATE_LANDSCAPE = 8;
WindowManager mWindowManager; View mView; WindowManager.LayoutParams lp;mWindowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);int iFlags = WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN |WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH |WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED;lp = new WindowManager.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT,WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,iFlags,PixelFormat.TRANSLUCENT);mView = new View(this);
switch (rotation){//Normal Operationcase MainActivity.STATE_DEFAULT:if (mAdded == true) mWindowManager.removeView(mView);mAdded = false;break;//Force Rotationcase MainActivity.STATE_LANDSCAPE:case MainActivity.STATE_PORTRAIT:lp.screenOrientation = rotation;if (mAdded == false){mWindowManager.addView(mView, lp);mAdded = true;}else{mWindowManager.updateViewLayout(mView, lp);}break;}
上面的方法在添加system权限后,可以直接获得权限,不再需要申请。
android:sharedUserId="android.uid.system"
第二种方法是仿照SystemUI里面检查旋转方向的方式,类似旋转屏幕后,把auto-rotation disable。
参照frameworks/base/core/java/com/android/internal/view/RotationPolicy.java里面
/*** Returns true if rotation lock is enabled.*/public static boolean isRotationLocked(Context context) {return Settings.System.getIntForUser(context.getContentResolver(),Settings.System.ACCELEROMETER_ROTATION, 0, UserHandle.USER_CURRENT) == 0;}/*** Enables or disables rotation lock from the system UI toggle.*/public static void setRotationLock(Context context, final boolean enabled) {Settings.System.putIntForUser(context.getContentResolver(),Settings.System.HIDE_ROTATION_LOCK_TOGGLE_FOR_ACCESSIBILITY, 0,UserHandle.USER_CURRENT);final int rotation = areAllRotationsAllowed(context) ? CURRENT_ROTATION : NATURAL_ROTATION;setRotationLock(enabled, rotation);}private static void setRotationLock(final boolean enabled, final int rotation) {AsyncTask.execute(new Runnable() {@Overridepublic void run() {try {IWindowManager wm = WindowManagerGlobal.getWindowManagerService();if (enabled) {wm.freezeRotation(rotation);} else {wm.thawRotation();}} catch (RemoteException exc) {Log.w(TAG, "Unable to save auto-rotate setting");}}});}
因为直接用RotationPolicy中public的 setRotationLock(Context, final boolean)只能锁定当前已经旋转的屏幕,所以不如直接仿照这个private的
setRotationLock(final boolean, final int)去呼叫
import android.view.IWindowManager; import android.view.Surface; import android.view.WindowManagerGlobal;if(value == LANDSCAPE) {AsyncTask.execute(new Runnable() {@Overridepublic void run() {try {IWindowManager wm = WindowManagerGlobal.getWindowManagerService();//if (enabled) { wm.freezeRotation(Surface.ROTATION_90); /* } else {wm.thawRotation();}*/} catch (RemoteException exc) {Log.w(TAG, "Unable to save auto-rotate setting");}}});}else {AsyncTask.execute(new Runnable() {@Overridepublic void run() {try {IWindowManager wm = WindowManagerGlobal.getWindowManagerService();wm.thawRotation();} catch (RemoteException exc) {Log.w(TAG, "Unable to save auto-rotate setting");}}});}
这个需要在源码里面编译,不然只能用反射。
第三种方法:
1. 修改frameworks/base/core/res/res/values/config.xml中
<bool name="config_deskDockEnablesAccelerometer">false</bool><integer name="config_deskDockRotation">270</integer>
其中第一个参数是在有Dock event时候,不使用Accelerometer自动旋转
第二个参数是在收到Dock event时候, 旋转屏幕的角度。-1为不旋转,可以设置为0-360度
2. 然后参考https://www.cnblogs.com/kunkka/p/10805388.html里面frameworks的修改
在侦测到有device连接时,去发送DOCK event
连接时:
final Intent statusIntent = new Intent(Intent.ACTION_DOCK_EVENT);statusIntent.putExtra(Intent.EXTRA_DOCK_STATE,Intent.EXTRA_DOCK_STATE_DESK);mContext.sendBroadcastAsUser(statusIntent, UserHandle.ALL);
断开连接时:
final Intent statusIntent = new Intent(Intent.ACTION_DOCK_EVENT);statusIntent.putExtra(Intent.EXTRA_DOCK_STATE,Intent.EXTRA_DOCK_STATE_UNDOCKED);mContext.sendBroadcastAsUser(statusIntent, UserHandle.ALL);
此时,在PhoneWindowManager.java中会去读第一步设定的连接DOCK的config,并listen第二步发送的DOCK event去旋转屏幕。
PhoneWindowManager里面是android已经做好的DOCK的功能,不需要修改。
转载于:https://www.cnblogs.com/kunkka/p/10778702.html
Android强制设置屏幕旋转方向 Force rotation相关推荐
- android11 动态设置屏幕旋转方向
1.需求 客户动态设置屏幕的旋转方向,下次开机保持设置的屏幕方向,开关机动画也要跟着旋转. 2.分析 如果开关机动画也要跟着旋转,就不跟再LocalDisplayAdapter.java里面改了,因为 ...
- 【Android RTMP】NV21 图像旋转处理 ( 问题描述 | 图像顺时针旋转 90 度方案 | YUV 图像旋转细节 | 手机屏幕旋转方向 )
文章目录 安卓直播推流专栏博客总结 一. NV21 图像格式与 Camera图像传感器方向问题 二. NV21 图像格式视频旋转 1. 图像旋转问题及解决方案 ( 顺时针旋转 90 度 ) 2. NV ...
- 在Android的 设置-显示 中增加控制屏幕旋转方向的选项
在Android的 设置->显示 中增加控制屏幕旋转方向的选项 参考博文 实现目标 效果局限 代码实现 配置资源文件 界面搭建 功能实现 默认值修改 其他情况 结语 参考博文 Android-x ...
- 设置Android默认锁定屏幕旋转
/*********************************************************************************** 设置Android默认锁定屏幕 ...
- android 获得屏幕方向,Android 获取设置屏幕横竖屏
Android 获取设置屏幕横竖屏 发布时间:2020-08-06 03:23:17 来源:51CTO 阅读:351 作者:huyanruirui 方法一: screenOrientation = a ...
- Android 强制设置横屏或竖屏 设置全屏
Android 强制设置横屏或竖屏 设置全屏 全屏 在Activity的onCreate方法中的setContentView(myview)调用之前添加下面代码 requestWindowFeatur ...
- Android 7.1 屏幕旋转流程分析
Android 7.1 屏幕旋转流程分析 一.概述 Android屏幕的旋转在framework主要涉及到三个类,结构如图 PhoneWindowManager:为屏幕的横竖屏转换的管理类. Wi ...
- linux内核怎么修改屏幕旋转方向_树莓派4—屏幕旋转
配置:树莓派4+raspberry pi系统,HDMI显示,非触屏. 问题:想将屏幕旋转90°,按网上说的, 方法一:在config.txt文件中添加display_rotate=1,或者添加disp ...
- android编程:调节视频画面分辨率,Android编程实现屏幕自适应方向尺寸与分辨率的方法...
本文实例讲述了Android编程实现屏幕自适应方向尺寸与分辨率的方法.分享给大家供大家参考,具体如下: Android 屏幕自适应方向尺寸与分辨率,包括屏幕界面布局.多分辨率支持.获取屏幕尺寸.屏幕横 ...
- IOS基础之iPad的屏幕旋转方向判断
IOS基础之iPad的屏幕旋转方向判断 #pragma mark - 屏幕旋转 - (void)viewWillTransitionToSize:(CGSize)size withTransition ...
最新文章
- ios cocopods 安装使用及高级教程
- python学习笔记(四)-数据类型
- Java拾遗:001 - 重写 equals 和 hashCode 方法
- LINUX下直接使用ISO文件
- 用vim看代码的常用指令
- 前端学习(752):全局变量和局部变量
- 《Java8实战》笔记(05):使用流
- Flutter进度条Flutter圆形进度条Flutter条形进度条Flutter Progress进度条LinearProgressIndicator
- VueGoogleMaps在vue中的使用
- 基本功:超全面 IO 流教程,小白也能看懂
- python 循环语句结果存储_Hello,Python!小鲸教你学Python(八)条件语句和循环
- Oracle的where子句
- image 搜索docker_docker images命令-列出image
- UVA1025 Thematic Contests
- 网络文件常常提到类似./run.sh的数据,这个命令的意义是什么?
- 计算有效时间的时间戳
- python 微信公众号发文章_如何使用 Python 爬取微信公众号文章
- 数学方法生成六位随机数
- java电话面试_记一次java电话面试
- 性能问题从发现到优化一般思路