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

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

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

[java] view plaincopy

1. btnCamera.setOnClickListener(new Button.OnClickListener()  
2.         {  
3.               
4. public void onClick(View v)  
5.             {  
6. new Intent("android.media.action.IMAGE_CAPTURE");    
7.                 startActivityForResult(i, Activity.DEFAULT_KEYS_DIALER);    
8.             }  
9.         });

获取拍照后图片数据,代码如下:

[java] view plaincopy

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. "data");    
11.         
12. //设置照片现实在界面上  
13. true;//此变量是在提交数据时,验证是否有图片用  
14.         }  
15. else  
16.         {  
17. false;  
18.         }  
19. break;  
20. default:  
21. break;  
22.         }  
23.       
24. }

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

[java] view plaincopy

    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 plaincopy

    1. btnCamera.setOnClickListener(new Button.OnClickListener(){  
    2. public void onClick(View v) {  
    3. // TODO Auto-generated method stub  
    4. new Intent(MediaStore.ACTION_IMAGE_CAPTURE);  
    5. // 存储卡可用 将照片存储在 sdcard  
    6. if(SimpleFileTool.isHasSdcard()){  
    7. new File(SDCARD_ROOT_PATH+  
    8.                                 SAVE_PATH_IN_SDCARD,IMAGE_CAPTURE_NAME)));  
    9.                }  
    10.                startActivityForResult(intent, REQUEST_CODE_TAKE_PICTURE);  
    11.         }  
    12.         });


    获取拍照后图片数据,代码如下:

    [java] view plaincopy

    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. "data");  
    13.             img.setImageBitmap(bitmap);  
    14.                 img.setVisibility(View.VISIBLE);  
    15. false;  
    16.             }         
    17.                          }  
    18.     }  
    19. super.onActivityResult(requestCode, resultCode, data);


    [java] view plaincopy

    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 plaincopy

    1.     /* 获得图片 图片高度 最大maxH
    2.  * @param imagePath
    3.  */  
    4. Bitmap bitmap;  
    5. int maxH = 200;//  
    6. private void getImage(String imagePath){  
    7. new BitmapFactory.Options();  
    8. true;  
    9. // 获取这个图片的宽和高  
    10. //此时返回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. 1;  
    18.             options.inSampleSize = be;  
    19.          
    20. //重新读入图片,注意这次要把options.inJustDecodeBounds 设为 false  
    21. false;  
    22.             bitmap=BitmapFactory.decodeFile(imagePath,options);  
    23.             img.setImageBitmap(bitmap);  
    24.             img.setVisibility(View.VISIBLE);  
    25. }

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