我们创建了一个基于android.hardware.Camera
类的自定义相机。
当我们按下“拍照”按钮时,预期的行为是拍摄照片并在查看屏幕上查看仍拍摄的照片。但是,当我们进入查看屏幕时,相机仍可正常工作/取景器正在显示“实时”拍摄(而不是静态查看)。
看起来持有人不起作用。
在某些Samsung Galaxy S3
手机上观察到这种情况(GT-I9300
);但奇怪的是在所有其他模型上一切正常(静止图像出现在评论屏幕中)。
答案 0 :(得分:3)
到目前为止,我的解决方案是创建一个布局,其中视图占据与surfaceview相同的视图。
然后我得到预览的视图边界(在我的情况下,它是屏幕的大小)
//Get our screen size
Display display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE))
.getDefaultDisplay();
DisplayMetrics metrics = getResources().getDisplayMetrics();
Point size = new Point();
try {
display.getSize(size);
w_width = size.x;
w_height = size.y;
} catch (NoSuchMethodError e) {
w_width = display.getWidth();
w_height = display.getHeight();
}
然后我将回调设置为:
callback = new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] bytes, Camera camera) {
//Get the view bounds to determine how to manipulate this image
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeByteArray(bytes, 0, bytes.length, options);
//If the image is smaller than the screen, don't make the image bigger
int finalWidth = (w_width < options.outWidth) ? w_width : options.outWidth;
int finalHeight = (w_height < options.outHeight) ? w_height : options.outHeight;
int inSampleSize = 1;
options = new BitmapFactory.Options();
if (finalHeight > w_height || finalWidth > w_width) {
// Calculate ratios of height and width to requested height and width
final int heightRatio = Math.round((float) finalHeight / (float) w_height);
final int widthRatio = Math.round((float) finalWidth / (float) w_width);
// Choose the smallest ratio as inSampleSize value, this will guarantee
// a final image with both dimensions larger than or equal to the
// requested height and width.
inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
}
options.inSampleSize = inSampleSize;
//Decode the smaller image
Bitmap b = BitmapFactory.decodeByteArray(bytes, 0, bytes.length, options);
//Rotate the image correctly
Matrix mat = new Matrix();
mat.postRotate(orientation);
Bitmap newBitmap = Bitmap.createBitmap(b, 0, 0, options.outWidth, options.outHeight, mat, true);
imagePreview.setBackgroundDrawable(new BitmapDrawable(newBitmap));
imagePreview.setVisibility(View.VISIBLE);
}
};
所以基本上表面视图永远不会停止显示预览,但是imageview隐藏了它,因此用户无法看到它。
然后,如果用户决定不保留图像,那么我只是重新隐藏视图,而SurfaceView将继续显示实时预览。幸运的是,GS3似乎并不介意有人打电话给“camera.startPreview();”即使预览已经发生。
我真的不喜欢这个答案,但我现在所拥有的只是在银河系S3上工作。它已经在我尝试的旧设备(2.3及更高版本)上工作,但它绝对只是一种解决方法。