这是我的第一篇关于技术方面的文章,希望大家多多支持!!!
这是主界面:
package com.chat.camera;
import com.chat.wechatlocation.R;
import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class ParkCameraActivity extends Activity {
private SurfaceView mSurfaceView;
private SurfaceHolder mHolder;
private CameraCallback mCallback;
private boolean isView = true;
private Button retackBtn, storeBtn, exitBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.park_camera_layout);
initView();
}
private void action_retack() {
if (isView == true) {
retackBtn.setText("重拍");
isView = false;
storeBtn.setEnabled(true);
mCallback.takePicture();
} else {
retackBtn.setText("拍照");
isView = true;
storeBtn.setEnabled(false);
mCallback.retake();
}
}
private void initView() {
retackBtn = (Button) findViewById(R.id.cam_retack_btn);
retackBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
action_retack();
}
});
storeBtn = (Button) findViewById(R.id.cam_store_btn);
storeBtn.setEnabled(false);
storeBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
storeImage();
}
});
exitBtn = (Button) findViewById(R.id.cam_exit_btn);
exitBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
ParkCameraActivity.this.finish();
}
});
mSurfaceView = (SurfaceView) findViewById(R.id.camera_sv);
mHolder = mSurfaceView.getHolder();
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
mCallback = new CameraCallback(this);
mHolder.addCallback(mCallback);
}
private void storeImage() {
// 上传照片的接口
ParkCameraActivity.this.finish();
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_BACK:
ParkCameraActivity.this.finish();
return true;
case KeyEvent.KEYCODE_CAMERA:
action_retack();
return true;
case KeyEvent.KEYCODE_POUND:
storeImage();
return true;
}
return super.onKeyDown(keyCode, event);
}
}
这是布局文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<SurfaceView
android:id="@+id/camera_sv"
android:layout_width="320dp"
android:layout_height="415dp"
android:layout_marginBottom="65dp"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="60dp"
android:orientation="horizontal"
android:layout_alignParentBottom="true"
>
<Button
android:id="@+id/cam_retack_btn"
android:layout_width="0px"
android:layout_weight="1"
android:layout_height="match_parent"
android:background="@drawable/btn"
android:text="拍照"
/>
<Button
android:id="@+id/cam_store_btn"
android:layout_width="0px"
android:layout_weight="1"
android:layout_height="match_parent"
android:background="@drawable/btn"
android:text="上传"
/>
<Button
android:id="@+id/cam_exit_btn"
android:layout_width="0px"
android:layout_weight="1"
android:layout_height="match_parent"
android:background="@drawable/btn"
android:text="退出"
/>
</LinearLayout>
</RelativeLayout>
使用到的回调.........
package com.chat.camera;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.hardware.Camera.AutoFocusCallback;
import android.hardware.Camera.Parameters;
import android.hardware.Camera.PictureCallback;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
public class CameraCallback implements Callback {
private Context mContext;
private Camera mCamera;
private boolean isView = false;
private Parameters mParameters;
private SurfaceHolder mHolder;
// 用于暂时保存最终图片
private Bitmap bm;
public CameraCallback(Context context) {
this.mContext = context;
}
private void initCamera() {
if (mCamera == null && !isView)
mCamera = Camera.open();
if (mCamera != null && !isView) {
try {
mParameters = mCamera.getParameters();
mParameters.setPictureFormat(PixelFormat.JPEG);
mParameters.set("rotation", 90);
mParameters.setPictureSize(320, 240);
mCamera.setDisplayOrientation(90);
mCamera.setParameters(mParameters);
mCamera.setPreviewDisplay(mHolder);
mCamera.startPreview();
isView = true;
mCamera.autoFocus(autoFocuscb);
} catch (Exception e) {
e.printStackTrace();
}
}
if (bm != null)
bm.recycle();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
mHolder = holder;
initCamera();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (mCamera != null) {
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
}
public void takePicture() {
if (mCamera != null) {
mCamera.takePicture(null, null, new PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
// 保存图片
bm = BitmapFactory.decodeByteArray(data, 0, data.length);
isView = false;
mCamera.stopPreview();//停止预览
mCamera.release();//释放
mCamera = null;
}
});
}
}
/*
* 图片存储
*/
public boolean savePicture(final String path, final String filename) {
if (bm != null) {
File fpath = new File(path);
if (!fpath.exists())
fpath.mkdirs();
File file = new File(path + filename);
try {
FileOutputStream fout = new FileOutputStream(file);
BufferedOutputStream bos = new BufferedOutputStream(fout);
// 图片压缩
Bitmap mBitmap = Bitmap.createScaledBitmap(bm, 600, 800, false);
bm.compress(Bitmap.CompressFormat.JPEG, 80, bos);
bos.flush();
bos.close();
return true;
} catch (Exception e) {
e.printStackTrace();
}
}
return false;
}
/*
* 重新启动拍照
*/
public void retake() {
initCamera();
}
private AutoFocusCallback autoFocuscb = new AutoFocusCallback() {
@Override
public void onAutoFocus(boolean success, Camera camera) {
if (success)
mCamera.setOneShotPreviewCallback(null);
}
};
}