功能说明: 因为项目中需要用到多次拍照并保存的功能,模仿了米格宝宝的相机。
效果图:
图在手机上打开是有画面出来,不是截图上的黑屏的。真机测试就可以了。
这个是拍照后的查看图片的。
源码如下:
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>