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

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

效果图:

 

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

 

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

源码如下:

              

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>
复制代码

 

 源码下载

posted @   吴超文  阅读(488)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示