本文共 3394 字,大约阅读时间需要 11 分钟。
在实现拍照的功能时遇到了很多问题,搜索了很多资料,尝试了很多办法,终于解决了,下面简要的描述下在开发过程中遇到的问题。
虽然之前看过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) {
-
- Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
-
- 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);
-
-
-
-
- public static boolean isHasSdcard()
- {
- String status = Environment.getExternalStorageState();
- if (status.equals(Environment.MEDIA_MOUNTED)){
- return true;
- } else {
- return false;
- }
- }
-
-
-
- Bitmap bitmap;
- int maxH = 200;
- private void getImage(String imagePath){
- BitmapFactory.Options options = new BitmapFactory.Options();
- options.inJustDecodeBounds = true;
-
- bitmap = BitmapFactory.decodeFile(imagePath, options);
-
- 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;
- bitmap=BitmapFactory.decodeFile(imagePath,options);
- img.setImageBitmap(bitmap);
- img.setVisibility(View.VISIBLE);
- }
以上代码,实现功能实际上是直接把图片存储在SDcard内,然后读取数据现实,后面之所以加上一个直接获取数据返回的代码,是为了兼容一些手机。测试了几款手机后发现可正常,使用也算解决了目前遇到的问题。记录下来,备忘。
转载地址:http://wlhvi.baihongyu.com/