android控制手机拍照代码,android Camera开发-手机拍照流程

android 拍照API流程

1. 在布局文件中添加一个 surfaceView (摄影平面)

2.根据 SurfaceView  获得 Holder (固定器)

3.给固定器设置 SurfaceHolder.Callback ; 这个 Callback 有一系列的周期方法,

比如:surfaceCreated,surfaceChanged,surfaceDestroyed等方法.

①.在surfaceDestroyed 中 打开相机,设置预览效果 ;

②.在surfaceChanged中可以初始化相机( Camera );比如相机的参数: 像素, 大小,格式,开始预览,等等

③.在surfaceDestroyed可以可以停止相机拍摄;释放相机资源

4. 相机自动对焦 的回调处理

Camera.autoFocus( AutoFocusCallback )AutoFocusCallback 有个接口方法

public void onAutoFocus(boolean focused, Camera camera) {

/* 对到焦点拍照 */

if (focused) {

takePicture();//见第5步

}

}

5.Camera.takePicture(ShutterCallback shutter/*摄像*/, PictureCallback raw/*拍照*/, PictureCallback jpeg/*照片*/)

查看API或者源码,可以发现,这些callback里面都有包含摄像,或者被拍照时的byte[]数据,而这些数据可以根据BitmapFactory变成Bitmap图片.

见源代码如下:public class ScanBarZBarActivity extends Activity implements SurfaceHolder.Callback{

private static String TAG = "ScanBarZBarActivity";

private Camera mCamera;

private Button mButton, mButton1, mButton2;

private SurfaceView mSurfaceView;

private SurfaceHolder holder;

private AutoFocusCallback mAutoFocusCallback = new AutoFocusCallback();

private String path = "WXJSMyPhoto";

private String path1;

private Bitmap bmp;

private int cnt = 1;

private Calendar c;

public native String getISBN(Bitmap bmp);

private int flag=5;

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

/* 隐藏状态栏 */

this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,

WindowManager.LayoutParams.FLAG_FULLSCREEN);

/* 隐藏标题栏 */

requestWindowFeature(Window.FEATURE_NO_TITLE);

/* 设定屏幕显示为横向 */

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

setContentView(R.layout.camera);

/* SurfaceHolder设定 */

mSurfaceView = (SurfaceView) findViewById(R.id.mSurfaceView);

holder = mSurfaceView.getHolder();

holder.addCallback(ScanBarZBarActivity.this);

holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

c = Calendar.getInstance();

/* Button初始化 */

mButton = (Button) findViewById(R.id.myButton);

mButton1 = (Button) findViewById(R.id.myButton1);

mButton2 = (Button) findViewById(R.id.myButton2);

/* 拍照Button的事件处理 */

mButton.setOnClickListener(new Button.OnClickListener() {

@Override

public void onClick(View arg0) {

/* 告动对焦后拍照 */

mCamera.autoFocus(mAutoFocusCallback);

}

});

/* Button的事件处理 */

mButton1.setOnClickListener(new Button.OnClickListener() {

@Override

public void onClick(View arg0) {

/* 保存文件 */

Log.i(TAG,"click button2");

if (bmp != null) {

/* 检查SDCard是否存在 */

if (!Environment.MEDIA_MOUNTED.equals(Environment

.getExternalStorageState())) {

/* SD卡不存在,显示Toast信息 */

Toast.makeText(ScanBarZBarActivity.this,

"SD卡不存在!无法保存相片,请插入SD卡。", Toast.LENGTH_LONG)

.show();

} else {

try {

/* 文件不存在就创建 */

File f = new File(Environment

.getExternalStorageDirectory(), path);

Log.i(TAG,"click button2:" + f.getAbsolutePath());

if (!f.exists()) {

f.mkdir();

}

/* 保存相片文件 */

path1 = String.valueOf(c.get(Calendar.MILLISECOND))

+ "camera.jpg";

File n = new File(f, path1);

FileOutputStream bos = new FileOutputStream(n

.getAbsolutePath());

/* 文件转换 */

bmp.compress(Bitmap.CompressFormat.JPEG, 100, bos);

/* 调用flush()方法,更新BufferStream */

bos.flush();

/* 结束OutputStream */

bos.close();

Toast.makeText(ScanBarZBarActivity.this,

path1 + "保存成功!", Toast.LENGTH_LONG).show();

cnt++;

} catch (Exception e) {

e.printStackTrace();

}

}

}

mButton.setVisibility(View.VISIBLE);

mButton1.setVisibility(View.VISIBLE);

mButton2.setVisibility(View.VISIBLE);

/* 重新设定Camera */

stopCamera();

initCamera();

}

});

