Android调用系统相机拍照并保存

保存图片有两种方式:保存拍照的缩略图(图片分辨率低,文件小)、保存拍照的原始图片(图片分辨率高,文件大)。

1.保存拍照的缩略图

AndroidManifest.xml中添加权限:

<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

java代码:

private static final int REQUEST_CODE_TAKE_PICTURE = 1000;

public void openCamera() {
  Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
  startActivityForResult(intent, REQUEST_CODE_TAKE_PICTURE);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
  if (resultCode == RESULT_OK) {
      switch (requestCode) {
        case REQUEST_CODE_TAKE_PICTURE:
          // 解析返回的图片成bitmap
          Bitmap bmp = (Bitmap) intent.getExtras().get("data");
          String f = System.currentTimeMillis() + ".jpg";
          File file = new File("/sdcard/pic/" + f);
          FileOutputStream fos = null;
          try {
            fos = new FileOutputStream(file);
            bmp.compress(Bitmap.CompressFormat.JPEG, 100, fos);
          } catch (Exception x) {
            Log.e(TAG, "save Bitmap error=" + x);
          } finally {
            try {
              fos.flush();
              fos.close();
            } catch (Exception x) {
              Log.e(TAG, "save Bitmap error=" + x);
            }
          }
          break;
        default:
          break;
      }
  }
  super.onActivityResult(requestCode, resultCode, intent);
}

2.保存拍照的原始图片

AndroidManifest.xml中添加权限和provider:

<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="com.test.fileProvider"
    android:exported="false"
    android:grantUriPermissions="true"
    tools:replace="android:authorities">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths"
        tools:replace="android:resource"/>
</provider>

java代码:

private static final int REQUEST_CODE_TAKE_PICTURE = 1000;

public void openCamera() {
  Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
  String f = System.currentTimeMillis() + ".jpg";
  File file = new File("/sdcard/pic/" + f);
  Uri fileUri = null;
  // Android7.0以及以后的版本需要使用FileProvider的方式
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    fileUri = FileProvider.getUriForFile(mContext, "com.test.fileProvider", file);
  } else {
    fileUri = Uri.fromFile(file);
  }
  intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); //指定图片存放位置,指定后,在onActivityResult里得到的Data将为null
  startActivityForResult(intent, REQUEST_CODE_TAKE_PICTURE);
}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值