Android基础—Camera调用及注册

一、概述

本章节主要讲述学习android摄像头使用中的实践以及注意点,主要分为系统Camera的调用方法、指定相片路径、原图和缩略图、注册应用为Camera应用这几部分知识。

如有错误或优化之处,欢迎留言指导。

二、调用系统Camera

核心代码:

// 隐式Intent调用
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivity(intent);

为了调用Camera拍照后返回可以获取到图片,将启动方式换成startActivityForResult,并重写onActivityResult方法。

核心代码:

// 推荐将requestCode定义为静态常量
private static int REQ_1 = 1;

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, REQ_1);

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        /**
         * 判断系统Camera返回的结果,也可能是RESULT_CANCEL
         * 如果是自定义的Activity可通过如下返回
         * Intent intent = new Intent();
         * setResult(RESULT_CANCELED, intent);
         * finish();
         */
        if (resultCode == RESULT_OK) { // 判断resultCode,RESULT_OK代表拍照成功
            if (requestCode == REQ_1) { // 判断requestCode,分别处理不同Intent请求
                Bundle bundle = data.getExtras(); // 获取所有返回数据
                Bitmap bitmap = (Bitmap) bundle.get("data"); // 获取数据并转为Bitmap
                ImageView.setImageBitmap(bitmap);
            }
        }
    }

但是通过如上方法从data中获取后的图片为系统优化过后的缩略图,如要获取高清原图,可以通过修改图片存储路径后再读取,如下可见。

核心代码:

private String mFilePath;

// 在onCreate中初始化
mFilePath = Environment.getExternalStorageDirectory().getPath();
mFilePath = mFilePath + "/" + System.currentTimeMillis() + ".jpg";

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
Uri photoUri = Uri.fromFile(new File(mFilePath)); // 导包时注意导入的是android.net.Uri
intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
startActivityForResult(intent, REQ_1);

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK) {
            if (requestCode == REQ_1) {
                FileInputStream fis = null;
                try {
                    fis = new FileInputStream(mFilePath);
                    if (fis != null) {
                        Bitmap bitmap = BitmapFactory.decodeStream(fis);
                        ImageView.setImageBitmap(bitmap);
                    }
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } finally {
                    if (fis != null) {
                        try {
                            fis.close(); // 注意释放内存,但有时也要注意释放后可能会导致Bitmap无法显示
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    }

所以,调用系统相机拍照以及获取照片我们以及学会了,接下来可能有的朋友会开发美颜相机之类的App,那这类应用的必备的一步就是要把自己的app注册为Camera应用,让用户调用时可以选择用系统相机还是我们开发的相机。

核心代码:

// 剔除不支持Camera的设备
<uses-feature android:name="android.hardware.Camera" android:required="true"/>

// 权限申明,6.0在代码中还需校验
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />

// 隐式调用的action
<activity android:name=".CameraActivity">
            <intent-filter>
                <action android:name="android.media.action.IMAGE_CAPTURE"/>

                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
</activity>

三、后言

本章节就记录到这里,下两章计划学习研究Camera1和Camera2,根据版本制作自定义相机,最后写一个兼容版本的简单相机demo。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值