全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Android调用前后摄像头同时工作实例代码

硬件环境:小米4

Android版本:6.0

咱们先看效果图:

我把代码贴出来:

AndroidMainfest.xml文件(需要新增camera权限):

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

activity_main.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.bihu.qdemopush.MainActivity">

<LinearLayout
  android:layout_width="match_parent"
  android:layout_height="200dp"
  android:orientation="horizontal">
  <SurfaceView
    android:id="@+id/surfaceview1"
    android:layout_width="0dp"
    android:layout_weight="1"
    android:layout_height="fill_parent" />
  <SurfaceView
    android:id="@+id/surfaceview2"
    android:layout_width="0dp"
    android:layout_weight="1"
    android:layout_marginLeft="5dp"
    android:layout_height="fill_parent" />
</LinearLayout>
</LinearLayout>

MainActivity.java文件:主要是对2个surfaceView的显示渲染

public class MainActivity extends AppCompatActivity {

SurfaceView surfaceview1, surfaceview2;
SurfaceHolder surfaceholder1, surfaceholder2;
String TAG = "MainActivity";
private Camera camera1 = null, camera2;
Camera.Parameters parameters;

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  surfaceview1 = (SurfaceView) findViewById(R.id.surfaceview1);
  surfaceview2 = (SurfaceView) findViewById(R.id.surfaceview2);
  surfaceholder1 = surfaceview1.getHolder();
  surfaceholder1.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  surfaceholder1.addCallback(new surfaceholderCallbackBack());

  surfaceholder2 = surfaceview2.getHolder();
  surfaceholder2.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  surfaceholder2.addCallback(new surfaceholderCallbackFont());
}

@Override
protected void onDestroy() {
  Log.e(TAG, "onDestroy");
  super.onDestroy();
}

/**
 * 后置摄像头回调
 */
class surfaceholderCallbackBack implements SurfaceHolder.Callback {
  @Override
  public void surfaceCreated(SurfaceHolder holder) {
    // 获取camera对象
    int cameraCount = Camera.getNumberOfCameras();
    if (cameraCount > 0) {
      camera1 = Camera.open(0);
      try {
        // 设置预览监听
        camera1.setPreviewDisplay(holder);
        Camera.Parameters parameters = camera1.getParameters();

        if (MainActivity.this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE) {
          parameters.set("orientation", "portrait");
          camera1.setDisplayOrientation(90);
          parameters.setRotation(90);
        } else {
          parameters.set("orientation", "landscape");
          camera1.setDisplayOrientation(0);
          parameters.setRotation(0);
        }
        camera1.setParameters(parameters);
        // 启动摄像头预览
        camera1.startPreview();
        System.out.println("camera.startpreview");

      } catch (IOException e) {
        e.printStackTrace();
        camera1.release();
        System.out.println("camera.release");
      }
    }
  }

  @Override
  public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    camera1.autoFocus(new Camera.AutoFocusCallback() {
      @Override
      public void onAutoFocus(boolean success, Camera camera) {
        if (success) {
          initCamera();// 实现相机的参数初始化
          camera.cancelAutoFocus();// 只有加上了这一句,才会自动对焦。
        }
      }
    });

  }

  @Override
  public void surfaceDestroyed(SurfaceHolder holder) {

  }

  // 相机参数的初始化设置
  private void initCamera() {
    parameters = camera1.getParameters();
    parameters.setPictureFormat(PixelFormat.JPEG);
    parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);// 1连续对焦
    setDispaly(parameters, camera1);
    camera1.setParameters(parameters);
    camera1.startPreview();
    camera1.cancelAutoFocus();// 2如果要实现连续的自动对焦,这一句必须加上
  }

  // 控制图像的正确显示方向
  private void setDispaly(Camera.Parameters parameters, Camera camera) {
    if (Integer.parseInt(Build.VERSION.SDK) >= 8) {
      setDisplayOrientation(camera, 90);
    } else {
      parameters.setRotation(90);
    }

  }

  // 实现的图像的正确显示
  private void setDisplayOrientation(Camera camera, int i) {
    Method downPolymorphic;
    try {
      downPolymorphic = camera.getClass().getMethod("setDisplayOrientation", new Class[]{int.class});
      if (downPolymorphic != null) {
        downPolymorphic.invoke(camera, new Object[]{i});
      }
    } catch (Exception e) {
      Log.e("Came_e", "图像出错");
    }
  }
}

class surfaceholderCallbackFont implements SurfaceHolder.Callback {
  @Override
  public void surfaceCreated(SurfaceHolder holder) {
    // 获取camera对象
    int cameraCount = Camera.getNumberOfCameras();
    if (cameraCount == 2) {
      camera2 = Camera.open(1);
    }
    try {
      // 设置预览监听
      camera2.setPreviewDisplay(holder);
      Camera.Parameters parameters = camera2.getParameters();

      if (MainActivity.this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE) {
        parameters.set("orientation", "portrait");
        camera2.setDisplayOrientation(90);
        parameters.setRotation(90);
      } else {
        parameters.set("orientation", "landscape");
        camera2.setDisplayOrientation(0);
        parameters.setRotation(0);
      }
      camera2.setParameters(parameters);
      // 启动摄像头预览
      camera2.startPreview();
      System.out.println("camera.startpreview");

    } catch (IOException e) {
      e.printStackTrace();
      camera2.release();
      System.out.println("camera.release");
    }
  }

