一、调用系统照相机和摄像机功能

调用系统摄像头进行拍照和摄像是通过隐式启动系统Activity 实现的,无需给自己的工程添加权限,直接调用即可。因此我们只需知道系统照相机和摄像机Activity 的action 和category 就可以了

步骤

1、打开Android 源码,查看”\packages\apps\”文件文件目录下的Camera 应用,即系统摄像头的应用程序。打开其清单文件文件,查看其Activity 的action 和category 信息

2、Camera 类的action 和category 如下

照相机的意图过滤器

<intent-filter><action android:name="android.media.action.IMAGE_CAPTURE" /><category android:name="android.intent.category.DEFAULT" />
</intent-filter>

摄像机的意图过滤器

<intent-filter><action android:name="android.media.action.VIDEO_CAMERA" /><category android:name="android.intent.category.DEFAULT" />
</intent-filter>

3、采用隐式调用的方式调用Activity

由于希望在调用拍照或摄像功能后将结果返回到当前应用的Activity,所以在开启Activity 时不能使用startActivity 方法,而是使用startActivityForResult 方法开启Activity,并重写onActivityResult 方法处理回传的数据

布局文件比较简单,界面只有两个按钮,一个用于打开照相机,一个用于打开摄像机。这里只给出核心代码清单

拍照功能核心代码

public void take(View view){//创建一个Intent 对象Intent intent = new Intent();//设置Actionintent.setAction("android.media.action.IMAGE_CAPTURE");//创建一个文件File file = newFile(Environment.getExternalStorageDirectory().getAbsolutePath(),"my.jpg");//创建uri 对象Uri uri = Uri.fromFile(file);//设置图片的输出路径intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);//开启ActivitystartActivityForResult(intent, 100);}

摄像功能核心代码

public void video(View view){Intent intent = new Intent();intent.setAction("android.media.action.VIDEO_CAPTURE");File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath(),"myVedio.mp4");Uri uri = Uri.fromFile(file);intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);startActivityForResult(intent, 101);
}

二、编码实现照相功能

使用Camera+SurfaceView 控件可实现自定义照相机功能。接下来我将具体的步骤展示出来

1、编写布局文件,该布局只有一个SurfaceView 控件和一个Button 作为拍照按钮

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"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:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="takeImage"android:text="拍照"/></LinearLayout>

2、在清单文件中添加2 个权限信息

添加第一个权限是因为我们代码使用到系统照相机,第二个是因为我们需要把照好的相片保存到sdcard 上

<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    //声明成员变量private Camera        camera;//照相机对象private SurfaceHolder holder;//SurfaceView 的辅助类//获取SurfaceView 控件的实例,通过其辅助类SurfaceHolder 对象添加CallBack 接口的实现//获取预览画面的SurfaceView 控件SurfaceView surfaceView = (SurfaceView) findViewById(R.id.sv);//得到预览画面的辅助类holder = surfaceView.getHolder();//添加回调方法holder.addCallback(new Callback() {@Overridepublic void surfaceCreated(SurfaceHolder holder) {try {//打开摄像头camera = Camera.open();//设置预览显示的位置camera.setPreviewDisplay(holder);//开启预览camera.startPreview();} catch (IOException e) {e.printStackTrace();}}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {//停止预览界面camera.stopPreview();//释放摄像头camera.release();}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format,int width, int height) {}//添加点击拍照按钮的点击事件:设置摄像头自动对焦,对焦完成后保存图片并重新预览//拍照public void takeImage(View view) {if (camera == null) {Toast.makeText(this, "照相机还没打开。", Toast.LENGTH_SHORT).show();return;}//点击拍照按钮,摄像头自动对焦,对焦完成后拍照并保存camera.autoFocus(new AutoFocusCallback() {@Overridepublic void onAutoFocus(boolean success, Camera camera) {//对焦完成,拍照并保存camera.takePicture(null, null, new PictureCallback() {@Overridepublic void onPictureTaken(byte[] data, Camera camera) {//设置照片保存路径String path =Environment.getExternalStorageDirectory().getAbsolutePath() + "/" +UUID.randomUUID().toString() + ".jpg";try {FileOutputStream outputStream = new FileOutputStream(path);//将照片字节数组写到文件中outputStream.write(data);outputStream.close();//重新开启预览camera.startPreview();} catch (Exception e) {e.printStackTrace();}}});}});}

三、总结

Camera

方法 说明
open() 打开摄像头
release() 释放摄像头
setPreviewDisplay() 设置预览显示的位置
startPreview() 开启预览
stopPreview() 停止预览界面
autoFocus() AutoFocusCallback
takePicture() 对焦完成

