Android SurfaceView拍照录像实现方法

Surface的拍照实现也是很简单,一个小demo就可以把流程看懂了。

话不多说,直接上代码

布局文件

<SurfaceView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/sv_main_surface"
    />

  <Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:onClick="tackPhoto"
    android:text="拍照"
    />

Activity

public class MainActivity extends AppCompatActivity {

  private SurfaceView sv_main_surface;
  private Camera camera;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    sv_main_surface = (SurfaceView) findViewById(R.id.sv_main_surface);

    //添加surface回调函数
    sv_main_surface.getHolder().addCallback(new SurfaceHolder.Callback() {

      @Override//控件创建时,打开照相机
      public void surfaceCreated(SurfaceHolder holder) {
        //打开照相机
        camera = Camera.open();
        //设置参数
        Camera.Parameters parameters=camera.getParameters();
        parameters.setPictureFormat(PixelFormat.JPEG);
        parameters.set("jpeg-quality",85);
        camera.setParameters(parameters);
        //将画面展示到SurfaceView
        try {
          camera.setPreviewDisplay(sv_main_surface.getHolder());
        } catch (IOException e) {
          e.printStackTrace();
        }
        //开启预览效果
        camera.startPreview();

      }

      @Override//控件改变
      public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

      }

      @Override//控件销毁
      public void surfaceDestroyed(SurfaceHolder holder) {
        //照相同一时刻只能允许一个软件打开
        if(camera!=null){
          camera.stopPreview();
          camera.release();//释放内存
          camera=null;
        }
      }
    });

  }

  public void takePhoto(View view){
    camera.takePicture(null, null, new Camera.PictureCallback() {
      @Override
      public void onPictureTaken(byte[] bytes, Camera camera) {
        //技术:图片压缩技术(如果图片不压缩,图片大小会过大,会报一个oom内存溢出的错误)
        Bitmap bitmap= BitmapFactory.decodeByteArray(bytes,0,bytes.length);
        try {
          FileOutputStream fos = new FileOutputStream("/mnt/sdcard/qq"+System.currentTimeMillis()+".png");//图片保存路径
          bitmap.compress(Bitmap.CompressFormat.PNG,85,fos);//压缩格式,质量,压缩路径

          camera.stopPreview();
          camera.startPreview();
        } catch (FileNotFoundException e) {
          e.printStackTrace();
        }
      }
    });

  }
}

我们还要添加权限

   <!--打开照相机的权限-->
  <uses-permission android:name="android.permission.CAMERA"></uses-permission>
  <!--创建文件的权限-->
  <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
  <!--写内存卡的权限-->
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

就这样一个小案例就完成了

既然可以拍照,那肯定也是可以录像的,所以我们再来看看录像是怎么实现的

布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:id="@+id/activity_media_recorder"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:paddingBottom="@dimen/activity_vertical_margin"
  android:paddingLeft="@dimen/activity_horizontal_margin"
  android:paddingRight="@dimen/activity_horizontal_margin"
  android:paddingTop="@dimen/activity_vertical_margin"
  tools:context="com.zking.familyapp.MediaRecorderActivity">

  <SurfaceView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/sv_media_surface"
    />

  <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    ></LinearLayout>

  <Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="开始"
    android:onClick="start"
    />
 <Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="停止"
    android:onClick="stop"
    />

</RelativeLayout>

Activity

public class MediaRecorderActivity extends AppCompatActivity {

  private SurfaceView sv_media_surface;
  private MediaRecorder mediaRecorder;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_media_recorder);
    sv_media_surface = (SurfaceView) findViewById(R.id.sv_media_surface);

    //实例化媒体录制器
    mediaRecorder = new MediaRecorder();
  }

  public void start(View view){
    mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
    mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);

    //设置格式
    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);

    mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263);
    mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

    //设置保存路径
    mediaRecorder.setOutputFile("/mnt/sdcard/uu"+System.currentTimeMillis()+".mp4");

    mediaRecorder.setPreviewDisplay(sv_media_surface.getHolder().getSurface());

    try {
      mediaRecorder.prepare();
      mediaRecorder.start();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

  public void stop(View view){
    if(mediaRecorder!=null){
      mediaRecorder.stop();
      mediaRecorder.release();
      mediaRecorder=null;
    }

  }
}

