硬件环境:小米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开发过程中,有时需要调用手机自身设备的功能,本文侧重摄像头拍照功能的调用。 知识点介绍: 使用权限:调用手机自身设备功能(摄像头拍照功能),应该确保已经在AndroidManifest.xml中正确声明了对摄像头的使用及其它相关的feature 1.
这是我第一次在Android上使用相机开发,我已经测试了我在链接中找到的相机演示https://thenewcircle.com/s/post/39/using__the_camera_api 但我对这段代码有一些问题:( 首先,这似乎有必要将这一行添加到Preview(上下文上下文)的代码中 (如果我不添加此测试,程序将崩溃) 就在这条线之前 因为setType()调用现在似乎被弃用了(这就是A
本文向大家介绍C#实现调用本机摄像头实例,包括了C#实现调用本机摄像头实例的使用技巧和注意事项,需要的朋友参考一下 本文实例源自一个项目,其中需要调用本机的摄像头进行拍照,分享给大家供大家参考之用。具体步骤如下: 硬件环境:联想C360一体机,自带摄像头 编写环境:vs2010 语言:C# WPF 实现步骤: 下载AForge类库,并添加引用: 在xaml界面中添加VideoSourcePlaye
问题内容: 在我的相机应用中,您可以在前后相机之间切换。当我使用后置摄像头拍照时,照片与预览显示的一样。但是当我切换到前置摄像头时,图片是镜像的。我认为这与前置摄像头和后置摄像头处于横向模式有关。我已经尝试了几乎所有给定的答案。 如果有人可以向我指出正确的方向,那将真的有帮助。 问题答案: 我找到了答案,这样做没有帮助。我必须镜像生成的位图才能获得所需的结果。我使用Matrix方法来实现这一目标。
我的第一个问题!我有一段代码有问题,它用额外的输出选项开始相机意图,然后在活动结果上试图调整图像的大小。正在发生的情况是,在回调时的resize函数中会引发一个nullpointer异常。 活动结果回调函数: 下面是logcat:
什么是照相机实时滤镜的最佳方式。我最近正在使用链接中的GPUImage库:https://github.com/CyberAgent/android-gpuimagelibrary.比我找到的SurfaceView和GLSurfaceView还要多。 问题是:如何使用SurfaceView或GLSurfaceView将实时过滤器应用于摄影机。 提前感谢。