Android多媒体开发:照相机相关推荐

  1. Android多媒体开发

    Android多媒体开发系列文章 Android多媒体开发:录音机 Android多媒体开发:照相机 TextureView+MediaPlayer实现在线短视频播放 Android多媒体开发:第三方 ...

  2. android开发高级开发,Android多媒体开发高级编程 (Shawn Van Every) pdf扫描版

    <android多媒体开发高级编程--为智能手机和平板电脑开发图形.音乐.视频和富媒体应用>使用清晰.直观的示例介绍了android sdk中丰富的多媒体功能,有助于您开发能够创建.播放和 ...

  3. android编程高级教程 pdf,Android多媒体开发高级编程

    在多媒体功能方面,今天的手机同时是照相机.相册.摄像机.电影播放器.音乐播放器.听写机,且可能具备更多功能. 特别是,Android在SDK中具有非常丰富的功能,本书将试图通过讨论和实例对该SDK进行 ...

  4. Android多媒体开发技术

    周末参加了线下安卓巴士论坛组织的"安卓开发者的修炼之道",几位嘉宾分享的内容都很赞.没时间整理文字版,直接分享嘉宾的PPT了. 第二位嘉宾何俊林,前爱奇艺多媒体开发,据说活动现场很 ...

  5. Android多媒体开发介绍

    Android多媒体开发介绍 一.       多媒体架构 基于第三方PacketVideo公司的OpenCORE来实现,支持所有通用的音频/视频/静态图像格式,包括:MPEG4.H.264.MP3. ...

  6. Android多媒体开发(3)————使用Android NKD编译havlenapetr-FFMpeg-7c27aa2

    1. 使用NDK去编译官方的FFmpeg原版的话,还得自己实现JNI层与Java层,工程量比较大.所以移植FFmpeg到Android平台时,可以移植一些已经实现JNI与JAVA层的开源项目,毕竟软件 ...

  7. Android多媒体开发-stagefright及AwesomePlayer相关知识梳理

    android的多媒体框架中, stagefright其实是AwesomePlayer的代理,就是个皮包公司. status_t StagefrightPlayer::setDataSource( c ...

  8. Android 多媒体开发 MediaPlayer|SoundPool |MediaRecorder |Camera2| MediaProjectionManager

    android支持音频格式:  mp3.wav.3gp  视频: MP4.g3p 等等.... 1. MediaPlayer|SoundPool 使用   1.1. MediaPlayer 加载资源 ...

  9. 【Android 多媒体开发】 MediaPlayer 状态机 接口 方法 解析

    作者 : 韩曙亮 转载请著名出处 :  http://blog.csdn.net/shulianghan/article/details/38487967 一. MediaPlayer 状态机 介绍 ...

最新文章

  1. Python时间转换函数:时间转化为时间戳、时间戳转化为时间、当前日期、当前时间、星期几、前面或者后面多少天、年、月、日等
  2. mysql 定义存储过程_mysql——定义——存储过程和函数——概念
  3. JavaScript基础09-day11【原型对象、toString()、垃圾回收、数组、数组字面量、数组方法】
  4. 深入理解Java幂等性
  5. Git的smart Checkout\force checkout\Don‘t Checkout的区别
  6. app.config数据库路径问题
  7. Split Byte(文件分割助手) v2.4
  8. Unity3D中关于场景销毁时事件调用顺序的一点记录
  9. ML、DL、CNN学习记录5
  10. php做APP接口开发,接口的安全性
  11. paip.python错误解决19
  12. Android 中关于属性动画的一些思考,或许能为你解决一定的性能问题
  13. 如何用xmlspy将xml文档生成xsd文件
  14. js实现椭圆轨迹_利用js实现div画椭圆曲线运动特效代码
  15. CS书籍、代码资源下载网址
  16. padavan手动安装php
  17. php 左右分栏,如何设置分栏格式
  18. 基于牛顿法的开平方实现
  19. windows10只显示图标不显示缩略图
  20. 动态背景线条,鼠标移动线条汇聚---背景特效

热门文章

  1. JAVA变量的数据类型样例
  2. 视频传输专线解决方案架构特点——Vecloud
  3. 物联网的发展之—Vecloud微云
  4. 【AtCoder】ARC088
  5. codewars--js--Hamming Numbers
  6. (四)创建ROS程序包(就是软件包)
  7. leetcode 155. 最小栈
  8. *103.编译的过程
  9. Python爬虫基础面试题为2020年初大学生就业做准备(文末附教程)
  10. 深度学习之利用TensorFlow实现简单的全连接层网络(MNIST数据集)