您的位置:首页 > 移动开发 > Android开发

Android开发,调用相册图片或者调用相机进行拍照获取图片

2015-10-27 17:24 881 查看
这是比较常见的情况。

只是初次使用的时候会出现很多的错误导致不能达成想要的效果,这里写出来分享一下。

我这里是某一个按钮的点击事件,弹出选择框来选择是拍照还是打开相册还是取消。

headicon_btn.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch (group.getCheckedRadioButtonId()) {
// 调用相册
case R.id.headicon_1:
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");// 相片类型
startActivityForResult(intent, 1);
break;
// 调用照相机
case R.id.headicon_2:
String state = Environment.getExternalStorageState();
if (state.equals(Environment.MEDIA_MOUNTED)) {
Intent getImageByCamera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
mUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "/DCIM/Camera/"
+ String.valueOf(System.currentTimeMillis()) + ".png"));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
getImageByCamera.putExtra(MediaStore.EXTRA_OUTPUT, mUri);
}
startActivityForResult(getImageByCamera, 2);
} else {
Toast.makeText(getApplicationContext(), "请确认已经插入SD卡", Toast.LENGTH_LONG).show();
}
break;
// 取消
case R.id.headicon_3:
break;
}
}
});
case R.id.headicon_1即是进入相册选择图片

case R.id.headicon_2即是进入照相机进行拍照

case R.id.headicon_3即是取消操作

这里要使用一个Intent信使来操作

ACTION_PICK是进入文件夹进行选择,intent.settype("image/*")是限制只能选择图片

ACTION_IMAGE_CAPTURE是进行拍照,这个相对复杂,大体操作是先判断有没有SD卡存在,否则拍完了没办法存储,然后判断android的版本,这是比较重要的一点,因为android的版本问题,在android4.1之前和之后是不一样的操作。然后跳到照相界面

注意这两个跳转都是需要返回的跳转,即startActivityForResult,我这里,1代表相册,2代表相机

接下来是处理返回的方法

/**
* 当数据返回时调用 跳到相册选择照片跳回
*/
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
try {
ContentResolver resolver = this.getContentResolver();
switch (requestCode) {
case 1:
case 2:
if (data != null) {
startPhotoZoom(data.getData());
} else {
if (mUri != null) {
startPhotoZoom(mUri);
}else {
return;
}
}
break;
case 3:
if (data != null) {
Uri uri = data.getData();
Bitmap bitmap = MediaStore.Images.Media.getBitmap(resolver, uri);
this.bitmap = bitmap;
baby_info_headicon.setImageBitmap(bitmap);
baby_click.setVisibility(View.GONE);
// 保存图片到本地
File f = new File(INFO.HEAD_PATH);
if (!f.exists()) {// 若该文件夹不存在则新建一个文件夹
f.mkdirs();
}
f = new File(INFO.HEAD_PATH + "/" + data_util.GetData_String(getApplicationContext(), "username") + "headicon.png");
FileOutputStream outputStream;
try {
f.createNewFile();
outputStream = new FileOutputStream(f);
bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream);
outputStream.flush();
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
break;
default:
break;
}
} catch (Exception e) {
e.printStackTrace();
}
}


这里面有些我自己做操作的代码,你们主要看怎么使用就行。
里面有一个startPhotoZoom的方法

这是用于将图片进行裁剪成正方形的方法

/**
* 头像裁剪
*
* @param data
*/
private void startPhotoZoom(Uri uri) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", "true");
// aspectX aspectY 是宽高的比例
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
// outputX outputY 是裁剪图片宽高
intent.putExtra("outputX", 240);
intent.putExtra("outputY", 240);
startActivityForResult(intent, 3);
}
所以上面还有一个返回参数为3,如果你们不需要进行裁剪,在上面的返回操作改变一下,删除3这个返回参数,在1和2中进行操作就可以了。

希望能对你们有帮助。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: