android菜鸟进阶之路——照相机的调用(拍照和裁剪)

  需求描述:如题实现Android系统的照相的基本功能。首先是加载的界面,界面很简单,两个按钮一个ImageView,第一个按钮负责拍照。第二个按钮负责从相册中选择照片,代码如下所示:
         <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android=" http://schemas.android.com/apk/res/android "

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical" >


    <Button 

        android:id="@+id/take_photo"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:text="take photo"

        />

    <Button

        android:id="@+id/choose_from_album"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:text="Choose From Album" />

    <ImageView 

        android:id="@+id/picture"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:layout_gravity="center_vertical"

        ></ImageView>

</LinearLayout>
        下面是核心代码,具体的在代码中给予详细解释:
        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。
                到这里,安卓系统调用照相和裁切就可以了。
                共同进步。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值