Android Camera开发系列(下)——自定义Camera实现拍照查看图片等功能


Android Camera开发系列(上)——Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片

上篇讲的都是一些基本的使用,这篇就来自己定义一个相机了

参照Google API:http://developer.android.com/guide/topics/media/camera.html

我们还是在原来的demo上修改,新增一个button,点击跳转到CameraActivity,我们在CameraActivity内实现我们的自定义相机,这里值得注意的是,我们拍照时要一直捕捉拍照的过程,普通的view肯定不行,google给我们提供了一个view叫做

一.获取相机

这里有个前提,记得添加权限

<uses-permission android:name="android.permission.CAMERA"/>

我们新增一个方法来获取系统的相机实例

/*** 获取系统相机* * @return*/private Camera getcCamera() {Camera camera = null;try {camera = Camera.open();} catch (Exception e) {camera = null;}return camera;}

这里值得注意的是,camera是废弃的对象,那是因为google新给出来一个新的api

但是其实新出的api只是作为高级使用的时候才会用,一般来讲,我们还是用回以前的api

二.SurfaceView预览

要使用SurfaceView还是要

implements SurfaceHolder.Callback

activity_camera.xml

<?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" ><SurfaceView
        android:id="@+id/sv"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1" /><Button
        android:id="@+id/btn_camera"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="拍照" /></LinearLayout>

预览图像

