功能说明: 因为项目中需要用到多次拍照并保存的功能,模仿了米格宝宝的相机。
效果图:
图在手机上打开是有画面出来,不是截图上的黑屏的。真机测试就可以了。
这个是拍照后的查看图片的。
源码如下:
package com.wjh.camera;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import android.R.integer;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.ActivityInfo;
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.PictureCallback;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.KeyEvent;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.RelativeLayout;
/**
*
* 相机
*
*/
public class TakePhotoActivity extends Activity implements Callback, OnClickListener, AutoFocusCallback{
SurfaceView mySurfaceView;//surfaceView声明
SurfaceHolder holder;//surfaceHolder声明
Camera myCamera;//相机声明
String filePath="/sdcard/";//照片保存路径
boolean isClicked = false;//是否点击标识
ImageView takeCameraBtn,takephoto_text;
RelativeLayout re_take_btn,save_btn; //确定
public static boolean saveFlag = false;// 用于判断是否保存图片的标志
byte[] imgdata =null;
public static int imgsize = 0;
//创建jpeg图片回调数据对象
PictureCallback jpeg = new PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
imgdata = data;
/* try
{// 获得图片
Bitmap bm = BitmapFactory.decodeByteArray(data, 0, data.length);
File file = new File(filePath+"id_"+"1"+".jpg");
BufferedOutputStream bos =
new BufferedOutputStream(new FileOutputStream(file));
bm.compress(Bitmap.CompressFormat.JPEG, 100, bos);//将图片压缩到流中
bos.flush();//输出
bos.close();//关闭
}catch(Exception e)
{
e.printStackTrace();
} */
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);//无标题
//设置拍摄方向
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setContentView(R.layout.take_photo);
takeCameraBtn = (ImageView)this.findViewById(R.id.photo_icon); //拍照
takephoto_text = (ImageView)this.findViewById(R.id.takephoto_text);//照片预览
takeCameraBtn.setOnClickListener(this);
re_take_btn = (RelativeLayout)this.findViewById(R.id.re_take_btn);//取消
save_btn = (RelativeLayout)this.findViewById(R.id.save_btn); //保存
re_take_btn.setOnClickListener(this);
save_btn.setOnClickListener(this);
//获得控件
mySurfaceView = (SurfaceView)findViewById(R.id.surfaceView1);
//获得句柄
holder = mySurfaceView.getHolder();
//添加回调
holder.addCallback(this);
//设置类型
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
//设置监听
mySurfaceView.setOnClickListener(this);
}
@Override
public void onAutoFocus(boolean success, Camera camera) {
if(success)
{
//设置参数,并拍照
Camera.Parameters params = myCamera.getParameters();
params.setPictureFormat(PixelFormat.JPEG);
params.setPreviewSize(640,480);
myCamera.setParameters(params);
myCamera.takePicture(null, null, jpeg);
takeCameraBtn.setVisibility(View.INVISIBLE);
takephoto_text.setVisibility(View.VISIBLE);
re_take_btn.setVisibility(View.VISIBLE);
save_btn.setVisibility(View.VISIBLE);
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.photo_icon: //拍照
myCamera.autoFocus(this);//自动对焦
break;
case R.id.re_take_btn://取消
saveFlag = false;
myCamera.startPreview();//开启预览
takeCameraBtn.setVisibility(View.VISIBLE);
takephoto_text.setVisibility(View.INVISIBLE);
re_take_btn.setVisibility(View.INVISIBLE);
save_btn.setVisibility(View.INVISIBLE);
break;
case R.id.save_btn://保存
saveFlag = true;
savephoto();
myCamera.startPreview();//开启预览
takeCameraBtn.setVisibility(View.VISIBLE);
takephoto_text.setVisibility(View.INVISIBLE);
re_take_btn.setVisibility(View.INVISIBLE);
save_btn.setVisibility(View.INVISIBLE);
default:
break;
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
//设置参数并开始预览
Camera.Parameters params = myCamera.getParameters();
params.setPictureFormat(PixelFormat.JPEG);
params.setPreviewSize(640,480);
myCamera.setParameters(params);
myCamera.startPreview();
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
//开启相机
if(myCamera == null)
{
myCamera = Camera.open();
try {
myCamera.setPreviewDisplay(holder);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
//关闭预览并释放资源
myCamera.stopPreview();
myCamera.release();
myCamera = null;
}
public void savephoto(){
if(saveFlag){
if(imgdata!=null){
++imgsize;
try
{// 获得图片
Bitmap bm = BitmapFactory.decodeByteArray(imgdata, 0, imgdata.length);
File file = new File(filePath+"id_"+imgsize+".jpg");
BufferedOutputStream bos =
new BufferedOutputStream(new FileOutputStream(file));
bm.compress(Bitmap.CompressFormat.JPEG, 100, bos);//将图片压缩到流中
bos.flush();//输出
bos.close();//关闭
}catch(Exception e)
{
e.printStackTrace();
}
}
}else {
imgdata = null;
}
}
//按返回键时,显示弹出框
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
Intent intent = new Intent(TakePhotoActivity.this,AsyncLoadedImageActivity.class);
startActivity(intent);
finish();
return true;
}
return false;
}
}
take_photo.xml
<?xml version="1.0" encoding="UTF-8"?>
<RelativeLayout android:id="@+id/surface_view_wrapper" android:layout_width="fill_parent" android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
<RelativeLayout android:layout_width="fill_parent" android:layout_height="fill_parent">
<SurfaceView android:id="@+id/surfaceView1" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_centerInParent="true" />
<ImageView android:id="@+id/focus_rectangle" android:background="@null" android:layout_width="200.0dip" android:layout_height="200.0dip" android:layout_centerInParent="true" />
</RelativeLayout>
<RelativeLayout android:id="@+id/flash_btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10.0dip" android:layout_marginBottom="10.0dip" android:layout_alignParentLeft="true" android:layout_alignParentBottom="true">
<ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/takephoto_tab1" android:layout_centerInParent="true" />
<ImageView android:id="@+id/flash_icon" android:layout_width="21.0dip" android:layout_height="21.0dip" android:src="@drawable/ic_viewfinder_flash_off" android:layout_centerInParent="true" />
</RelativeLayout>
<RelativeLayout android:id="@+id/foot_menu" android:background="@drawable/takephoto_bar_hor" android:layout_width="60.0dip" android:layout_height="fill_parent" android:layout_alignParentRight="true">
<RelativeLayout android:id="@+id/take_btn" android:background="@drawable/takephoto_1_bg_hor" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="5.0dip" android:layout_alignBottom="@id/surfaceView1" android:layout_alignParentRight="true" android:layout_centerInParent="true">
<ImageView android:layout_gravity="center" android:id="@+id/photo_icon" android:src="@drawable/takephoto_1_camera" android:layout_centerInParent="true" style="@style/photo_foot_menu_image_button_port" />
</RelativeLayout>
<ImageView android:layout_gravity="center" android:id="@+id/takephoto_text" android:paddingLeft="8.0dip" android:visibility="invisible" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/takephoto_2_txt" android:layout_centerInParent="true" />
<RelativeLayout android:id="@+id/re_take_btn" android:visibility="invisible" android:layout_width="wrap_content" android:layout_marginBottom="10.0dip" android:layout_alignParentBottom="true" style="@style/photo_foot_menu_image_button_wrapper">
<ImageView android:src="@drawable/icon_takephoto_cancel" style="@style/photo_foot_menu_image_button_port" />
</RelativeLayout>
<RelativeLayout android:id="@+id/save_btn" android:visibility="invisible" android:layout_marginTop="5.0dip" style="@style/photo_foot_menu_image_button_wrapper">
<ImageView android:id="@+id/save_photo_icon" android:src="@drawable/icon_takephoto_save" style="@style/photo_foot_menu_image_button_port" />
</RelativeLayout>
</RelativeLayout>
</RelativeLayout>