在日常开发中,我们经常需要用到上传图片的 功能,这个时候通常有两种做法,第一种,从相机获取,第二种,从相册获取。今天这篇博客主要讲解利用系统的Intent怎样获取?
主要内容如下
怎样通过相机获取我们的图片
怎样启动相册获取我们想要的图片
在Android 6.0中的动态权限处理】
调用系统Intent和自定义相册的优缺点对比
怎样通过相机获取我们的图片
总共有两种方式,
第一种方式:
第一步,通过 MediaStore.ACTION_IMAGE_CAPTURE 启动我们的相机
Intent pIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//调用摄像头action
startActivityForResult(pIntent, INTENT_CODE_IMAGE_CAPTURE1);//requestcode
第二步,在onActivityResult进行处理,,核心代码如下
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case INTENT_CODE_IMAGE_CAPTURE1:
if (resultCode == RESULT_OK) {
Bundle pBundle = data.getExtras(); //从intent对象中获取数据,
if (pBundle != null) {
Bitmap pBitmap = (Bitmap) pBundle.get("data");
if (pBitmap != null) {
mIv.setImageBitmap(pBitmap);
}
}
}
break;
}
第二种 方式
第一步,通过 MediaStore.ACTION_IMAGE_CAPTURE 启动相机,并指定 MediaStore.EXTRA_OUTPUT ,intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mFile)); 传入我们的URI,这样,最终返回的信息会存储在我们的mFile中。
private void startCameraWithHighBitmap() {
//确定存储拍照得到的图片文件路径
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
mFile = new File(Environment.getExternalStorageDirectory(),
getName());
} else {
Toast.makeText(this, "请插入sd卡", Toast.LENGTH_SHORT).show();
return;
}
try {
mFile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
Intent intent = new Intent();
intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
//加载Uri型的文件路径
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mFile));
//向onActivityResult发送intent,requestCode为INTENT_CODE_IMAGE_CAPTURE2
startActivityForResult(intent, INTENT_CODE_IMAGE_CAPTURE2);
}
第二步:在onActivityResult进行处理,并对图片进行相应的压缩,防止在大图片的情况下发生OOM
case INTENT_CODE_IMAGE_CAPTURE2:
if (resultCode == RESULT_OK) {
Bitmap bitmap = ImageZip.decodeSampledBitmapFromFile(mFile.getAbsolutePath(),
mWidth, mHeight);
mIv.setImageBitmap(bitmap)