Android 判断横屏还是竖屏以及设置方式

本文介绍两种获取Android设备屏幕方向的方法及如何通过配置AndroidManifest.xml文件或使用Java代码来固定应用的屏幕显示方向。

方法一:

1 DisplayMetrics dm = new DisplayMetrics();
2         getWindowManager().getDefaultDisplay().getMetrics(dm);
3         int width = dm.widthPixels;
4         int height = dm.heightPixels;

判断宽高那个大

方法二:

1 if(this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT)
2         // 竖屏
3             // doSomrthing
4         else
5         {
6             // 横屏时dosomething
7         }

 设置:

方法一:在AndroidManifest.xml中配置

如果不想让软件在横竖屏之间切换,最简单的办法就是在项目的AndroidManifest.xml中找到你所指定的activity中加上android:screenOrientation属性,他有以下几个参数:

"unspecified":默认值 由系统来判断显示方向.判定的策略是和设备相关的,所以不同的设备会有不同的显示方向. 
"landscape":横屏显示(宽比高要长) 
"portrait":竖屏显示(高比宽要长) 
"user":用户当前首选的方向 
"behind":和该Activity下面的那个Activity的方向一致(在Activity堆栈中的) 
"sensor":有物理的感应器来决定。如果用户旋转设备这屏幕会横竖屏切换。 
"nosensor":忽略物理感应器,这样就不会随着用户旋转设备而更改了("unspecified"设置除外)。


方法二:在java代码中设置

设置横屏代码:setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//横屏

设置竖屏代码:setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//竖屏

因为横屏有两个方向的横法,而这个设置横屏的语句,如果不是默认的横屏方向,会把已经横屏的屏幕旋转180°。

所以可以先判断是否已经为横屏了,如果不是再旋转,不会让用户觉得转的莫名其妙啦!代码如下:

if(this.getResources().getConfiguration().orientation ==Configuration.ORIENTATION_PORTRAIT){
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
<think>嗯,用户这次的问题是关于Android判断视频是横屏还是播放的方法。用户提供了三个站内引用,但看起来这些引用主要讨论的是Activity幕方向的设置判断,而不是直接针对视频播放的方向判断。 用户似乎混淆了Activity方向和视频方向这两个概念。Activity方向是指整个应用界面的显示方向,而视频方向是指视频内容本身的宽高比特性。我需要明确区分这两点,因为解决方法完全不同。 从技术角度看,视频方向的判断应该基于视频文件的元数据,特别是宽高比。视频通常是9:16的宽高比,横屏则是16:9或更宽。这个信息可以通过MediaMetadataRetriever类来获取。 考虑到用户可能需要在不同场景下使用这个功能,我准备提供三种典型方案: 第一个方案最简单,直接比较宽高值,适用于快速判断; 第二个方案更精确,使用宽高比阈值来判断,能适应不同分辨率的情况; 第三个方案最专业,通过MediaMetadataRetriever获取准确的旋转角度信息,这个信息通常由拍摄设备写入。 用户提供的引用中,[1]和[3]提到的configChanges属性确实能防止Activity重建,但这属于界面方向处理的优化点,在判断视频方向时可能用不到。引用[2]提到的Unity相关方法也不适用当前场景。 为了帮助用户深入理解,我决定额外说明如何将视频方向与Activity方向结合使用的最佳实践。比如当检测到视频是横屏时,可以建议用户将Activity锁定为横屏以获得更好体验。 最后准备的问题要围绕视频元数据获取、实际应用场景和常见问题排查这些实用方向来设计,这样能帮助用户应对后续开发中可能遇到的困难。 </think>在Android判断视频是横屏还是播放,核心是通过分析视频的**宽高比**或**元数据中的旋转角度**来实现。以下是三种常用方法: --- ### 方法1:直接比较宽高(适用于未旋转的视频) ```java // 获取视频宽高 int videoWidth = mediaPlayer.getVideoWidth(); int videoHeight = mediaPlayer.getVideoHeight(); // 判断横屏/ if (videoWidth > videoHeight) { Log.d("Orientation", "视频为横屏 (Landscape)"); } else if (videoHeight > videoWidth) { Log.d("Orientation", "视频为 (Portrait)"); } else { Log.d("Orientation", "视频为正方形"); } ``` --- ### 方法2:通过宽高比阈值判断(更精确) ```java float aspectRatio = (float) videoWidth / videoHeight; // 设定阈值(通常横屏>1.3,<0.7) if (aspectRatio > 1.3f) { Log.d("Orientation", "横屏视频"); } else if (aspectRatio < 0.7f) { Log.d("Orientation", "视频"); } else { Log.d("Orientation", "接近正方形视频"); } ``` --- ### 方法3:解析视频旋转元数据(最准确) 使用 `MediaMetadataRetriever` 获取视频的旋转角度: ```java MediaMetadataRetriever retriever = new MediaMetadataRetriever(); retriever.setDataSource(videoPath); String rotation = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION); if (rotation != null) { int rotateAngle = Integer.parseInt(rotation); // 根据旋转角度判断 if (rotateAngle == 90 || rotateAngle == 270) { Log.d("Orientation", "实际为视频(被旋转存储)"); } else { Log.d("Orientation", "横屏视频"); } } retriever.release(); ``` --- ### 关键说明 1. **为何需要方法3?** 手机拍摄的视频可能被存储为横屏+旋转标记(如90°旋转),此时若仅用宽高比判断会错误识别为横屏[^1]。 2. **Activity方向与视频方向的区别** ```xml <!-- Activity方向控制(Manifest声明) --> android:screenOrientation="portrait" <!-- 强制 --> ``` 此设置仅影响Activity容器,与视频内容方向无关[^3]。 --- ### 完整流程建议 ```mermaid graph TD A[获取视频路径] --> B[用MediaMetadataRetriever解析旋转角度] B --> C{角度是否存在?} C -->|是| D[按角度修正宽高比] C -->|否| E[直接计算宽高比] D & E --> F[根据阈值判断方向] ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值