Bạn ca sử dụng SurfaceView
để chụp ảnh
package com.camera;
import java.io.IOException;
import android.app.Activity;
import android.content.Intent;
import android.hardware.Camera;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class Camera_capture extends Activity implements SurfaceHolder.Callback {
private Camera mCamera;
private SurfaceView surfaceView;
private SurfaceHolder surfaceHolder;
private Button capture_image;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.camera_layout);
capture_image = (Button) findViewById(R.id.capture_image);
capture_image.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
capture();
}
});
surfaceView = (SurfaceView) findViewById(R.id.surfaceview);
surfaceHolder = surfaceView.getHolder();
surfaceHolder.addCallback(Camera_capture.this);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
try {
mCamera = Camera.open();
mCamera.setPreviewDisplay(surfaceHolder);
mCamera.startPreview();
} catch (IOException e) {
e.printStackTrace();
}
}
private void capture() {
mCamera.takePicture(null, null, null, new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
Toast.makeText(getApplicationContext(), "Picture Taken",
Toast.LENGTH_SHORT).show();
Intent intent = new Intent();
intent.putExtra("image_arr", data);
setResult(RESULT_OK, intent);
camera.stopPreview();
if (camera != null) {
camera.release();
mCamera = null;
}
finish();
}
});
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
Log.e("Surface Changed", "format == " + format + ", width === "
+ width + ", height === " + height);
try {
mCamera.setPreviewDisplay(holder);
mCamera.startPreview();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
Log.e("Surface Created", "");
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
Log.e("Surface Destroyed", "");
}
@Override
protected void onPause() {
super.onPause();
if (mCamera != null) {
mCamera.stopPreview();
mCamera.release();
}
}
}
Và file layout sẽ
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<SurfaceView
android:id="@+id/surfaceview"
android:layout_width="fill_parent"
android:layout_weight="100"
android:layout_height="wrap_content" />
<Button
android:id="@+id/capture_image"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Capture" />
</LinearLayout>
Bắt đầu hoạt động này Camera_capture
với startActivityForResult
và onActivityResult
bạn có thể nhận hình ảnh dưới dạng byte
mảng dưới dạng
byte[] image = data.getExtras().getByteArray("image_arr");
trong đó data
là dữ liệu nhận được.
Giải mã các byte
mảng để Bitmap
sử dụng
Bitmap bmp = BitmapFactory.decodeByteArray(image, 0,
image.length);
tại thiết lập này Bitmap
Sửa
Như có một số vấn đề trong khi trở về byte[]
, các byte[]
nên tiết kiệm trong một tập tin và p a của tập tin sẽ được gửi đến Activity
trước đó để tập tin có thể được đọc.
Trong onPictureTaken()
, chỉ cần thêm
String PATH = "Any path to store a file";
try {
FileOutputStream fos=new FileOutputStream(PATH);
fos.write(data);
fos.close();
}
catch (java.io.IOException e) {
}
và ở vị trí của:
intent.putExtra("image_arr", data);
ghi
intent.putExtra("image_path", PATH);
và nhận con đường này trong trước Activity
's onActivityResult
như:
String imagePath = data.getExtras().getString("image_path");
Cảm ơn! Điều này đã cho tôi một ý tưởng tốt như thế nào nó sẽ làm việc. Tôi nhận thấy rằng bằng cách sử dụng đoạn mã trên, hình ảnh được xoay 90 độ và sau khi gọi xong() độ nhạy không đóng, vì vậy nó không bao giờ quay trở lại hoạt động chính - ứng dụng bị treo ... – fritz
welcome .. :) Vui lòng trợ giúp .. –
sẽ kiểm tra sự cố của bạn. –