  @Override
  public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    camera2.autoFocus(new Camera.AutoFocusCallback() {
      @Override
      public void onAutoFocus(boolean success, Camera camera) {
        if (success) {
          parameters = camera2.getParameters();
          parameters.setPictureFormat(PixelFormat.JPEG);
          parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);// 1连续对焦
          setDispaly(parameters, camera2);
          camera2.setParameters(parameters);
          camera2.startPreview();
          camera2.cancelAutoFocus();// 2如果要实现连续的自动对焦,这一句必须加上
          camera.cancelAutoFocus();// 只有加上了这一句,才会自动对焦。
        }
      }
    });

  }

  @Override
  public void surfaceDestroyed(SurfaceHolder holder) {

  }

  // 控制图像的正确显示方向
  private void setDispaly(Camera.Parameters parameters, Camera camera) {
    if (Integer.parseInt(Build.VERSION.SDK) >= 8) {
      setDisplayOrientation(camera, 90);
    } else {
      parameters.setRotation(90);
    }

  }

  // 实现的图像的正确显示
  private void setDisplayOrientation(Camera camera, int i) {
    Method downPolymorphic;
    try {
      downPolymorphic = camera.getClass().getMethod("setDisplayOrientation", new Class[]{int.class});
      if (downPolymorphic != null) {
        downPolymorphic.invoke(camera, new Object[]{i});
      }
    } catch (Exception e) {
      Log.e("Came_e", "图像出错");
    }
  }
}
}

可能出现的问题:

1、没有权限,需要手动打开,代码里由于追求简便,没有主动申请,只在mainfest中注册了

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


# Android调用前后摄像头  # android调用摄像头  # Android调用外置摄像头的方法  # Android调用手机摄像头拍照和录音功能  # Android实现调用手机摄像头录像限制录像时长  # Android调用手机摄像头的方法  # Android实现调用摄像头拍照并存储照片  # Android实现调用摄像头拍照与视频功能  # Android实现调用摄像头进行拍照功能  # Android开发教程之调用摄像头功能的方法详解  # android开发之调用手机的摄像头使用MediaRecorder录像并播放  # Androidstudio调用摄像头拍照并保存照片  # 这一  # 自动对焦  # 才会  # 对焦  # 我把  # 只在  # 可能出现  # 贴出  # 没有权限  # 回调  # 先看  # 大家多多  # 主要是  # layout_marginLeft  # java  # bihu  # context  # vertical  # SurfaceView 


相关文章: 香港服务器网站生成指南:免费资源整合与高速稳定配置方案  网站企业制作流程,用什么语言做企业网站比较好?  建站之星导航如何优化提升用户体验?  独立制作一个网站多少钱,建立网站需要花多少钱?  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  ,网页ppt怎么弄成自己的ppt?  巅云智能建站系统:可视化拖拽+多端适配+免费模板一键生成  临沂网站制作公司有哪些,临沂第四中学官网?  专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?  如何在Golang中处理模块冲突_解决依赖版本不兼容问题  如何获取上海专业网站定制建站电话?  定制建站方案优化指南:企业官网开发与建站费用解析  子杰智能建站系统|零代码开发与AI生成SEO优化指南  如何有效防御Web建站篡改攻击?  建站之星微信建站一键生成小程序+多端营销系统  如何彻底删除建站之星生成的Banner?  如何在腾讯云免费申请建站?  浅析上传头像示例及其注意事项  建站之星24小时客服电话如何获取?  建站VPS选购需注意哪些关键参数?  如何在七牛云存储上搭建网站并设置自定义域名?  三星网站视频制作教程下载,三星w23网页如何全屏?  如何用VPS主机快速搭建个人网站?  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  英语简历制作免费网站推荐,如何将简历翻译成英文?  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  如何选择美橙互联多站合一建站方案?  已有域名建站全流程解析:网站搭建步骤与建站工具选择  教学论文网站制作软件有哪些,写论文用什么软件 ?  宝塔新建站点为何无法访问?如何排查?  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?  免费公司网站制作软件,如何申请免费主页空间做自己的网站?  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  如何撰写建站申请书?关键要点有哪些?  如何在建站之星绑定自定义域名?  中山网站推广排名,中山信息港登录入口?  黑客如何利用漏洞与弱口令入侵网站服务器?  定制建站流程步骤详解:一站式方案设计与开发指南  建站OpenVZ教程与优化策略:配置指南与性能提升  海南网站制作公司有哪些,海口网是哪家的?  如何在服务器上三步完成建站并提升流量?  如何注册花生壳免费域名并搭建个人网站?  如何快速搭建高效可靠的建站解决方案?  怎么用手机制作网站链接,dw怎么把手机适应页面变成网页?  如何在景安云服务器上绑定域名并配置虚拟主机?  在线教育网站制作平台,山西立德教育官网?  高性能网站服务器部署指南:稳定运行与安全配置优化方案 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。