需求描述:如题实现Android系统的照相的基本功能。首先是加载的界面,界面很简单,两个按钮一个ImageView,第一个按钮负责拍照。第二个按钮负责从相册中选择照片,代码如下所示:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="
http://schemas.android.com/apk/res/android
"
下面是核心代码,具体的在代码中给予详细解释:
public class FourActivity extends Activity{
public static final int TAKE_PHOTO = 1;
public static final int CROP_PHOTO = 2; //
定义两个请求码
private Button takePhoto;
private ImageView picture;
private Uri imageuri;
private Button chooseFromAlbum;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_take_photos);
takePhoto = (Button) findViewById(R.id.take_photo);
picture = (ImageView) findViewById(R.id.picture);
takePhoto.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//
创建File对象,用于存储拍照后的图片
File outputimage = new File(Environment.
getExternalStorageDirectory(), "tempImage.jpg"); //
第一个参数表示是内存卡根目录下
try {
if(outputimage.exists()){
outputimage.delete();
}
outputimage.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
imageuri = Uri.fromFile(outputimage); //
获取照片路径
//
隐式Intent不指明目标组件的class,只定义希望的Action及Data等相关信息,由系统决定使用哪个目标组件。
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
//
将裁切的结果输出到指定的Uri intent.
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageuri);
startActivityForResult(intent, TAKE_PHOTO); //
第二个参数为请求码
}
});
chooseFromAlbum = (Button) findViewById(R.id.choose_from_album);
chooseFromAlbum.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
// 创建File对象,用于存储选择的照片
File outputImage = new File(Environment.
getExternalStorageDirectory(), "output_image.jpg");
try {
if (outputImage.exists()) {
outputImage.delete();
}
outputImage.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
imageuri = Uri.fromFile(outputImage);
Intent intent = new Intent("android.intent.action.GET_CONTENT");
intent.setType("image/*"); //
知识点1,选择图片
intent.putExtra("crop", true); //
支持裁剪
intent.putExtra("scale", true); //
支持缩放
//将裁切的结果输出到指定的Uri intent.
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageuri);
startActivityForResult(intent, CROP_PHOTO);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) { //
知识点2
// TODO Auto-generated method stub
switch (requestCode) {
case TAKE_PHOTO:
//
执行结果的结果码,有RESULT_OK,RESULT_CANCELED,RESULT_FIRST_USER ,在调用系统app时返回时RESULT_CANCELED如字面意思代表取消,RESULT_OK代表成功。
if(resultCode == RESULT_OK){
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(imageuri, "image/*");
intent.putExtra("scale", true);
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageuri);
startActivityForResult(intent, CROP_PHOTO); //
再次发送请求,还是由onActivityResult处理
}
break;
case CROP_PHOTO:
try {
if(resultCode == RESULT_OK){
Bitmap bitmap = BitmapFactory.
decodeStream(getContentResolver().openInputStream(imageuri)); //
知识点3
picture.setImageBitmap(bitmap);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
break;
default:
break;
}
}
}
需要注意的地方:
知识点1:
intent.setType(“image/*”);
//intent.setType(“audio/*”); //选择音频
//intent.setType(“video/*”); //选择视频 (mp4 3gp 是android支持的视频格式)
//intent.setType(“video/*;image/*”);//同时选择视频和图片
知识点2:关于onActivityResult的用法,在一个主界面(主Activity)上能连接往许多不同子功能模块(子Activity上去),当子模块的事情做完之后就回到主界面,或许还同时返回一些子模块完成的数据交给主Activity处理。这个时候就要用到回调函数onActivityResult()。
知识点3:Bitmap 是用于处理由像素数据定义的图像的对象。Bitmap实现在android.graphics包中。但是Bitmap类的构造函数是私有的,外面并不能实例化,只能是通过JNI实例化。这必然是 某个辅助类提供了创建Bitmap的接口,而这个类的实现通过JNI接口来实例化Bitmap的,这个类就是BitmapFactory。利用BitmapFactory可以从一个指定文件中,利用decodeFile()解出Bitmap;也可以定义的图片资源中,利用decodeResource()解出Bitmap。
到这里,安卓系统调用照相和裁切就可以了。
共同进步。