Vic*_*cky 1 android surfaceview android-camera
我正在创建一个应用程序,我在surfaceview中使用相机.问题是在相机中拍摄照片后,它会继续显示拍摄的照片无法拍摄下一张照片,但拍摄的图像会存储在文件路径中.我需要的是在surfaceview中捕获图像后,它应该自动重新加载相机以拍摄下一个.
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.camera);
preview = (SurfaceView) findViewById(R.id.preview);
previewHolder = preview.getHolder();
previewHolder.addCallback(surfaceCallback);
previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
button = (Button)findViewById(R.id.capture);
button.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
camera.takePicture(null, null, photoCallback);
}
});
}
SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() {
public void surfaceCreated(SurfaceHolder holder) {
camera = Camera.open();
}
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
try {
camera.setPreviewDisplay(previewHolder);
camera.setDisplayOrientation(90);
camera.startPreview();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void surfaceDestroyed(SurfaceHolder holder) {
camera.stopPreview();
camera.release();
camera = null;
}
};
Camera.PictureCallback photoCallback = new Camera.PictureCallback() {
public void onPictureTaken(byte[] data, Camera camera1) {
Bitmap bitmapPicture = BitmapFactory.decodeByteArray(data, 0,
data.length);
Matrix matrix = new Matrix();
matrix.postRotate(90);
Bitmap rotatedBitmap = Bitmap.createBitmap(bitmapPicture, 0, 0,
bitmapPicture.getWidth(), bitmapPicture.getHeight(),
matrix, true);
String root = Environment.getExternalStorageDirectory().toString();
File myDir = new File(root + "/saved_images");
myDir.mkdirs();
Date d = new Date();
CharSequence dateOfShot = DateFormat.format("ddMMyyhhmmss", d.getTime());
String fname = "Image-" + dateOfShot + ".jpg";
File file = new File(myDir, fname);
if (file.exists())
file.delete();
try {
FileOutputStream out = new FileOutputStream(file);
rotatedBitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
out.flush();
out.close();
} catch (Exception e) {
Log.e(TAG,Log.getStackTraceString(e));
e.printStackTrace();
}
camera.stopPreview();
previewHolder.removeCallback(surfaceCallback);
camera.release();
camera = Camera.open();
previewHolder.addCallback(surfaceCallback);
}
};
Run Code Online (Sandbox Code Playgroud)
你需要添加
camera.startPreview();
Run Code Online (Sandbox Code Playgroud)
到onPictureTaken方法的结尾
@Override
public void onPictureTaken(byte[] data, Camera camera) {
//your existing code here
camera.startPreview();
}
Run Code Online (Sandbox Code Playgroud)
此方法仅在预览处于活动状态时(startPreview()之后)有效.拍摄图像后将停止预览; 如果呼叫者想要重新开始预览或拍摄更多照片,则必须再次调用startPreview().不应在start()和stop()之间调用它.
调用此方法后,在返回JPEG回调之前,不得调用startPreview()或拍摄另一张照片.
| 归档时间: |
|
| 查看次数: |
3043 次 |
| 最近记录: |