android intent调用系统camera

利用android的camera通常有两种方式:利用intent调用系统的camera,或者结合surfaceview实现自己定制的camera。先分别对这两种方法说明如下:

一、使用系统自配的camera,这种方法不需要在配置文件中声明任何权限

package com.bobo.mycamara;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;

import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

public class MainActivity extends Activity {
    private Button btn_image;
    private Button btn_video;
    private Uri image_uri;
    private Uri video_uri;
    private final int IMAGE_TYPE = 1;
    private final int VIDEO_TYPE = 2;
    private final int IMAGE_REQUEST_CODE = 100;
    private final int VIDEO_REQUEST_CODE = 200;
    private ImageView img;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn_image = (Button) this.findViewById(R.id.btn_image_capture);
        btn_video = (Button) this.findViewById(R.id.btn_video_capture);
        btn_image.setOnClickListener(new ImageCaptureListener());
        btn_video.setOnClickListener(new VideoCaptureListener());
        img=(ImageView)this.findViewById(R.id.img);
        
    }

    class ImageCaptureListener implements View.OnClickListener {

        @Override
        public void onClick(View v) {
            Intent intent = new Intent();
            intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
            // 下面的路径选择虽然是可选的,但是建议这么做,否则返回信息会存储在默认路径下(详见api文档)
            image_uri = getOutputMediaFileUri(IMAGE_TYPE);
            intent.putExtra(MediaStore.EXTRA_OUTPUT, image_uri);
            startActivityForResult(intent, IMAGE_REQUEST_CODE);

        }

        // 如何将一个路径转换为一个uri
        private Uri getOutputMediaFileUri(int TYPE) {
            Uri uri = Uri.fromFile(getOutputMediaFile(TYPE));
            // 留意一下这个文件路径是按照怎样的规则转换为一个uri的
            System.out.println("根据路径转换的uri为:" + uri.toString());
            return uri;
        }

        // 创建文件路径
        private File getOutputMediaFile(int type) {
            File mediaFile = null;
            if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) ) {
                File mediaDir = new File(
                        Environment
                                .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
                                + File.separator + "myCamara");
                System.out.println("存储路径目录:" + mediaDir.getAbsolutePath());
                if (!mediaDir.exists()) {
                    if (!mediaDir.mkdirs())
                        System.out.println("存储路径目录创建失败");
                    return null;
                }
                // 利用时间戳作为文件名
                String timeStamp = (new SimpleDateFormat("yyyyMMdd_HHmmss"))
                        .format(new Date());
                if (type == IMAGE_TYPE) {
                    mediaFile = new File(mediaDir.getAbsoluteFile()
                            + File.separator + "IMG_" + timeStamp + ".jpg");
                    System.out.println("文件存储路径为:"+mediaFile.getAbsolutePath());
                } else if (type == VIDEO_TYPE) {
                    mediaFile = new File(mediaFile.getAbsoluteFile()
                            + File.separator + "VID_" + timeStamp + ".mp4");
                } else {
                    return null;
                }
            }

            return mediaFile;
        }

    }

    class VideoCaptureListener implements View.OnClickListener {
        @Override
        public void onClick(View v) {

        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
         if(resultCode!=Activity.RESULT_OK){
            System.out.println("信息返回错误");
             return;
         }
         switch(requestCode){
         case IMAGE_REQUEST_CODE:
             //这里貌似是手机型号的问题,如果指定了MediaStore.EXTRA_OUTPUT,就有可能出现返回的intent为空的情况
             //但是图像依旧在对应的路径下面,可以使用下面的方法将图片显示在图像控件上面
             img.setImageURI(image_uri);
             break;
         case VIDEO_REQUEST_CODE:
             break;
         default:
             System.out.println("请求码返回错误");
             
                 
         }
    }
    

}


 

其中创建图片存储路径,以及将路径转换为Uri的方法值得掌握,通过日志打印发现:

文件存储路径为:/storage/sdcard0/Pictures/myCamara/IMG_20130620_095430.jpg

根据路径转换的uri为:file:///storage/sdcard0/Pictures/myCamara/IMG_20130620_095430.jpg

但是同时发现,这种按照api文档说明指定MediaStore.EXTRA_OUTPUT之后,返回的intent居然为空。不过文件依旧存在在规定的路径下可以找到,如果不指定该参数,则文件保存在默认的路径中。

其代码如下,数据的返回是通过intent.getextra().get("data")是个birmap类型的数据。

package com.bobo.mycamara;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;

import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

public class MainActivity extends Activity {
    private Button btn_image;
    private Button btn_video;
    private Uri image_uri;
    private Uri video_uri;
    private final int IMAGE_TYPE = 1;
    private final int VIDEO_TYPE = 2;
    private final int IMAGE_REQUEST_CODE = 100;
    private final int VIDEO_REQUEST_CODE = 200;
    private ImageView img;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn_image = (Button) this.findViewById(R.id.btn_image_capture);
        btn_image.setOnClickListener(new ImageCaptureListener());
        img = (ImageView) this.findViewById(R.id.img);

    }

    class ImageCaptureListener implements View.OnClickListener {

        @Override
        public void onClick(View v) {
            Intent intent = new Intent();
            intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(intent, IMAGE_REQUEST_CODE);

        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode != Activity.RESULT_OK) {
            System.out.println("信息返回错误");
            return;
        }
        switch (requestCode) {
        case IMAGE_REQUEST_CODE:
            // 如果不指定Media.outputstra参数,那么返回数据的使用方法如下
            Bitmap bitmap = (Bitmap) data.getExtras().get("data");
            img.setImageBitmap(bitmap);
            break;
        case VIDEO_REQUEST_CODE:
            break;
        default:
            System.out.println("请求码返回错误");

        }
    }

}

知道了如何调用系统相机进行拍照后,调用相机进行摄影的操作大同小异。
如果都规定了路径参数,那么可以知道URI进行调用,如果是默认,还需要通过contentresolver进行数据库的查血。可以参见如下两篇博客:

http://blog.csdn.net/yudajun/article/details/7932593

http://www.cnblogs.com/franksunny/archive/2011/11/17/2252926.html

这样带来一个问题,如果在其他界面调用相机的拍照结果呢?知道了uri或者文件路径,进一步结合contentresolver总会有方法。

可以参照自己这篇博客:http://www.cnblogs.com/bobodeboke/archive/2013/05/20/3088867.html

二、结合surfaceview实现自己定制的camera。关于这个,将在下篇博客中进行说明。

 

posted @ 2013-06-20 10:36  bobo的学习笔记  阅读(934)  评论(0编辑  收藏  举报