添加权限

<!-- 录像的权限-->
  <uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android 7.0中拍照和图片裁剪适配的问题详解

    前言 Android 7.0系统发布后,拿到能升级的nexus 6P,就开始了7.0的适配.发现在Android 7.0以上,在相机拍照和图片裁剪上,可能会碰到以下一些错误: Process: com.yuyh.imgsel, PID: 22995 // 错误1 android.os.FileUriExposedException: file:///storage/emulated/0/Android/data/com.yuyh.imgsel/cache/1486438962645.jpg ex

  • Android编程调用系统自带的拍照功能并返回JPG文件示例【附demo源码下载】

    本文实例讲述了Android编程调用系统自带的拍照功能返回JPG文件.分享给大家供大家参考,具体如下: package com.eboy.testcamera1; import java.io.File; import java.io.FileOutputStream; import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.os.Bund

  • Android 实现IOS选择拍照相册底部弹出的实例

    Android 实现IOS选择拍照相册底部弹出的实例 效果图 1. AndroidStudio使用 dependencies { compile 'com.guoqi.widget:actionsheet:1.0' } 2. 使用 //1.实现接口 implements ActionSheet.OnActionSheetSelected //2.在某个点击事件中添加: ActionSheet.showSheet(this, this, null); //3.然后重写点击方法: @Override

  • Android编程实现拍照功能的2种方法分析

    本文实例讲述了Android编程实现拍照功能的2种方法.分享给大家供大家参考,具体如下: Android系统的照相功能,已实现2种方法,可供大家参考: 1. 调用系统摄像头来拍照 首先,找到AndroidManifest.xml文件里加入用户权限 <uses-permission android:name="android.permission.CAMERA"></uses-permission> <uses-feature android:name=&q

  • Android仿微信单击拍照长按录像功能实例代码

    此文章是看郭神公众号发的一篇,仅作学习. 在modlue gradle中添加 compile 'cjt.library.wheel:camera:0.0.7' 在project gradle中添加 compile 'cjt.library.wheel:camera:0.0.7' 添加的地方是 allprojects { repositories { jcenter() /*在此处添加*/ } } 使用起来很方便,只需在xml布局中 <com.cjt2325.cameralibrary.JCame

  • Android自定义组件获取本地图片和相机拍照图片

    iOS中有封装好的选择图片后长按出现动画删除效果,效果如下 而Android找了很久都没有找到有这样效果的第三方组件,最后懒得找了还是自己实现这效果吧 选择图片后还可对图片进行剪裁 当然,代码中还有很多不完善的地方,我接下来会继续完善这个组件的 已经上传到开源社区,欢迎大家来Star啊~ Demo源码:传送门 设计中的碰到的一些问题和解决思路 1.如何让加号图片显示在GridView最后面 首先在调用GridAdapter构造方法时就加载加号图片 /** * 图片适配器 * @param con

  • Android判断是否有拍照权限的实例代码

    下面一段代码给大家介绍android判断是否有拍照权限,具体代码如下所示: /** * 返回true 表示可以使用 返回false表示不可以使用 */ public boolean cameraIsCanUse() { boolean isCanUse = true; Camera mCamera = null; try { mCamera = Camera.open(); Camera.Parameters mParameters = mCamera.getParameters(); //针对

  • Android SurfaceView拍照录像实现方法

    Surface的拍照实现也是很简单,一个小demo就可以把流程看懂了. 话不多说,直接上代码 布局文件 <SurfaceView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/sv_main_surface" /> <Button android:layout_width="match_

  • Android开发实现拍照功能的方法实例解析

    本文实例讲述了Android开发实现拍照功能的方法.分享给大家供大家参考,具体如下: 解析: 1)判断是否有摄像头checkCameraHardware(this) 2)获得相机camera = Camera.open(0); 3)把相机添加到mPreView = new SurfacePreView(this, mCamera); 4)实现拍照 mCamera.autoFocus 5)在拍照后使用mCamera.takePicture(null, null, mPicture);方法把图片保存

  • Android调用手机拍照功能的方法

    本文实例讲述了Android调用手机拍照功能的方法.分享给大家供大家参考.具体如下: 一.main.xml布局文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" andr

  • Android编程实现图片拍照剪裁的方法

    本文实例讲述了Android实现图片拍照剪裁的方法.分享给大家供大家参考,具体如下: 调用系统的裁剪工具对相册或者拍照的图片进行裁剪. startActivityforResult用的很恰当,一些系统action需要注意. package com.photosizing; import java.io.ByteArrayOutputStream; import java.io.File; import android.app.Activity; import android.content.In

  • Android实现拍照、录像、录音代码范例

    本文主要介绍Android实现拍照.录像.录音代码的资料,这里整理了详细的代码,有需要的小伙伴可以参考下. RecordActivity.java package com.cons.dcg.collect; import java.io.File; import java.text.SimpleDateFormat; import java.util.*; import android.app.*; import android.content.Intent; import android.da

  • Android 调用系统应用的方法总结

    Android  调用系统应用的方法总结 1.调用系统拍照 Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); //保存到指定目录 File file = new File("/mnt/sdcard/picture"); if (!file.exists()) { file.mkdirs(); } File out = new File("/mnt/sdcard/picture

  • Android实现拍照和录制视频功能

    本文实例为大家分享了Android实现拍照和录制视频功能的具体代码,供大家参考,具体内容如下 文档中的Camera 要使用Camera,首先我们先看一下文档中是怎么介绍的.相对于其他绝大多数类,文档对Camera的介绍还是比较详尽的,包含了使用过程中所需要的步骤说明,当然,这也表明了它在实际使用中的繁琐. 首先,需要在AndroidManifest.xml中声明以下权限和特性: <uses-permission android:name="android.permission.CAMERA

  • Android  调用系统应用的方法总结

    Android  调用系统应用的方法总结 1.调用系统拍照 Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); //保存到指定目录 File file = new File("/mnt/sdcard/picture"); if (!file.exists()) { file.mkdirs(); } File out = new File("/mnt/sdcard/picture

  • Android实现拍照、选择图片并裁剪图片功能

    一. 实现拍照.选择图片并裁剪图片效果 按照之前博客的风格,首先看下实现效果. 二. uCrop项目应用 想起之前看到的Yalantis/uCrop效果比较绚,但是研究源码之后发现在定制界面方面还是有一点的限制,于是在它的基础上做了修改Android-Crop,把定制界面独立出来,让用户去自由设置.下图为使用Android-Crop实现的模仿微信选择图片并裁剪Demo. 三. 实现思路 比较简单的选择设备图片裁剪,并将裁剪后的图片保存到指定路径: 调用系统拍照,将拍照图片保存在SD卡,然后裁剪图

  • Android Surfaceview的绘制与应用

    Android  Surfaceview的绘制与应用 一.surfaceview与view的区别 Android 提供了view进行视图的绘制,可以满足大部分的会图需求,但在有些时候却是心有余而力不足.我们知道,view通过刷新来绘制视图.android系统通过vsync信号来进行屏幕的绘制.刷新的时间间隔为16毫秒.如果在16毫秒内完成了索要刷新的绘制操作,那么在视觉效果上就不会产生卡顿的感觉.如果逻辑操作过多,频繁刷新就会造成界面的卡顿. 对于这一问题,Android提供了surfacevi

随机推荐