第一种方法:

首先检查有没有权限,没有就去申请。申请时会触发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相关推荐

  1. android11 动态设置屏幕旋转方向

    1.需求 客户动态设置屏幕的旋转方向,下次开机保持设置的屏幕方向,开关机动画也要跟着旋转. 2.分析 如果开关机动画也要跟着旋转,就不跟再LocalDisplayAdapter.java里面改了,因为 ...

  2. 【Android RTMP】NV21 图像旋转处理 ( 问题描述 | 图像顺时针旋转 90 度方案 | YUV 图像旋转细节 | 手机屏幕旋转方向 )

    文章目录 安卓直播推流专栏博客总结 一. NV21 图像格式与 Camera图像传感器方向问题 二. NV21 图像格式视频旋转 1. 图像旋转问题及解决方案 ( 顺时针旋转 90 度 ) 2. NV ...

  3. 在Android的 设置-显示 中增加控制屏幕旋转方向的选项

    在Android的 设置->显示 中增加控制屏幕旋转方向的选项 参考博文 实现目标 效果局限 代码实现 配置资源文件 界面搭建 功能实现 默认值修改 其他情况 结语 参考博文 Android-x ...

  4. 设置Android默认锁定屏幕旋转

    /*********************************************************************************** 设置Android默认锁定屏幕 ...

  5. android 获得屏幕方向,Android 获取设置屏幕横竖屏

    Android 获取设置屏幕横竖屏 发布时间:2020-08-06 03:23:17 来源:51CTO 阅读:351 作者:huyanruirui 方法一: screenOrientation = a ...

  6. Android 强制设置横屏或竖屏 设置全屏

    Android 强制设置横屏或竖屏 设置全屏 全屏 在Activity的onCreate方法中的setContentView(myview)调用之前添加下面代码 requestWindowFeatur ...

  7. Android 7.1 屏幕旋转流程分析

    Android 7.1   屏幕旋转流程分析 一.概述 Android屏幕的旋转在framework主要涉及到三个类,结构如图 PhoneWindowManager:为屏幕的横竖屏转换的管理类. Wi ...

  8. linux内核怎么修改屏幕旋转方向_树莓派4—屏幕旋转

    配置:树莓派4+raspberry pi系统,HDMI显示,非触屏. 问题:想将屏幕旋转90°,按网上说的, 方法一:在config.txt文件中添加display_rotate=1,或者添加disp ...

  9. android编程:调节视频画面分辨率,Android编程实现屏幕自适应方向尺寸与分辨率的方法...

    本文实例讲述了Android编程实现屏幕自适应方向尺寸与分辨率的方法.分享给大家供大家参考,具体如下: Android 屏幕自适应方向尺寸与分辨率,包括屏幕界面布局.多分辨率支持.获取屏幕尺寸.屏幕横 ...

  10. IOS基础之iPad的屏幕旋转方向判断

    IOS基础之iPad的屏幕旋转方向判断 #pragma mark - 屏幕旋转 - (void)viewWillTransitionToSize:(CGSize)size withTransition ...

最新文章

  1. ios cocopods 安装使用及高级教程
  2. python学习笔记(四)-数据类型
  3. Java拾遗:001 - 重写 equals 和 hashCode 方法
  4. LINUX下直接使用ISO文件
  5. 用vim看代码的常用指令
  6. 前端学习(752):全局变量和局部变量
  7. 《Java8实战》笔记(05):使用流
  8. Flutter进度条Flutter圆形进度条Flutter条形进度条Flutter Progress进度条LinearProgressIndicator
  9. VueGoogleMaps在vue中的使用
  10. 基本功:超全面 IO 流教程,小白也能看懂
  11. python 循环语句结果存储_Hello,Python!小鲸教你学Python(八)条件语句和循环
  12. Oracle的where子句
  13. image 搜索docker_docker images命令-列出image
  14. UVA1025 Thematic Contests
  15. 网络文件常常提到类似./run.sh的数据,这个命令的意义是什么?
  16. 计算有效时间的时间戳
  17. python 微信公众号发文章_如何使用 Python 爬取微信公众号文章
  18. 数学方法生成六位随机数
  19. java电话面试_记一次java电话面试
  20. 性能问题从发现到优化一般思路

热门文章

  1. 树上战争 HDU - 2545
  2. 需求分析及技术方案设计
  3. 开启Windows卓越性能模式
  4. 文章刚刚开源就被培训机构“BP”了,过于不要脸
  5. 对人工智能的初步认识
  6. 配置vhost、https、重定向
  7. c语言给程序加锁,C语言使用fcntl对文件加锁
  8. 眼图测试(硬件测试、信号完整性测试)
  9. 如何求解最大公约数和最小公倍数
  10. WordPress外贸网站速度优化的四个层次