android调用系统相机实现拍照功能

在实现拍照的功能时遇到了很多问题,搜索了很多资料,尝试了很多办法,终于解决了,下面简要的描述下在开发过程中遇到的问题。

虽然之前看过android开发的书,但是没有做过东西,这次也是临时决定让我做一个android采集系统的演示程序。拍照是其中一个功能,让网搜索了下拍照有两种方式,其中一种就是调用系统相机实现拍照功能。

启动照相机进行拍照,代码如下:

btnCamera.setOnClickListener(new Button.OnClickListener()
		{
			
			public void onClick(View v)
			{
				Intent i = new Intent("android.media.action.IMAGE_CAPTURE");  
	 			startActivityForResult(i, Activity.DEFAULT_KEYS_DIALER);  
			}
		});
获取拍照后图片数据,代码如下:
	@Override
	protected void onActivityResult(int requestCode, int resultCode,Intent data) 
	{
		switch(resultCode)
		{
		 case RESULT_OK:
		 	super.onActivityResult(requestCode, resultCode, data); 
			if(data!=null){
		    		Bundle extras = data.getExtras();  
		    		Bitmap bmp = (Bitmap) extras.get("data");  
		  
		    		ivstorepic.setImageBitmap(bmp);  //设置照片现实在界面上
		    		hasShootPic = true;//此变量是在提交数据时,验证是否有图片用
			}
			else
			{
				 hasShootPic = false;
			}
		    break;
			default:
				break;
		    }
		
	}
此时,遇到第一个问题,使用miui系统手机拍照时,无法获取到照片数据,使用Log打印数据之后发现Bitmap bmp = (Bitmap) extras.get("data"); 处出现异常。然后搜索了很多资料,问了很多人,都说这个代码没有问题。但是问题还是要解决,后来想是不是可以把数据存放在SDcard上,然后读取SDcard上数据显示在图形空间上。测试之后发现这样可以实现。其中涉及到的变量定义如下:
public static final String SDCARD_ROOT_PATH = android.os.Environment.getExternalStorageDirectory().getAbsolutePath();//路径
public static final String SAVE_PATH_IN_SDCARD = "/bi.data/"; //图片及其他数据保存文件夹
public static final String IMAGE_CAPTURE_NAME = "cameraTmp.png"; //照片名称
public final static int REQUEST_CODE_TAKE_PICTURE = 12;//设置拍照操作的标志

启动相机进行拍照,代码如下:
btnCamera.setOnClickListener(new Button.OnClickListener(){
		public void onClick(View v) {
			// TODO Auto-generated method stub
			 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
	       	   	// 存储卡可用 将照片存储在 sdcard
	       	   	if(SimpleFileTool.isHasSdcard()){
	       	         		intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(SDCARD_ROOT_PATH+
	       		         		SAVE_PATH_IN_SDCARD,IMAGE_CAPTURE_NAME)));
	       	   }
	       	   startActivityForResult(intent, REQUEST_CODE_TAKE_PICTURE);
		}
    	});

获取拍照后图片数据,代码如下:
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		if (resultCode == RESULT_OK) {
			if(requestCode == REQUEST_CODE_TAKE_PICTURE){//拍照返回
				//存储卡可用
				if(isHasSdcard()){
					getImage(SDCARD_ROOT_PATH+SAVE_PATH_IN_SDCARD+IMAGE_CAPTURE_NAME);
				}
				else{
				//存储卡不可用直接返回缩略图 
				Bundle extras = data.getExtras(); 
				bitmap = (Bitmap) extras.get("data");
				img.setImageBitmap(bitmap);
					img.setVisibility(View.VISIBLE);
					hasShootPic = false;
				}		
                          }
		}
		super.onActivityResult(requestCode, resultCode, data);
}


         /**
	 * 检查存储卡是否插入
	 * @return
	 */
	public static boolean isHasSdcard()
	{
		String status = Environment.getExternalStorageState();
		if (status.equals(Environment.MEDIA_MOUNTED)){
		   return true;
		} else {
		   return false;
		}
	}


 

 	/* 获得图片 图片高度 最大maxH
	 * @param imagePath
	 */
	Bitmap bitmap;
	int maxH = 200;//
	private void getImage(String imagePath){
		BitmapFactory.Options options = new BitmapFactory.Options();
        		options.inJustDecodeBounds = true;
        		// 获取这个图片的宽和高
        		bitmap = BitmapFactory.decodeFile(imagePath, options); //此时返回bm为空
         		//计算缩放比
        		int be = (int)(options.outHeight / (float)maxH);
        		int ys = options.outHeight % maxH;//求余数
        		float fe = ys / (float)maxH;
        		if(fe>=0.5)be = be + 1;
        		if (be <= 0)
            		be = 1;
        		options.inSampleSize = be;
        
        		//重新读入图片,注意这次要把options.inJustDecodeBounds 设为 false
        		options.inJustDecodeBounds = false;
        		bitmap=BitmapFactory.decodeFile(imagePath,options);
        		img.setImageBitmap(bitmap);
        		img.setVisibility(View.VISIBLE);
	}

 

以上代码,实现功能实际上是直接把图片存储在SDcard内,然后读取数据现实,后面之所以加上一个直接获取数据返回的代码,是为了兼容一些手机。测试了几款手机后发现可正常,使用也算解决了目前遇到的问题。记录下来,备忘。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值