您的位置:首页 > 移动开发 > Android开发

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

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

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

启动照相机进行拍照,代码如下:
[java] view
plain copy

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);    

           }  

       });  

获取拍照后图片数据,代码如下: [java] view
plain copy

@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上数据显示在图形空间上。测试之后发现这样可以实现。其中涉及到的变量定义如下: [java] view
plain copy

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;//设置拍照操作的标志  

启动相机进行拍照,代码如下: [java] view
plain copy

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(newFile(SDCARD_ROOT_PATH+
 

                               SAVE_PATH_IN_SDCARD,IMAGE_CAPTURE_NAME)));  

              }  

              startActivityForResult(intent, REQUEST_CODE_TAKE_PICTURE);  

       }  

       });  

获取拍照后图片数据,代码如下: 
[java] view
plain copy

@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);  

[java] view
plain copy

       /**

* 检查存储卡是否插入

* @return

*/  

public static boolean isHasSdcard()
 

{  

   String status = Environment.getExternalStorageState();  

   if (status.equals(Environment.MEDIA_MOUNTED)){
 

      return true;
 

   } else {
 

      return false;
 

   }  

}  

[java] view
plain copy

   /*
获得图片 图片高度 最大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内,然后读取数据现实,后面之所以加上一个直接获取数据返回的代码,是为了兼容一些手机。测试了几款手机后发现可正常,使用也算解决了目前遇到的问题。记录下来,备忘。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: