安卓调用系统拍照功能:1、启动拍照返回图片,2、启动拍照,图片存储在指定路径下

全栈工程师开发手册 (作者:栾鹏)

安卓教程全解

安卓调用系统拍照功能,两种方式获取拍摄的照片。

1、启动系统拍照intent,并直接返回图片数据

2、启动系统拍照intent,拍照后存储在指定的路径下,返回后app主动读取路径下的图片文件。

第一种方式:启动拍照,返回图片数据

获取拍摄的照片,照片数据存放在内存中

  public void takephone() {
      startActivityForResult(new Intent(MediaStore.ACTION_IMAGE_CAPTURE), 0);
  }

第二种方式:启动拍照,图片存储到指定路径下

使用一个intent请求拍照,照片存储在指定位置

//函数外要先定义一个Uri对象,存储图片路径。
  private Uri outputFileUri;  


//启动拍照的函数
  public void takephone_save() {
    //创建输出文件
      File file = new File(Environment.getExternalStorageDirectory(),"test.jpg");  //存放在sd卡的根目录下
      outputFileUri = Uri.fromFile(file);

      //生成Intent.
      Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
      intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);

      //启动摄像头应用程序
      startActivityForResult(intent, 0);
  }

接收系统拍照的事件的返回结果(1返回图片数据,2返回图片地址)

除了可以根据返回的intent,也可以根据请求码来区别。

对于包含图片数据的,直接将数据转换为bitmap,对于不包含图片数据的这判定为存储在了指定位置。通过uri获取图片路径,在填充到控件背景中。

 @Override
  protected void onActivityResult(int requestCode,int resultCode, Intent data) {
    if (requestCode == TAKE_PICTURE) {
      //检查是否包含缩略图
      if (data != null) {
        if (data.hasExtra("data")) {     //从一个intent接收图片
            Log.v("系统拍照", "内存中有图片数据");
            Bitmap thumbnail = data.getParcelableExtra("data");
            //使用bitmap图片做其他处理
            imageView.setImageBitmap(thumbnail);
        }
      } else {
          Log.v("系统拍照", "内存中没有图片数据");
        //如果没有缩略图,则说明图像存储在目标输出URI中
        int width = imageView.getWidth();
        int height = imageView.getHeight();

        BitmapFactory.Options factoryOptions = new BitmapFactory.Options();

        factoryOptions.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(outputFileUri.getPath(), factoryOptions);

        int imageWidth = factoryOptions.outWidth;
        int imageHeight = factoryOptions.outHeight;

        // 确定将图像缩小多少
        int scaleFactor = Math.min(imageWidth/width, imageHeight/height);

        //将图像文件解码为图像大小以填充视图
        factoryOptions.inJustDecodeBounds = false;
        factoryOptions.inSampleSize = scaleFactor;
        factoryOptions.inPurgeable = true;

        Bitmap bitmap = BitmapFactory.decodeFile(outputFileUri.getPath(),factoryOptions);
         //使用bitmap图片做其他处理
        imageView.setImageBitmap(bitmap); 
      }
    }
  }

你可能感兴趣的:(android)