利用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。关于这个,将在下篇博客中进行说明。

更多相关文章

  1. Android资源文件使用经验
  2. Android实践 -- Android文件储存系统 应用篇
  3. Android添加资源文件编译,R文件未重新生成解决办法
  4. 转 Android:文件下载和写入SD卡学习小结
  5. android下快速检索出媒体文件所在文件夹
  6. 使用Genymotion调试出现错误INSTALL_FAILED_CPU_ABI_INCOMPATI
  7. 【Android】APP_ALLOW_MISSING_DEPS=true 错误

随机推荐

  1. Centos7配置DR模式的LVS
  2. Mysql主从复制
  3. 《吊打面试官》系列-ConcurrentHashMap &
  4. 神经元是如何组成神经网?
  5. 教你轻松构建一个可以泡妞的 app
  6. 浅析tomcat8+memcached session共享
  7. 只需 2 步,定位集成融云时的崩溃与错误 -
  8. 【JS基础入门】初识JavaScript是什么?
  9. 访问管理未来的四大趋势
  10. 如何让Mac电脑在Finder窗口顶部显示文件