欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android SurfaceView拍照录像实现方法

程序员文章站 2023-12-20 19:49:46
surface的拍照实现也是很简单,一个小demo就可以把流程看懂了。 话不多说,直接上代码 布局文件

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>

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

上一篇:

下一篇: