android相机开发之仿米格宝宝日志的相机

本文介绍了一个简易拍照应用的开发过程,包括使用SurfaceView实现相机功能,自动对焦、拍照及预览图片,以及图片保存机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

功能说明:  因为项目中需要用到多次拍照并保存的功能,模仿了米格宝宝的相机。

效果图:

 

图在手机上打开是有画面出来,不是截图上的黑屏的。真机测试就可以了。

 

这个是拍照后的查看图片的。

源码如下:

              

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>

 

 源码下载

转载于:https://www.cnblogs.com/andgoo/archive/2012/08/08/2628579.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值