zoukankan      html  css  js  c++  java
  • 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。关于这个,将在下篇博客中进行说明。

  • 相关阅读:
    webpack介绍 安装 常用命令
    npm常用命令
    jQuery 实现点击页面其他地方隐藏菜单
    :after伪类+content内容生成经典应用举例
    几分钟前 几小时前 几天前... 7个阶段
    JS — 获取4个不重复的随机验证码
    JS — 数组去重(4种方法)
    Spring IOC原理简析
    浅谈Linux下的五种I/O模型
    大型分布式网站架构技术总结
  • 原文地址:https://www.cnblogs.com/bobodeboke/p/3145541.html
Copyright © 2011-2022 走看看