我开发了一个小应用程序,用于全屏显示摄像头预览.我正在使用Camera API.
这是活动布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- This is the container for the camera preview screen -->
<FrameLayout android:id="@+id/camera_preview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
当设备处于纵向状态时,显示器将垂直缩放以匹配设备屏幕的高度 - 因此纵横比与本机相机的纵横比不同.这些是2张图片,更好地解释了我所说的内容:


第一张图像是使用原生相机设备制作的.第二张图片是用我的应用程序制作的,相机全屏 - 图像歪斜,拉伸以适应屏幕.
无论getSupportedPreviewSizes()mehod 提供的预览尺寸和无失真,我都需要将相机预览设置为全屏.有没有办法实现这个目标?当相机预览全屏时,有没有办法保持适当的宽高比?我希望这可以通过操作系统自动完成 - 裁剪图像以匹配所请求的分辨率,同时保持宽高比,但这不会发生.
我试图使SurfaceView显示器大于显示器(遵循这个问题:将相机预览适合大于显示器的SurfaceView),但在我的情况下不行,因为我捕获快照(6帧/秒)和那些不是用户在屏幕上看到的内容(框架包含所有相机预览,即使并非所有相机都在屏幕上可见).
我在这里发布:https://www.dropbox.com/s/3d52xt8kazynsae/CameraFullScreen.7z?v = 0mcn我做的整个项目.
任何想法/解决方案对我来说都非常重要.非常感谢.
================================================== ======================
由于ss1271答案更新:
我将分析你为三星Galaxy Ace II上面写的一些分辨率.
I.屏幕分辨率:480x800 - 宽高比3:5 = 0,6
II.getSupportedPreviewSizes - 我几乎可以肯定这些值来自后置摄像头.以下是这些决议的方面比率:
2560x1920 - 0,75
2560x1536 - 0,60
2048x1536 - 0,75
2048x1232 - …Run Code Online (Sandbox Code Playgroud) 我试图让相机预览在纵向模式下正常工作,其中活动本身可以正常改变方向(即,不被锁定到风景).
但是,使用setDisplayOrientation()严重打破了预览的行为.
这可以通过谷歌自己的ApiDemos来证明.第一个图像基于示例项目CameraPreview的android-17版本ApiDemos,其中我做的唯一更改是android:orientation="landscape"从清单中的此活动的条目中删除.下图是运行Android 4.2的Nexus 4显示屏上显示的内容的屏幕截图,相机指向一张8.5平方英寸的纸张:

该预览中不明显的是它旋转了90度.您在图像最右侧看到的袜子包裹的脚实际上位于正方形下方.
对此,至少对于横向模式,解决方案是使用setDisplayOrientation().但是,如果修改了Preview内部类的CameraPreview有mCamera.setDisplayOrientation(90);,你会得到这样的:

值得注意的是,广场不再是正方形.
它使用与SurfaceView以前相同的大小.我已经使用其他一些代码重现了这个场景ApiDemos,并且我TextureView在该代码中得到了相同的行为.
我简单地想到问题可能是getSupportedPreviewSizes()基于可能会返回不同的值setDisplayOrientation(),但快速测试表明情况并非如此.
任何人都知道如何setDisplayOrientation()在纵向模式下工作而不会破坏图像的宽高比推到预览中?
谢谢!