android学习笔记36--------------简单的相机

转载请注明原文出处:奔跑的蜗牛(袁方的技术博客)点击打开链接

调用camera拍照,并保存在sd卡指定位置。


public class EX07_16 extends Activity implements SurfaceHolder.Callback
{
	private Camera mCamera;
	private ImageView mButton;
	private SurfaceView mSurfaceView;
	private SurfaceHolder holder;
	private AutoFocusCallback mAutoFocusCallback = new AutoFocusCallback();
	private ImageView sendImageIv;
	
	 private String strCaptureFilePath = Environment.getExternalStorageDirectory()+"/DCIM/Camera/";

	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		/* 隐藏状态栏 */
		this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
				WindowManager.LayoutParams.FLAG_FULLSCREEN);
		/* 隐藏标题栏 */
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		/* 设定屏幕显示为横向 */
		this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

		setContentView(R.layout.main);
		/* SurfaceHolder设置 */
		mSurfaceView = (SurfaceView) findViewById(R.id.mSurfaceView);
		holder = mSurfaceView.getHolder();
		holder.addCallback(EX07_16.this);
		holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
		/* 设置拍照Button的OnClick事件处理 */
		mButton = (ImageView) findViewById(R.id.myButton);
		mButton.setOnClickListener(new OnClickListener()
		{
			@Override
			public void onClick(View arg0)
			{
				/* 告动对焦后拍照 */
				mCamera.autoFocus(mAutoFocusCallback);
			}
		});
		
		sendImageIv=(ImageView)findViewById(R.id.send_image);
		sendImageIv.setOnClickListener(new OnClickListener()
		{
			
			@Override
			public void onClick(View v)
			{
				Intent i = new Intent();
				i.setType("image/*");
				i.setAction(Intent.ACTION_GET_CONTENT);
				startActivityForResult(i, Activity.DEFAULT_KEYS_SHORTCUT);
				
			}
		});
		
	}

	@Override
	public void surfaceCreated(SurfaceHolder surfaceholder)
	{
		try
		{
			/* 打开相机, */
			mCamera = Camera.open();
			mCamera.setPreviewDisplay(holder);
		} catch (IOException exception)
		{
			mCamera.release();
			mCamera = null;
		}
	}

	@Override
	public void surfaceChanged(SurfaceHolder surfaceholder, int format, int w,
			int h)
	{
		/* 相机初始化 */
		initCamera();
	}

	@Override
	public void surfaceDestroyed(SurfaceHolder surfaceholder)
	{
		stopCamera();
		mCamera.release();
		mCamera = null;
	}

	/* 拍照的method */
	private void takePicture()
	{
		if (mCamera != null)
		{
			mCamera.takePicture(shutterCallback, rawCallback, jpegCallback);
		}
	}

	private ShutterCallback shutterCallback = new ShutterCallback()
	{
		public void onShutter()
		{
			/* 按下快门瞬间会调用这里的程序 */
		}
	};

	private PictureCallback rawCallback = new PictureCallback()
	{
		public void onPictureTaken(byte[] _data, Camera _camera)
		{
			/* 要处理raw data?写?否 */
		}
	};

	private PictureCallback jpegCallback = new PictureCallback()
	{
		public void onPictureTaken(byte[] _data, Camera _camera)
		{
			
		      
		      if(Environment.getExternalStorageState().  
                      equals(Environment.MEDIA_MOUNTED)) //判断SD卡是否存在,并且可以可以读写  
              {         
                 
              }  
              else   
              {  
                  Toast.makeText(EX07_16.this, "SD卡不存在或写保护", Toast.LENGTH_LONG).show();  
              }  
		      

		    
			try
			{
				/* 取得相片 */
				 Bitmap bm = BitmapFactory.decodeByteArray(_data, 0, _data.length); 
			      
			      /* 创建文件 */
			      File myCaptureFile = new File(strCaptureFilePath,"1.jpg");    
			      BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(myCaptureFile));
			        /* 采用压缩转档方法 */
			        bm.compress(Bitmap.CompressFormat.JPEG, 100, bos);
			        
			        /* 调用flush()方法,更新BufferStream */
			        bos.flush();
			        
			        /* 结束OutputStream */
			        bos.close();
				
				/* 让相片显示3秒后圳重设相机 */
				//Thread.sleep(2000);
				/* 重新设定Camera */
				stopCamera();
				initCamera();
			} catch (Exception e)
			{
				e.printStackTrace();
			}
		}
	};

	/* 告定义class AutoFocusCallback */
	public final class AutoFocusCallback implements
			android.hardware.Camera.AutoFocusCallback
	{
		public void onAutoFocus(boolean focused, Camera camera)
		{
			/* 对到焦点拍照 */
			if (focused)
			{
				takePicture();
			}
		}
	};

	/* 相机初始化的method */
	private void initCamera()
	{
		if (mCamera != null)
		{
			try
			{
				Camera.Parameters parameters = mCamera.getParameters();
				/*
				 * 设定相片大小为1024*768, 格式为JPG
				 */
				parameters.setPictureFormat(PixelFormat.JPEG);
				parameters.setPictureSize(1024, 768);
				mCamera.setParameters(parameters);
				/* 打开预览画面 */
				mCamera.startPreview();
			} catch (Exception e)
			{
				e.printStackTrace();
			}
		}
	}

	/* 停止相机的method */
	private void stopCamera()
	{
		if (mCamera != null)
		{
			try
			{
				/* 停止预览 */
				mCamera.stopPreview();
			} catch (Exception e)
			{
				e.printStackTrace();
			}
		}
	}
	
	
}

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
  xmlns:android="http://schemas.android.com/apk/res/android" 
  android:orientation="vertical" 
  android:layout_width="fill_parent" 
  android:layout_height="fill_parent" 
  android:layout_gravity="center_horizontal" 