/*** 与SurfaceView传播图像*/private void showViews(Camera camera, SurfaceHolder holder) {// 预览相机,绑定try {camera.setPreviewDisplay(holder);// 系统相机默认是横屏的,我们要旋转90°camera.setDisplayOrientation(90);// 开始预览camera.startPreview();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}

释放占用内存

/*** 释放相机的内存*/private void clearCamera() {// 释放hold资源if (mCamera != null) {// 停止预览mCamera.stopPreview();mCamera.setPreviewCallback(null);// 释放相机资源mCamera.release();mCamera = null;}}

绑定生命周期

@Overrideprotected void onResume() {// TODO Auto-generated method stubsuper.onResume();// 在activity运行时绑定if (mCamera == null) {mCamera = getcCamera();if (sh != null) {showViews(mCamera, sh);}}}@Overrideprotected void onPause() {// TODO Auto-generated method stubsuper.onPause();// activity暂停时我们释放相机内存clearCamera();}

SurfaceView回调并同步预览

@Overridepublic void surfaceCreated(SurfaceHolder holder) {// 开始预览showViews(mCamera, sh);}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {// 重启功能mCamera.stopPreview();showViews(mCamera, sh);}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {// 释放clearCamera();}

写到这里,基本上我们的可以预览了,我们来运行一下

这里因为是模拟器,他只有前置摄像头,本应该旋转270°的,我们只要知道通过以上的方法可以同步预览影像就可以了

拍照保存图片

我们设置拍照这个button的点击事件

btn_camera = (Button) findViewById(R.id.btn_camera);btn_camera.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// 获取当前相机参数Camera.Parameters parameters = mCamera.getParameters();// 设置相片格式parameters.setPictureFormat(ImageFormat.JPEG);// 设置预览大小parameters.setPreviewSize(800, 480);// 设置对焦方式,这里设置自动对焦parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);mCamera.autoFocus(new AutoFocusCallback() {@Overridepublic void onAutoFocus(boolean success, Camera camera) {// 判断是否对焦成功if (success) {// 拍照 第三个参数为拍照回调mCamera.takePicture(null, null, pc);}}});}});

这里的pc是一个回调方法,我们重写

private PictureCallback pc = new PictureCallback() {@Overridepublic void onPictureTaken(byte[] data, Camera camera) {// data为完整数据File file = new File("/sdcard/photo.png");// 使用流进行读写try {FileOutputStream fos = new FileOutputStream(file);try {fos.write(data);// 关闭流fos.close();// 查看图片Intent intent = new Intent(CameraActivity.this,PhotoActivity.class);// 传递路径intent.putExtra("path", file.getAbsolutePath());startActivity(intent);finish();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}};

查看图片

我们拍完照片然后就跳转到PhotoActivity查看图片

activity_photo.xml

<?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" ><TextView
        android:id="@+id/tv_path"android:layout_width="wrap_content"android:layout_height="wrap_content" /><ImageView
        android:id="@+id/iv_photo"android:layout_width="wrap_content"android:layout_height="wrap_content" /></LinearLayout>

PhotoActivity

package com.lgl.camera;import java.io.FileInputStream;
import java.io.FileNotFoundException;import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.TextView;public class PhotoActivity extends Activity {private TextView tv_path;private ImageView iv_photo;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.activity_photo);String path = getIntent().getStringExtra("path");tv_path = (TextView) findViewById(R.id.tv_path);// 显示路径tv_path.setText(path);iv_photo = (ImageView) findViewById(R.id.iv_photo);// 调整角度try {FileInputStream fis = new FileInputStream(path);Bitmap bitmap = BitmapFactory.decodeStream(fis);// 矩阵Matrix matrix = new Matrix();matrix.setRotate(90);bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),bitmap.getHeight(), matrix, true);iv_photo.setImageBitmap(bitmap);} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}

我们运行一下
拍完之后跳转到PhotoActivity界面

但是相机是一个大坑,各种不兼容,而且还有前后置摄像头之分哟,上面代码病没有提及前置,前置需要翻转270°,并且我们之前就应该判断是否是前置,再进行旋转,这个只是初学的示例代码,有兴趣的可以下载demo玩玩

Demo下载地址:http://download.csdn.net/detail/qq_26787115/9419048

Android Camera开发系列(下)——自定义Camera实现拍照查看图片等功能相关推荐

  1. android camera移动方向_Android Camera开发系列:调整Camera预览方向

    有时候我们想根据自己的需要调整下Camera的预览方向,那么是调用哪个API可以达到我们的目的呢? 我们看下下图拍的几张小可爱的照片,分别是正常方向.旋转180度.90度拍的照片. ​ 正常方向 旋转 ...

  2. Camera开发系列之六-使用mina框架实现视频推流

    章节 Camera开发系列之一-显示摄像头实时画面 Camera开发系列之二-相机预览数据回调 Camera开发系列之三-相机数据硬编码为h264 Camera开发系列之四-使用MediaMuxer封 ...

  3. android摄像头监控打电话卡死,Android应用开发Android8.0平台Camera monkey拷机卡死异常解决方案...

    本文将带你了解Android应用开发Android8.0平台Camera monkey拷机卡死异常解决方案,希望本文对大家学Android有所帮助. Android8.0平台Camera monkey ...

  4. Camera开发系列之二 相机数据回调处理

    章节 Camera开发系列之一-显示摄像头实时画面 Camera开发系列之二-相机预览数据回调 Camera开发系列之三-相机数据硬编码为h264 Camera开发系列之四-使用MediaMuxer封 ...

  5. android 相机编程,Android相机开发系列

    Android Camera Develop Series 简介 Android相机开发系列文章循序渐进,教你从一个没有任何功能的相机APP开始,逐步完善实现一般相机APP的各种功能,甚至还能拿来做图 ...

  6. Android自定义控件开发系列(零)——基础原理篇

    在后边的文章中发现在说Android自定义时,有时候要重复解释很多东西,所以想想返回来增加一篇"基础原理篇",直接进入正题吧-- 首先的问题是:在Android项目开发中,什么时候 ...

  7. Android软件开发之盘点自定义View界面大合集(二)

    Android软件开发之盘点自定义View界面大合集(二) - 雨松MOMO的程序世界 - 51CTO技术博客 雨松MOMO带大家盘点Android 中的自定义View界面的绘制 今天我用自己写的一个 ...

  8. SharePoint 2013 图文开发系列之自定义字段

    原文:SharePoint 2013 图文开发系列之自定义字段 SharePoint使用的优势,就在于开箱即用.快速搭建,SharePoint自身为我们提供了很多字段类型,已经很丰富了.但是,在实际应 ...

  9. Android蓝牙开发系列文章-蓝牙音箱连接

    经过一段时间的折腾,我的Android Studio终于可以正常工作了,期间遇到的坑记录在了文章<创建Android Studio 3.5第一个工程遇到的坑>. 我们在<Androi ...

最新文章

  1. Spring MVC常用注解说明
  2. php imap_open效率低,求救,为什么 imap 连接这么慢
  3. 【Python】Python视频制作工具Manim入门,基础形状详细介绍
  4. 电脑文件系统的管理总结
  5. lib60870-IEC 60870-5-101 / 104 协议对总查询的处理
  6. 可以飞的电动汽车,波音与保时捷要合作开发了
  7. 从Windows复制文件到Linux显示乱码问题
  8. CSS中选择器的优先级 ( ※关于相同属性的覆盖问题 )
  9. C语言 while语句的用法
  10. linux怎样编译安装pidgin,Ubuntu 10.04编译安装Pidgin-2.7.3整个过程
  11. 银行利率bps是什么意思,贷款利率bps是什么意思
  12. win10清理_春节过后你的电脑该减肥了 Win10清理C盘瘦身全攻略
  13. 赵鹏计算机专业,赵鹏 - 安徽大学 - 计算机科学与技术学院
  14. 致终将火爆的NFC——ISO14443 TypeA(二)
  15. Comment obtenir des vecteurs de phrases?
  16. 2019年4月10日
  17. 敏捷开发模式下如何用 PingCode 这类工具进行版本发布管理
  18. Leetcode Best Time to Buy and Sell Stock IV(最大子段和)
  19. 数据结构与算法A实验六图论---7-6 家庭房产(并查集)
  20. 易搜资料v1.2.8

热门文章

  1. 传奇客户度文件代码完全解析
  2. 服务器硬盘复制速度突然变慢,win10机械硬盘复制文件速度一开始快后来变慢怎么修复...
  3. Oriented FAST and Rotated BRIEF
  4. 计算机公式运算符,运算符详解_Excel公式教程
  5. mysql服务器安装文档,mysql服务器安装
  6. 视频如何转换为gif动图?仅需3步轻松转换动图
  7. Discuz2.5菜鸟解析-1
  8. ServiceNow-Create Incident/Task Reports
  9. 台式计算机电池,带电池的台式机 华硕M51家用电脑首测
  10. 0002 真的吗,700元的电脑可以学会编程?