我正在使用预览来显示相机在屏幕上看到的内容.
我可以使一切工作正常,表面创建,表面设置和表面显示.
但是,在纵向模式下,它始终以不正确的90度角显示图像.
如图中所示:

我知道使用以下代码将直接设置图片:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
Run Code Online (Sandbox Code Playgroud)
但是我在Activity中有预览,其中包含其他元素,并且我的Activity在横向模式下显示没有意义.(默认禁用)
所以我想知道是否只是改变预览的方向?并在"纵向"模式下正确显示我的其余活动?
或者无论如何旋转预览以便正确显示?
好的,我有一个扩展SurfaceView和覆盖的类
surfaceChanged - 只需调用startPreview
surfaceCreated - 打开相机,编辑params*,设置surfaceHolder
surfaceDestroyed - 调用stopPreview,释放相机
这一切都很有效,因为当方向是肖像:
来自surfaceCreated*
m_camera = Camera.open();
Camera.Parameters p = m_camera.getParameters();
if (getResources().getConfiguration().orientation !=
Configuration.ORIENTATION_LANDSCAPE)
{
p.set("orientation", "portrait");
// CameraApi is a wrapper to check for backwards compatibility
if (CameraApi.isSetRotationSupported())
{
CameraApi.setRotation(p, 90);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,每次方向改变时,它都会调用Camera.open()......正如您所知,这是一项非常昂贵的操作,导致转换不是那么顺利.
当我强制定位到横向时,预览很棒.创建只调用一次,因为预览是横向的,相机始终是用户看到的.但是,我需要一种方法来设置纵向拍摄时实际拍摄的照片的方向.当我强制横向渲染时,表面永远不会被重新创建,并且当相机以纵向方式保持时,参数永远不会被设置.
那么如何才能完成以下任一项(专门)?
当方向发生变化时,保持 onDestroy和onCreate之间的m_camera,以便过渡平滑
强制风景和检测方向改变另一种方式...旋转最终的snaped图片,如果保持纵向.
此外,如果我离开基地,有人能指出我更好的方向吗?谢谢.
android smartphone orientation android-sdk-2.1 android-camera

注意相机的视图(不是被捕获的图像)是如何向左翻转的(上图),方向Activity是正确的,但相机视图搞砸了,请帮帮我们:)谢谢.
这是XML布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center|top"
android:orientation="vertical" >
<SurfaceView
android:id="@+id/camerapreview"
android:layout_margin="10dp"
android:layout_width="300dp"
android:layout_height="300dp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
以下是活动的代码:
public class CustomCameraActivity extends Activity implements SurfaceHolder.Callback {
Camera camera;
SurfaceView surfaceView;
SurfaceHolder surfaceHolder;
boolean previewing = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.camera);
surfaceView = (SurfaceView)findViewById(R.id.camerapreview);
surfaceHolder = surfaceView.getHolder();
surfaceHolder.addCallback(this);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) …Run Code Online (Sandbox Code Playgroud) 当我通过MediaRecorder录制视频时,它始终以横向模式录制,无论实际的设备方向如何.如何强制MediaRecorder/Camera使用真正的方向?
我已经查看了一些关于使用表面视图更改相机方向的帖子,但我从以下示例中获取了代码:
http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/CameraPreview.html
提供尺寸的功能看起来像这样......
private Size getOptimalPreviewSize(List<Size> sizes, int w, int h) {
final double ASPECT_TOLERANCE = 0.1;
double targetRatio = (double) w / h;
if (sizes == null) return null;
Size optimalSize = null;
double minDiff = Double.MAX_VALUE;
int targetHeight = h;
// Try to find an size match aspect ratio and size
for (Size size : sizes) {
double ratio = (double) size.width / size.height;
if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue;
if (Math.abs(size.height - targetHeight) < minDiff) { …Run Code Online (Sandbox Code Playgroud) 我正在尝试制作自定义视频应用.我只使用清单2.2中的设置(API 8).
一切顺利,但我不明白为什么肖像模式视频与lanscape视频没有区别.
为了检测设备改变的方向,我在surfaceChanged()中使用此代码
if (mCamera != null) {
Camera.Parameters p = mCamera.getParameters();
try {
mCamera.stopPreview();
} catch (Exception e) {
// TODO: handle exception
}
int previewWidth = 0;
int previewHeight = 0;
if (mPreviewSize != null) {
Display display = ((WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
int rotation = display.getRotation();
switch (rotation) {
case Surface.ROTATION_0:
previewWidth = mPreviewSize.height;
previewHeight = mPreviewSize.width;
mCamera.setDisplayOrientation(90);
break;
case Surface.ROTATION_90:
previewWidth = mPreviewSize.width;
previewHeight = mPreviewSize.height;
mCamera.setDisplayOrientation(0);
break;
case Surface.ROTATION_180:
previewWidth = mPreviewSize.height;
previewHeight …Run Code Online (Sandbox Code Playgroud)