调用安卓相机的代码稍微有点复杂,我将其进行了包装,简化调用的过程。
这个包装类能实现:调用相机、修改尺寸、获得位图 这三个基本功能。
由于涉及到向SD卡中写数据的操作,因此需要在 AndroidManifest.xml 中声明权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
创建一个 TakePhoto 类,代码如下:
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
public class TakePhoto {
private String imagePath;
private String imageName;
private Uri imageUri;
public TakePhoto() {
//默认保存在SD卡根目录
imagePath = Environment.getExternalStorageDirectory().toString();
imageName = "output_image.jpg";
}
public TakePhoto(String imagePath, String imageName) {
//自定义路径及文件名
this.imagePath = imagePath;
this.imageName = imageName;
}
//调用相机
public Uri invokeCamera(Context context) {
createUri();
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
//启动相机程序
context.startActivity(intent);
return imageUri;
}
//裁剪相片
public Uri editPicture(Context context) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(imageUri, "image/*");
intent.putExtra("scale", true);
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
//启动裁剪程序
context.startActivity(intent);
return imageUri;
}
//生成Uri对象
private void createUri() {
File outputImage = new File(imagePath, imageName);
try {
//生成空白文件
if (outputImage.exists()) {
outputImage.delete();
}
outputImage.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
imageUri = Uri.fromFile(outputImage);
}
//得到Bitmap对象
public Bitmap getBitmap(Context context) {
try {
return BitmapFactory.decodeStream(context.getContentResolver().openInputStream(imageUri));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return null;
}
}
最后在 Activity 中测试,核心代码如下:
class OnClick implements View.OnClickListener {
TakePhoto takePhoto = new TakePhoto();
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn1:
//调用相机
takePhoto.invokeCamera(MyActivity.this);
break;
case R.id.btn2:
//修改尺寸
takePhoto.editPicture(MyActivity.this);
break;
case R.id.btn3:
//获得图片
Bitmap bitmap = takePhoto.getBitmap(MyActivity.this);
imageView.setImageBitmap(bitmap);
break;
default:
break;
}
}
}
运行截图: