当前位置: 移动技术网 > 移动技术>移动开发>Android > Android SurfaceView拍照录像实现方法

Android SurfaceView拍照录像实现方法

2019年07月24日  | 移动技术网移动技术  | 我要评论
surface的拍照实现也是很简单,一个小demo就可以把流程看懂了。 话不多说,直接上代码 布局文件 <surfaceview and

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>

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

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网