Я разрабатываю приложение для Android, которое использует API камеры, используя HTC EVO в качестве моего устройства для тестирования.Независимо от того, что я пробовал до сих пор, предварительный просмотр камеры выглядит правильно только в альбомном режиме (поворот на 90 градусов, если быть точным).Кажется, что нет возможности правильно сориентировать предварительный просмотр в портретном режиме (поворот на 0 градусов).
Приложение камеры по умолчанию на устройстве (для HTC Sense) позволяет без каких-либо проблем вращать любой вид, поэтому я знаю, что нет никаких аппаратных ограничений.Я даже скачал некоторый исходный код с сайта HTC для разработчиков , но, видимо, все это в ядре C -
Может кто-нибудь указать мне правильное направление для решения этой проблемы?Есть ли способ правильно повернуть предварительный просмотр в Android 2.1 или 2.2?
Спасибо.
PS Вот код, который я использую, на случай, если он поможет ...
package spikes.cameraSpike03;
import java.util.List;
import android.app.Activity;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.hardware.Camera.Size;
import android.os.Bundle;
import android.util.Log;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.Window;
import android.view.WindowManager;
public class MainActivity extends Activity implements SurfaceHolder.Callback {
private static final String LOG_TAG = "spikes.cameraSpike03 - MainActivity";
private Camera _camera;
private boolean _previewIsRunning = false;
private SurfaceView _svCameraView;
private SurfaceHolder _surfaceHolder;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setFormat(PixelFormat.TRANSLUCENT);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.main);
_svCameraView = (SurfaceView)findViewById(R.id.svCameraView);
_surfaceHolder = _svCameraView.getHolder();
_surfaceHolder.addCallback(this);
_surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
if(_previewIsRunning){
_camera.stopPreview();
}
try{
Camera.Parameters parameters = _camera.getParameters();
//Get the optimal preview size so we don't get an exception when setting the parameters
List<Size> supportedPreviewSizes = parameters.getSupportedPreviewSizes();
Size optimalPreviewSize = getOptimalPreviewSize(supportedPreviewSizes, width, height);
parameters.setPreviewSize(optimalPreviewSize.width, optimalPreviewSize.height);
_camera.setParameters(parameters);
_camera.setPreviewDisplay(holder);
}
catch(Exception ex){
ex.printStackTrace();
Log.e(LOG_TAG, ex.toString());
}
_camera.startPreview();
_previewIsRunning = true;
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
_camera = Camera.open();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
_camera.stopPreview();
_previewIsRunning = false;
_camera.release();
}
private Size getOptimalPreviewSize(List<Size> sizes, int w, int h) {
final double ASPECT_TOLERANCE = 0.05;
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) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}
// Cannot find the one match the aspect ratio, ignore the requirement
if (optimalSize == null) {
minDiff = Double.MAX_VALUE;
for (Size size : sizes) {
if (Math.abs(size.height - targetHeight) < minDiff) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}
}
return optimalSize;
}
}