Fix the camera preview demo.
The preview size will be checked now in Camera HAL. So, we change the code to get the supported preview sizes and find one of the size that match the surface's width and height.
This commit is contained in:
@@ -19,24 +19,27 @@ package com.example.android.apis.graphics;
|
|||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.hardware.Camera;
|
import android.hardware.Camera;
|
||||||
|
import android.hardware.Camera.Size;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.view.SurfaceHolder;
|
import android.view.SurfaceHolder;
|
||||||
import android.view.SurfaceView;
|
import android.view.SurfaceView;
|
||||||
import android.view.Window;
|
import android.view.Window;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
// ----------------------------------------------------------------------
|
// ----------------------------------------------------------------------
|
||||||
|
|
||||||
public class CameraPreview extends Activity {
|
public class CameraPreview extends Activity {
|
||||||
private Preview mPreview;
|
private Preview mPreview;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
|
|
||||||
// Hide the window title.
|
// Hide the window title.
|
||||||
requestWindowFeature(Window.FEATURE_NO_TITLE);
|
requestWindowFeature(Window.FEATURE_NO_TITLE);
|
||||||
|
|
||||||
// Create our Preview view and set it as the content of our activity.
|
// Create our Preview view and set it as the content of our activity.
|
||||||
mPreview = new Preview(this);
|
mPreview = new Preview(this);
|
||||||
setContentView(mPreview);
|
setContentView(mPreview);
|
||||||
@@ -49,10 +52,10 @@ public class CameraPreview extends Activity {
|
|||||||
class Preview extends SurfaceView implements SurfaceHolder.Callback {
|
class Preview extends SurfaceView implements SurfaceHolder.Callback {
|
||||||
SurfaceHolder mHolder;
|
SurfaceHolder mHolder;
|
||||||
Camera mCamera;
|
Camera mCamera;
|
||||||
|
|
||||||
Preview(Context context) {
|
Preview(Context context) {
|
||||||
super(context);
|
super(context);
|
||||||
|
|
||||||
// Install a SurfaceHolder.Callback so we get notified when the
|
// Install a SurfaceHolder.Callback so we get notified when the
|
||||||
// underlying surface is created and destroyed.
|
// underlying surface is created and destroyed.
|
||||||
mHolder = getHolder();
|
mHolder = getHolder();
|
||||||
@@ -82,11 +85,49 @@ class Preview extends SurfaceView implements SurfaceHolder.Callback {
|
|||||||
mCamera = null;
|
mCamera = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
|
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
|
||||||
// Now that the size is known, set up the camera parameters and begin
|
// Now that the size is known, set up the camera parameters and begin
|
||||||
// the preview.
|
// the preview.
|
||||||
Camera.Parameters parameters = mCamera.getParameters();
|
Camera.Parameters parameters = mCamera.getParameters();
|
||||||
parameters.setPreviewSize(w, h);
|
|
||||||
|
List<Size> sizes = parameters.getSupportedPreviewSizes();
|
||||||
|
Size optimalSize = getOptimalPreviewSize(sizes, w, h);
|
||||||
|
parameters.setPreviewSize(optimalSize.width, optimalSize.height);
|
||||||
|
|
||||||
mCamera.setParameters(parameters);
|
mCamera.setParameters(parameters);
|
||||||
mCamera.startPreview();
|
mCamera.startPreview();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user