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

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

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

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

[java]   view plain   copy
  1. btnCamera.setOnClickListener(new Button.OnClickListener()  

  2.        {  

  3.              

  4.            public void onClick(View v)  

  5.            {  

  6.                Intent i = new Intent("android.media.action.IMAGE_CAPTURE");    

  7.                startActivityForResult(i, Activity.DEFAULT_KEYS_DIALER);    

  8.            }  

  9.        });  

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

  2. protected void onActivityResult(int requestCode, int resultCode,Intent data)   

  3. {  

  4.    switch(resultCode)  

  5.    {  

  6.     case RESULT_OK:  

  7.        super.onActivityResult(requestCode, resultCode, data);   

  8.        if(data!=null){  

  9.                Bundle extras = data.getExtras();    

  10.                Bitmap bmp = (Bitmap) extras.get("data");    

  11.        

  12.                ivstorepic.setImageBitmap(bmp);  //设置照片现实在界面上  

  13.                hasShootPic = true;//此变量是在提交数据时,验证是否有图片用  

  14.        }  

  15.        else  

  16.        {  

  17.             hasShootPic = false;  

  18.        }  

  19.        break;  

  20.        default:  

  21.            break;  

  22.        }  

  23.      

  24. }  

此时,遇到第一个问题,使用miui系统手机拍照时,无法获取到照片数据,使用Log打印数据之后发现Bitmap bmp = (Bitmap) extras.get("data"); 处出现异常。然后搜索了很多资料,问了很多人,都说这个代码没有问题。但是问题还是要解决,后来想是不是可以把数据存放在SDcard上,然后读取SDcard上数据显示在图形空间上。测试之后发现这样可以实现。其中涉及到的变量定义如下:   [java]   view plain   copy
  1. public static final String SDCARD_ROOT_PATH = android.os.Environment.getExternalStorageDirectory().getAbsolutePath();//路径  

  2. public static final String SAVE_PATH_IN_SDCARD = "/bi.data/"//图片及其他数据保存文件夹  

  3. public static final String IMAGE_CAPTURE_NAME = "cameraTmp.png"//照片名称  

  4. public final static int REQUEST_CODE_TAKE_PICTURE = 12;//设置拍照操作的标志  


启动相机进行拍照,代码如下:   [java]   view plain   copy
  1. btnCamera.setOnClickListener(new Button.OnClickListener(){  

  2.        public void onClick(View v) {  

  3.            // TODO Auto-generated method stub  

  4.             Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);  

  5.                // 存储卡可用 将照片存储在 sdcard  

  6.                if(SimpleFileTool.isHasSdcard()){  

  7.                            intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(newFile(SDCARD_ROOT_PATH+  

  8.                                SAVE_PATH_IN_SDCARD,IMAGE_CAPTURE_NAME)));  

  9.               }  

  10.               startActivityForResult(intent, REQUEST_CODE_TAKE_PICTURE);  

  11.        }  

  12.        });  


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

  2. protected void onActivityResult(int requestCode, int resultCode, Intent data) {  

  3.    if (resultCode == RESULT_OK) {  

  4.        if(requestCode == REQUEST_CODE_TAKE_PICTURE){//拍照返回  

  5.            //存储卡可用  

  6.            if(isHasSdcard()){  

  7.                getImage(SDCARD_ROOT_PATH+SAVE_PATH_IN_SDCARD+IMAGE_CAPTURE_NAME);  

  8.            }  

  9.            else{  

  10.            //存储卡不可用直接返回缩略图  

  11.            Bundle extras = data.getExtras();   

  12.            bitmap = (Bitmap) extras.get("data");  

  13.            img.setImageBitmap(bitmap);  

  14.                img.setVisibility(View.VISIBLE);  

  15.                hasShootPic = false;  

  16.            }         

  17.                         }  

  18.    }  

  19.    super.onActivityResult(requestCode, resultCode, data);  


[java]   view plain   copy
  1.        /**

  2. * 检查存储卡是否插入

  3. * @return

  4. */  

  5. public static boolean isHasSdcard()  

  6. {  

  7.    String status = Environment.getExternalStorageState();  

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

  9.       return true;  

  10.    } else {  

  11.       return false;  

  12.    }  

  13. }  


[java]   view plain   copy
  1.    /* 获得图片 图片高度 最大maxH

  2. * @param imagePath

  3. */  

  4. Bitmap bitmap;  

  5. int maxH = 200;//  

  6. private void getImage(String imagePath){  

  7.    BitmapFactory.Options options = new BitmapFactory.Options();  

  8.            options.inJustDecodeBounds = true;  

  9.            // 获取这个图片的宽和高  

  10.            bitmap = BitmapFactory.decodeFile(imagePath, options); //此时返回bm为空  

  11.                //计算缩放比  

  12.            int be = (int)(options.outHeight / (float)maxH);  

  13.            int ys = options.outHeight % maxH;//求余数  

  14.            float fe = ys / (float)maxH;  

  15.            if(fe>=0.5)be = be + 1;  

  16.            if (be <= 0)  

  17.                be = 1;  

  18.            options.inSampleSize = be;  

  19.         

  20.            //重新读入图片,注意这次要把options.inJustDecodeBounds 设为 false  

  21.            options.inJustDecodeBounds = false;  

  22.            bitmap=BitmapFactory.decodeFile(imagePath,options);  

  23.            img.setImageBitmap(bitmap);  

  24.            img.setVisibility(View.VISIBLE);  

  25. }  

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值