/* 放弃Button的事件处理 */

mButton2.setOnClickListener(new Button.OnClickListener() {

@Override

public void onClick(View arg0) {

mButton.setVisibility(View.VISIBLE);

mButton1.setVisibility(View.VISIBLE);

mButton2.setVisibility(View.VISIBLE);

/* 重新设定Camera */

stopCamera();

initCamera();

}

});

}

@Override

public void surfaceCreated(SurfaceHolder surfaceholder) {

try {

/* 打开相机, */

mCamera = Camera.open();

mCamera.setPreviewDisplay(holder);

} catch (IOException exception) {

mCamera.release();

mCamera = null;

}

}

@Override

public void surfaceChanged(SurfaceHolder surfaceholder, int format, int w,

int h) {

/* 相机初始化 */

Log.i(TAG,"init camera");

initCamera();

}

@Override

public void surfaceDestroyed(SurfaceHolder surfaceholder) {

Log.i(TAG,"destoryed camera");

stopCamera();

mCamera.release();

mCamera = null;

}

/* 拍照的method */

private void takePicture() {

if (mCamera != null) {

Log.i(TAG,"takePicture");

mCamera.takePicture(shutterCallback, rawCallback, jpegCallback);

}

}

private ShutterCallback shutterCallback = new ShutterCallback() {

public void onShutter() {

}

};

private PictureCallback rawCallback = new PictureCallback() {

public void onPictureTaken(byte[] _data, Camera _camera) {

}

};

private PictureCallback jpegCallback = new PictureCallback() {

public void onPictureTaken(byte[] _data, Camera _camera) {

/* 取得相仞 */

try {

/* 设定Button?视性 */

mButton.setVisibility(View.GONE);

mButton1.setVisibility(View.VISIBLE);

mButton2.setVisibility(View.VISIBLE);

/* 取得相仞Bitmap对象 */

bmp = BitmapFactory.decodeByteArray(_data, 0, _data.length);

//发送给isbn分析

// String isbn = getISBN(bmp);获得图片解析后的信息

// Log.i(TAG, "isbn:" + flag + isbn);

flag--;

if(flag>0){

mCamera.autoFocus(mAutoFocusCallback);

}

} catch (Exception e) {

e.printStackTrace();

}

}

};

/* 告定义class AutoFocusCallback */

public final class AutoFocusCallback implements

android.hardware.Camera.AutoFocusCallback {

public void onAutoFocus(boolean focused, Camera camera) {

/* 对到焦点拍照 */

if (focused) {

takePicture();

}

}

};

/* 相机初始化的method */

private void initCamera() {

if (mCamera != null) {

try {

Camera.Parameters parameters = mCamera.getParameters();

/*

* 设定相片大小为1024*768, 格式为JPG

*/

parameters.setPictureFormat(PixelFormat.JPEG);

parameters.setPictureSize(1024, 768);

mCamera.setParameters(parameters);

/* 开启预览画面 */

mCamera.startPreview();

} catch (Exception e) {

e.printStackTrace();

}

}

}

/* 停止相机的method */

private void stopCamera() {

if (mCamera != null) {

try {

/* 停止预览 */

mCamera.stopPreview();

} catch (Exception e) {

e.printStackTrace();

}

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值