今天看《第一行代码》上面关于拍照和从相册选取图片那一部分,发现始终出不来效果,所以搜索其他资料学习一下相关知识,写一个简单的Demo。
一、 拍照选择图片
1、使用隐式Intent启动相机
//构建隐式Intent
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//调用系统相机
startActivityForResult(intent, 1);
2、处理相机拍照返回的结果
//用户点击了取消
if(data == null){
return;
}else{
Bundle extras = data.getExtras();
if (extras != null){
//获得拍的照片
Bitmap bm = extras.getParcelable("data");
}
}
二、 从图库选择图片
1、构建内容选择隐式Intent
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
2、设置内容类型为图片
intent.setType("image private Uri saveBitmap(Bitmap bm, String dirPath) { //新建文件夹用于存放裁剪后的图片 File tmpDir = new File(Environment.getExternalStorageDirectory() + "/" + dirPath); if (!tmpDir.exists()){ tmpDir.mkdir(); } //新建文件存储裁剪后的图片 File img = new File(tmpDir.getAbsolutePath() + "/avator.png"); try { //打开文件输出流 FileOutputStream fos = new FileOutputStream(img); //将bitmap压缩后写入输出流(参数依次为图片格式、图片质量和输出流) bm.compress(Bitmap.CompressFormat.PNG, 85, fos); //刷新输出流 fos.flush(); //关闭输出流 fos.close(); //返回File类型的Uri return Uri.fromFile(img); } catch (FileNotFoundException e) { e.printStackTrace(); return null; } catch (IOException e) { e.printStackTrace(); return null; } }
从图库选择的图片返回的是content类型的Uri,我们需要转化为文件类型的Uri才能进行裁剪。
private Uri convertUri(Uri uri){
InputStream is;
try {
//Uri ----> InputStream
is = getContentResolver().openInputStream(uri);
//InputStream ----> Bitmap
Bitmap bm = BitmapFactory.decodeStream(is);
//关闭流
is.close();
return saveBitmap(bm, "temp");
} catch (FileNotFoundException e) {
e.printStackTrace();
return null;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
下面便是设置裁剪的参数,用隐式Intent方式启动裁剪程序
private void startImageZoom(Uri uri){
//构建隐式Intent来启动裁剪程序
Intent intent = new Intent("com.android.camera.action.CROP");
//设置数据uri和类型为图片类型
intent.setDataAndType(uri, "image
private void chooseFromCamera() {
//构建隐式Intent
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//调用系统相机
startActivityForResult(intent, CAMERA_CODE);
}
private void chooseFromGallery() {
//构建一个内容选择的Intent
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
//设置选择类型为图片类型
intent.setType("image
private Uri convertUri(Uri uri){
InputStream is;
try {
//Uri ----> InputStream
is = getContentResolver().openInputStream(uri);
//InputStream ----> Bitmap
Bitmap bm = BitmapFactory.decodeStream(is);
//关闭流
is.close();
return saveBitmap(bm, "temp");
} catch (FileNotFoundException e) {
e.printStackTrace();
return null;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
private Uri saveBitmap(Bitmap bm, String dirPath) {
//新建文件夹用于存放裁剪后的图片
File tmpDir = new File(Environment.getExternalStorageDirectory() + "/" + dirPath);
if (!tmpDir.exists()){
tmpDir.mkdir();
}
//新建文件存储裁剪后的图片
File img = new File(tmpDir.getAbsolutePath() + "/avator.png");
try {
//打开文件输出流
FileOutputStream fos = new FileOutputStream(img);
//将bitmap压缩后写入输出流(参数依次为图片格式、图片质量和输出流)
bm.compress(Bitmap.CompressFormat.PNG, 85, fos);
//刷新输出流
fos.flush();
//关闭输出流
fos.close();
//返回File类型的Uri
return Uri.fromFile(img);
} catch (FileNotFoundException e) {
e.printStackTrace();
return null;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
private void startImageZoom(Uri uri){
//构建隐式Intent来启动裁剪程序
Intent intent = new Intent("com.android.camera.action.CROP");
//设置数据uri和类型为图片类型
intent.setDataAndType(uri, "image/*");
//显示View为可裁剪的
intent.putExtra("crop", true);
//裁剪的宽高的比例为1:1
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
//输出图片的宽高均为150
intent.putExtra("outputX", 150);
intent.putExtra("outputY", 150);
//裁剪之后的数据是通过Intent返回
intent.putExtra("return-data", true);
startActivityForResult(intent, CROP_CODE);
}
}
注:最后还需要在AndroidManifest文件中加入存储卡读写权限
代码如下:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>