我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android判断机器默认屏幕方向

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android判断机器默认屏幕方向

1.需求

最近接到一个需求,根据机器默认屏幕方向(开机时的方向)定制系统软键盘,横屏机器用横屏布局,竖屏机器用竖屏布局。
实现这个需求的必要条件,是要准确判断机器的默认屏幕方向。

2.屏幕方向判断(一)

印象中Android有API可以判断屏幕方向,代码贴出来:

public boolean isLand(Context context) {
        Configuration mConfiguration = context.getResources().getConfiguration();
        int orientation = mConfiguration.orientation;
        Log.d(TAG, "orientation " + orientation);
        if (orientation == mConfiguration.ORIENTATION_LANDSCAPE) {
            return true;
        }
        return false;
    }

测试发现,如果应用强制横屏,这个值就是横屏,如果强制竖屏,这个值就是竖屏。
事实上,这个API返回的是当前屏幕的显示方向,不能用来判断机器默认的屏幕方向。

Tips 强制设置屏幕方向的方法

方法1:
在AndroidManifest.xml中指定的Activity里面加上android:screenOrientation

android:screenOrientation="portrait"

属性简介:
”landscape":横屏显示
“portrait”:竖屏显示
“user”:用户当前首选的方向
“behind”:和该Activity以下的那个Activity的方向一致(在Activity堆栈中的)
“sensor”:由sensor传感器来决定。
“nosensor”:忽略传感器。

方法2:
在Activity的onCreate方法里面实现

```java
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); //强制竖屏
        //setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); //强制横屏
		... ...
    }
3.继续分析

看下Android跟显示有关的属性:
在这里插入图片描述
没有找到相关的属性表示机器默认屏幕方向。

再尝试下wm size命令:
在这里插入图片描述
测试发现,无论应用强制横屏还是强制竖屏,这个值读出来都不会变化。
接下来就有思路了,我们分析下这条命令的代码实现。
frameworks/base/cmds/wm/class="lazy" data-src/com/android/commands/wm/Wm.java

    @Override
    public void onRun() throws Exception {
        mWm = IWindowManager.Stub.asInterface(ServiceManager.checkService(
                        Context.WINDOW_SERVICE));
        if (mWm == null) {
            System.err.println(NO_SYSTEM_ERROR_CODE);
            throw new AndroidException("Can't connect to window manager; is the system running?");
        }
        String op = nextArgRequired();
        if (op.equals("size")) {
            runDisplaySize();// wm size的分支
        }
		... ...
    }
    private void runDisplaySize() throws Exception {
        String size = nextArg();
        int w, h;
        if (size == null) {
            Point initialSize = new Point();
            Point baseSize = new Point();
            try {
                mWm.getInitialDisplaySize(Display.DEFAULT_DISPLAY, initialSize);
                mWm.getBaseDisplaySize(Display.DEFAULT_DISPLAY, baseSize);
                System.out.println("Physical size: " + initialSize.x + "x" + initialSize.y);
                if (!initialSize.equals(baseSize)) {
                    System.out.println("Override size: " + baseSize.x + "x" + baseSize.y);
                }
            } catch (RemoteException e) {
            }
            return;
        }
		... ...
    }

分析下来,源码其实比较简单,直接调用WindowManagerService的getInitialDisplaySize方法。

4.屏幕方向判断(二)

根据前面的分析,我们直接参考wm size命令的源码,就可以实现判断默认屏幕方向的需求了。
代码示例:

//注意:工程需要导入layout.lib
//需要导入的包
import android.graphics.Point;
import android.os.ServiceManager;
import android.view.Display;
import android.view.IWindowManager;
    public boolean isLandScapeModel() {
        boolean result = false;
        try {
            Point initialSize = new Point();
            IWindowManager mWm = IWindowManager.Stub.asInterface(ServiceManager.checkService(Context.WINDOW_SERVICE));
            mWm.getInitialDisplaySize(Display.DEFAULT_DISPLAY, initialSize);
            Log.d(TAG, "Physical size: " + initialSize.x + "x" + initialSize.y);
            if (initialSize.x > initialSize.y) {
                result = true;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

作者:zhangchao2280


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android判断机器默认屏幕方向

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android判断机器默认屏幕方向

1.需求 最近接到一个需求,根据机器默认屏幕方向(开机时的方向)定制系统软键盘,横屏机器用横屏布局,竖屏机器用竖屏布局。 实现这个需求的必要条件,是要准确判断机器的默认屏幕方向。 2.屏幕方向判断(一) 印象中Android有API可以判断
2022-06-06

Android 判断屏幕开关状态方式总结

Android判断屏幕开关状态 方法一:使用系统服务PowerManager pm= (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);if(!pm.isScr
2022-06-06

Android判断屏幕是横屏或是竖屏的简单实现方法

本文所述为一个Android的常用技巧代码,主要用于判断手机屏幕是横向或是竖向的,在判断屏幕水平或垂直后你可以对程序做出相应的响应,该实例代码只是判断是否为竖屏,若判断正确返回true,否则返回false。 具体的程序代码如下:packag
2022-06-06

win8系统屏幕显示方向调节教程(默认为横向显示)

一般情况下我们的电脑屏幕都是横向显示的,有些时候如果这么显示就会有些不是很方便,而win8系统的屏幕显示方向是可以调节的,这时候我们只要经过几部简单设置就能调节到我们需要显示的方向。下面百事网小编就和大家分享一下设置教程。 1.鼠标右击桌面
2022-06-04

Android改变手机屏幕朝向的方法

本文实例讲述了Android改变手机屏幕朝向的方法。分享给大家供大家参考。具体如下: 模拟当点击按钮时,使手机朝向发生改变。 main.xml布局文件:
2022-06-06

android 如何设置开机后屏幕亮度默认值为自动调节

在第一次开机后,设置>显示>自动亮度调节 默认是勾选上的。 修改 alps\frameworks\base\packages\SettingsProvider\res\values\defaults.xml 内的 2022-06-06

android判断相机图片朝向的简单方法

android应用里使用相机图片时必须要考虑的一个问题就是图片朝向,只有判断对朝向才能调整图片从而更好的展现。本文将介绍一种通过ExifInterface判断图片朝向的方法!上代码:/** * * 利用给定路径下的图片设置ImageVie
2023-05-31

Android判断NavigationBar是否显示的方法(获取屏幕真实的高度)

有些时候,我们需要知道当前手机上是否显示了NavigationBar,也就是屏幕底部的虚拟按键。 比如截屏的时候,要获取屏幕的高度,必须包括NavigationBar的高度。 试过网上的多种方法,但是对那种可以通过手势来显示/隐藏的Navi
2022-06-06

Android编程基于距离传感器控制手机屏幕熄灭的方法详解

本文实例讲述了Android编程基于距离传感器控制手机屏幕熄灭的方法。分享给大家供大家参考,具体如下:在现实生活中,打电话的时候手机挨着自己的头,屏幕会熄灭,这是为了不让自己的头按到什么手机键~这个功能可以使用距离传感器来实现P-Senso
2023-05-30

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录