最近在做图形处理的项目,要使用到照相机。主要实现调用图库功能打开图片或者调用照相机照相将图片返回并显示出来。下面是主要代码:
- package com.cloay.camera;
- import java.io.FileNotFoundException;
- import Android.app.Activity;
- import Android.app.AlertDialog;
- import Android.content.ContentResolver;
- import Android.content.Intent;
- import Android.graphics.Bitmap;
- import Android.graphics.BitmapFactory;
- import Android.net.Uri;
- import Android.os.Bundle;
- import Android.view.MotionEvent;
- import Android.view.View;
- import Android.view.View.OnClickListener;
- import Android.view.View.OnTouchListener;
- import Android.widget.ImageButton;
- import Android.widget.ImageView;
- /**
- * 打开照相机或者图库添加图片
- * CameraTestActivity.java
- * @author Cloay
- * 2011-11-30
- */
- public class CameraTestActivity extends Activity {
- private ImageButton camera;
- private ImageView image;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- image = (ImageView) findViewById(R.id.image);
- camera = (ImageButton) findViewById(R.id.camera);
- camera.setOnTouchListener(new OnTouchListener() {
- @Override
- public boolean onTouch(View v, MotionEvent event) {
- if(event.getAction() == MotionEvent.ACTION_DOWN){
- v.setBackgroundResource(R.drawable.camera_bg_pressed);
- }
- if(event.getAction() == MotionEvent.ACTION_UP){
- showMenuDialog();
- v.setBackgroundResource(R.drawable.camera_bg_normal);
- }
- return false;
- }
- });
- }
- private void showMenuDialog() {
- View menuView = View.inflate(CameraTestActivity.this, R.layout.menu, null);
- final AlertDialog menuDialog = new AlertDialog.Builder(CameraTestActivity.this)
- .setView(menuView)
- .setTitle("选择操作")
- // .setIcon(R.drawable.camera)
- .create();
- menuDialog.show();
- menuView.findViewById(R.id.camera).setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- menuDialog.dismiss();
- Intent intentCamera = new Intent("Android.media.action.IMAGE_CAPTURE");//使用照相机
- startActivityForResult(intentCamera, Activity.DEFAULT_KEYS_DIALER);
- }
- });
- menuView.findViewById(R.id.picture).setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- menuDialog.dismiss();
- // Intent intentPhoto = new Intent(Intent.ACTION_GET_CONTENT, null);
- // intentPhoto.setType("image/*"); //这个参数是确定要选择的内容为图片
- // intentPhoto.putExtra("crop", "circle"); //这个参数 不太懂,唯一知道的是:设置了参数,就会调用裁剪,如果不设置,就会跳过裁剪的过程。
- // intentPhoto.putExtra("aspectX", 33); //这个是裁剪时候的 裁剪框的 X 方向的比例。
- // intentPhoto.putExtra("aspectY",43); //同上Y 方向的比例. (注意: aspectX, aspectY ,两个值都需要为 整数,如果有一个为浮点数,就会导致比例失效。)
- //设置aspectX 与 aspectY 后,裁剪框会按照所指定的比例出现,放大缩小都不会更改。如果不指定,那么 裁剪框就可以随意调整了。
- // intentPhoto.putExtra("outputX", 50); //返回数据的时候的 X 像素大小。
- // intentPhoto.putExtra("outputY", 100); //返回的时候 Y 的像素大小。
- //以上两个值,设置之后会按照两个值生成一个Bitmap, 两个值就是这个bitmap的横向和纵向的像素值,如果裁剪的图像和这个像素值不符合,那么空白部分以黑色填充。
- // intentPhoto.putExtra("noFaceDetection", true); // 是否去除面部检测, 如果你需要特定的比例去裁剪图片,那么这个一定要去掉,因为它会破坏掉特定的比例。
- //
- // intentPhoto.putExtra("return-data", true); //是否要返回值。 一般都要。
- // startActivityForResult(intentPhoto, 1);
- Intent intent = new Intent();
- /* 开启Pictures画面Type设定为image */
- intent.setType("image/*");
- /* 使用Intent.ACTION_GET_CONTENT这个Action */
- intent.setAction(Intent.ACTION_GET_CONTENT);
- /* 取得相片后返回本画面 */
- startActivityForResult(intent, 2);
- }
- });
- }
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- if(requestCode == 2){
- if (resultCode == RESULT_OK) {
- Uri uri = data.getData();
- ContentResolver cr = this.getContentResolver();
- try {
- Bitmap bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri));
- /* 将Bitmap设定到ImageView */
- image.setImageBitmap(bitmap);
- } catch (FileNotFoundException e) {
- image.setImageResource(R.drawable.empty);
- }
- }
- }
- if(requestCode == Activity.DEFAULT_KEYS_DIALER){
- if(data != null){
- Bundle extras = data.getExtras();
- Bitmap bitmap = (Bitmap) extras.get("data");
- image.setImageBitmap(bitmap);
- }
- else{
- image.setImageResource(R.drawable.empty);
- }
- }
- super.onActivityResult(requestCode, resultCode, data);
- }
- }
注释非常详细,代码比较简单就不做过多解释了!