> 
  <SurfaceView 
    android:id="@+id/mSurfaceView" 
    android:visibility="visible"  
    android:layout_width="fill_parent"  
    android:layout_height="fill_parent" 
    android:layout_gravity="center_horizontal"
 	
 	android:layout_alignParentLeft="true"
 	android:layout_toLeftOf="@+id/camera_linearLayout"	
  />
  
	  <RelativeLayout 
	  
	  	android:id="@+id/camera_linearLayout" 
	  	android:layout_width="wrap_content"  	
	  	android:layout_height="fill_parent" 	
	  	android:layout_alignParentRight="true"
		>
  	 			
 			<ImageView 
             	android:id="@+id/send_image1"               	
             	android:layout_width="wrap_content" 
             	android:layout_height="wrap_content" 
             	android:background="@drawable/media_msg_bg" 
             	android:layout_alignLeft="@+id/myButton"
             	android:layout_alignRight="@+id/myButton"
             	android:src="@drawable/ic_movie"
             	android:layout_alignParentTop="true"
             	 />
  	 			
 			<ImageView 
             	android:id="@+id/myButton" 
             	android:background="@drawable/media_msg_bg" 
             	android:paddingLeft="18.0dip" 
             	android:paddingRight="18.0dip" 
             	android:layout_width="wrap_content" 
             	android:layout_height="wrap_content" 
             	android:src="@drawable/capture_image" 
             	android:layout_below="@+id/send_image1"
             	android:layout_marginTop="0px"
             	android:layout_above="@+id/send_image" 
             	android:layout_marginBottom="0px"
             	/>
             	
 			<ImageView 
              	android:id="@+id/send_image" 
              	android:background="@drawable/media_msg_bg" 
              	android:paddingLeft="18.0dip" 
              	android:paddingRight="18.0dip" 
              	android:layout_width="wrap_content" 
              	android:layout_height="wrap_content" 
              	android:src="@drawable/pick_image"
              	android:layout_alignParentBottom="true"
              	 />
	  
  	</RelativeLayout> 
  	
  
</RelativeLayout>





补充:

手机调用cemera进行拍照,但实际照出的照片要比拍照时预览的要多照一部分,不知道为什么?

parameter.setPreviewSize(320, 480);
                        
parameter.setPictureSize(320,480);


parameter.setPreviewSize(320, 240);
parameter.setPictureSize(640,480);


parameter.setPreviewSize(320, 240);
parameter.setPictureSize(1280,960);

用这几组 试试看,应该可以解决

意思就是 PreviewSize 只要是320 * 240 这个比例的,就行
PictureSize 光有比例,不行,应该只有几组固定的,320×240; 640×480; 1280×960 ;等等(我也不知道),是可以的,其他要么就出现你的问题,要么就出现绿边,再么就死机。

而正确的解决方法是:

List psizelist = parameters.getSupportedPictureSizes();
                if (null != psizelist && 0 < psizelist.size()) {
                        int heights[] = new int[psizelist.size()];
                        Map<Integer, Integer> map = new HashMap<Integer, Integer>();
                        for (int i = 0; i < psizelist.size(); i++) {
                                Size size = (Size) psizelist.get(i);
                                int sizehieght = size.height;
                                int sizewidth = size.width;
                                heights[i] = sizehieght;
                                map.put(sizehieght, sizewidth);
                        }
                        Arrays.sort(heights);// 取最小尺寸
                        parameters.setPictureSize(heights[0], map.get(heights[0]));

                }

先获取相机支持的尺寸大小 再设置。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值