Android 相机教程(使用 SurfaceView)

2024-03-31

这是我的示例代码:

package newslab.video.server;

import android.app.Activity;
import android.hardware.Camera;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class VideoServer extends Activity implements SurfaceHolder.Callback {
    TextView testView;

    Camera camera;
    SurfaceView surfaceView;
    SurfaceHolder surfaceHolder;

    private final String tag = "VideoServer";

    Button start, stop;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        start = (Button)findViewById(R.id.btn_start);
        start.setOnClickListener(new Button.OnClickListener() {
            public void onClick(View arg0) {
                start_camera();
            }
        });

        stop = (Button)findViewById(R.id.btn_stop);
        stop.setOnClickListener(new Button.OnClickListener() {
            public void onClick(View arg0) {
                stop_camera();
            }
        });

        surfaceView = (SurfaceView)findViewById(R.id.surfaceView1);
        surfaceHolder = surfaceView.getHolder();
        surfaceHolder.addCallback(this);
        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    private void start_camera() {
        try{
            camera = Camera.open();
        }catch(RuntimeException e){
            Log.e(tag, "init_camera: " + e);
            return;
        }
        Camera.Parameters param;
        param = camera.getParameters();
        //modify parameter
        param.setPreviewFrameRate(20);
        param.setPreviewSize(176, 144);
        camera.setParameters(param);
        try {
            camera.setPreviewDisplay(surfaceHolder);
            camera.startPreview();
        } catch (Exception e) {
            Log.e(tag, "init_camera: " + e);
            return;
        }
    }

    private void stop_camera() {
        camera.stopPreview();
        camera.release();
    }

    public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
        // TODO Auto-generated method stub
    }

    public void surfaceCreated(SurfaceHolder holder) {
        // TODO Auto-generated method stub
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        // TODO Auto-generated method stub
    }
}

但是,它仅显示预览并停止相机。
是否有其他教程可以教授进一步的处理,例如如何保存图像或使用位图处理图像?


好的。所以这是解决方案:

我没有添加任何 try catch。 这只是为了捕获图像并将其存储到 SD 卡中。

public class VideoServer extends Activity implements SurfaceHolder.Callback {
    TextView testView;

    Camera camera;
    SurfaceView surfaceView;
    SurfaceHolder surfaceHolder;
    PictureCallback rawCallback;
    ShutterCallback shutterCallback;
    PictureCallback jpegCallback;
    private final String tag = "VideoServer";

    Button start, stop, capture;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        start = (Button)findViewById(R.id.btn_start);
        start.setOnClickListener(new Button.OnClickListener()
        {
            public void onClick(View arg0) {
                start_camera();
            }
        });
        stop = (Button)findViewById(R.id.btn_stop);
        capture = (Button) findViewById(R.id.capture);
        stop.setOnClickListener(new Button.OnClickListener()
        {
            public void onClick(View arg0) {
                stop_camera();
            }
        });
        capture.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                captureImage();
            }
        });

        surfaceView = (SurfaceView)findViewById(R.id.surfaceView1);
        surfaceHolder = surfaceView.getHolder();
        surfaceHolder.addCallback(this);
        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        rawCallback = new PictureCallback() {
            public void onPictureTaken(byte[] data, Camera camera) {
                Log.d("Log", "onPictureTaken - raw");
            }
        };

        /** Handles data for jpeg picture */
        shutterCallback = new ShutterCallback() {
            public void onShutter() {
                Log.i("Log", "onShutter'd");
            }
        };
        jpegCallback = new PictureCallback() {
            public void onPictureTaken(byte[] data, Camera camera) {
                FileOutputStream outStream = null;
                try {
                    outStream = new FileOutputStream(String.format(
                            "/sdcard/%d.jpg", System.currentTimeMillis()));
                    outStream.write(data);
                    outStream.close();
                    Log.d("Log", "onPictureTaken - wrote bytes: " + data.length);
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                }
                Log.d("Log", "onPictureTaken - jpeg");
            }
        };
    }

    private void captureImage() {
        // TODO Auto-generated method stub
        camera.takePicture(shutterCallback, rawCallback, jpegCallback);
    }

    private void start_camera()
    {
        try{
            camera = Camera.open();
        }catch(RuntimeException e){
            Log.e(tag, "init_camera: " + e);
            return;
        }
        Camera.Parameters param;
        param = camera.getParameters();
        //modify parameter
        param.setPreviewFrameRate(20);
        param.setPreviewSize(176, 144);
        camera.setParameters(param);
        try {
            camera.setPreviewDisplay(surfaceHolder);
            camera.startPreview();
            //camera.takePicture(shutter, raw, jpeg)
        } catch (Exception e) {
            Log.e(tag, "init_camera: " + e);
            return;
        }
    }

    private void stop_camera()
    {
        camera.stopPreview();
        camera.release();
    }

    public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
        // TODO Auto-generated method stub
    }

    public void surfaceCreated(SurfaceHolder holder) {
        // TODO Auto-generated method stub
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        // TODO Auto-generated method stub
    }

}

不要按caputure之前的按钮start,因为我没有检查过。我只是想向您展示如何捕获图像并将其存储到sdcard.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 相机教程(使用 SurfaceView) 的相关文章

  • Android自定义控件命名空间问题

    我一直在为 Android 开发自定义控件 尽管我尝试按照建议进行操作here https stackoverflow com questions 4495511 how to pass custom component parameter
  • 如何使用retrofit2进行GET请求?

    我有一个在本地主机上运行的安静的 Web 服务 我想在该剩余 URL 上发出 Retrofit2 GET 请求 MainActivity java private void requestData public static final S
  • 添加动态数据时 footable 出现问题

    我需要 jQuery Mobile 方面的一些帮助富表 http css tricks com footable a jquery plugin for responsive data tables 我正在表中动态添加数据 HTML tab
  • Android 5.0 Lollipop 中屏幕固定关闭时如何收到通知?

    我有一个在后台运行的应用程序 并在手机上发生特定事件时启动活动 我发现在 Android 5 0 中 当用户使用另一个应用程序打开屏幕固定时 startActivity intent 调用将被完全忽略 我的应用程序不知道该活动尚未启动 因此
  • 如何在 Android 应用程序中单击按钮时打开 Gmail Compose?

    当我的 Android 应用程序中单击按钮时 我尝试打开 Gmail 撰写屏幕 我需要 Google 提供的 API 密钥吗 或者我需要在按钮 onClickListener 中做什么 任何形式的见解都非常值得赞赏 正如 JeffC 指出的
  • Android CursorAdapter、ListView 和后台线程

    我一直在开发的这个应用程序有包含数兆字节数据的数据库可供筛选 许多活动只是列表视图 通过数据库中的各个级别的数据下降 直到到达 文档 即从数据库中提取并显示在手机上的 HTML 我遇到的问题是 其中一些活动需要能够通过捕获击键并重新运行带有
  • Android 8.1 中 Activity 自行旋转并恢复正常

    我的应用程序在所有 Android 版本上运行良好 但我注意到在 Android 8 1 0 Oreo 中 当我将屏幕从纵向活动转到横向活动时 以及当我按后退按钮时 它会显示异常行为 屏幕自动从横向旋转并恢复正常 看起来 Activity
  • Android 谷歌地图 V2 已停止

    我正在尝试构建地图应用程序并关注这个链接 https blog emildesign rhcloud com p 435一步步 我在这里找到了类似的主题 但对我没有帮助 我想显示地图 但是当我运行它时 它返回强制关闭和我的 Android
  • 更改 Android 中的媒体音量?

    我可以更改媒体音量吗 如何 到目前为止我用过这个 setVolumeControlStream AudioManager STREAM MUSIC 但有一个搜索栏并且想要更改媒体音量 而不是铃声音量 那么有人可以告诉我如何更改媒体音量onC
  • 将图像保存到内部存储器并将出现在图库中

    我搜索了很多与我的问题相关的问题 是否有办法将图像存储在内存中并且它也应该出现在图库中 这是完全有可能的 我以前也这么做过 在将图像保存到内存 或称为应用程序文件夹等 之前 您最好设置Context MODE WORLDREADABLE 虽
  • 如何在android中画一条曲线?

    我是 Android 新手 正在开发一个关于绘制线条的示例项目 我想画一条连接两点的曲线或高架线 x1 y1 and x2 y2 我试过canvas drawArc 方法 但是RectF内的值drawArc方法只是圆的 x y 中心点 它在
  • 我应该选择的最低 SDK 版本是多少? (截至2018年11月)

    据我所知 android studio 中默认的最小 SDK 设置是 15 我读到我应该增加它 因为没有多少人 或者可能没有 仍在使用该 android 版本 另外 我计划使用 android studio 中的一些新功能 这些功能仅适用于
  • Spotify 登录错误 INVALID_CLIENT:无效的重定向 URI android

    我正在制作一个包含 Spotify 集成的应用程序 我点击了此链接https developer spotify com technologies spotify android sdk tutorial https developer s
  • Android Drawable 绘图性能?

    在我看来 我有一个简单的 ARGB 可绘制对象 大约需要 2 毫秒才能绘制 但我可以在 0 5 毫秒内绘制与位图相同的文件 只是一些快速代码 我真的不能认为它是一个选项 优化可绘制对象的绘制速度的最佳方法是什么 这取决于可绘制的数量以及每个
  • SDK尚未初始化,请务必先调用FacebookSdk.sdkInitialize()

    我在实现 Facebook SDK 时遇到此错误 并且我tried https stackoverflow com questions 15490399 error inflating class com facebook widget l
  • Android复杂布局线性和相对

    I have to implement a layout like shown in the diagram and I do not know the best combination to achieve the required de
  • 如何通过 AppCompatActivity 使用 YouTube Android 播放器 API

    为了在我的应用程序中播放视频 我决定扩展 YouTube Android Player API 但问题是我的菜单消失了 因为我没有从 AppCompatActivity 扩展 问题是 如何使用 YouTube Android Player
  • 改造方法调用可能会产生“java.lang.NullPointerException”

    使用 Retrofit 2 3 0 我在 Android Studio 中收到以下消息 有关如何删除此 IDE 错误消息的任何建议 谢谢 来自Response文档 http square github io retrofit 2 x ret
  • 如何从灰度字节缓冲区图像创建位图?

    我正在尝试使用新的 Android 人脸检测移动视觉 API 来处理帧图像 所以我创建了自定义检测器来获取帧并尝试调用 getBitmap 方法 但它为空 所以我访问了帧的灰度数据 有没有办法从它或类似的图像持有者类创建位图 public
  • 膨胀类 android.support.design.widget.CoordinatorLayoute 时出错

    我正在尝试运行我的应用程序 但不断收到标题中列出的错误 我读过周围的内容 人们说尝试将主题更改为 AppCombat 主题 但这似乎不起作用 以下是我遇到的错误 Process com example jmeyer27 crazytiles

随机推荐

  • 如何查看Core Data中存储的数据?

    我正在为我的应用程序创建一个核心数据模型 我希望能够查看它的内部 看看我在那里存储了什么 有没有一个比搜索后备存储更简单的方法 我的应该是 SQLite 并从那里读取它 看起来不太像苹果风格 当您的应用程序在模拟器中运行并创建持久存储文件后
  • PDFBox 是否允许从 AcroForm 中删除一个字段?

    我正在使用阿帕奇PDF盒子2 0 8 https mvnrepository com artifact org apache pdfbox pdfbox 2 0 8并试图删除一个字段 但找不到方法来做到这一点 就像我可以用 iText 做的
  • Excel VBA 条件格式未执行

    这很奇怪 我正在从 MS Access 2003 VBA 创建 Excel 2003 电子表格 编码包括条件格式 如果单元格值大于 a value 则为红色 如果小于 a value 则为绿色 即使在生成电子表格时成功创建了 CF 公式 但
  • 从文件中读取最后一行

    我遇到了一个问题 我在 Linux 机器上有一个日志 其中写入了多个正在运行的进程的输出 这个文件有时会变得非常大 我需要读取该文件的最后一行 问题是此操作将经常通过 AJAX 请求调用 当该日志的文件大小超过 5 6MB 时 这对服务器来
  • PySpark PCA:避免 NotConvergedException

    我试图通过 ml linalg 方法使用 PCA 来减少广泛的数据集 51 个特征 约 1300 个个体 如下所示 1 将我的列命名为一个列表 features indi prep df select c for c in indi pre
  • bootstrap下拉菜单根据屏幕位置自动下拉?

    我想知道你们中是否有人已经准备好我所要求的东西 以帮助我摆脱麻烦 我正在寻找的是一个下拉菜单 可以根据其在屏幕上的位置自动添加下拉类 并且当用户滚动或调整窗口大小时也会自动更改 我正在寻找的内容已经在 bootstrap select 插件
  • .net Core amd Roslyn CSharpCompilation,类型“Object”在未引用的程序集中定义

    我正在尝试将一些 net 代码移植到新的 Core 运行时 但在移植一些即时编译时遇到了麻烦 要恢复 它总是要求我引用 System Runtime 和 mscorlib 但不知道如何引用它们 附带说明一下 我无法引用 Framework
  • 如何修复致命异常:Resources$NotFoundException:资源 ID #0x20c003b DeviceFormFactor.java 第 107 行 org.chromium.ui.base.DeviceFormFactor.a

    在 crashlytics 中得到这个 不知道问题出在哪里 Fatal Exception android content res Resources NotFoundException Resource ID 0x20c003b at a
  • 使用 JavaScript 加密本地存储的数据

    当我学习 JavaScript 和 HTML5 时 我正在尝试构建一个基本的测验应用程序 该应用程序会提出一些可在移动网络上运行的多项选择题 并且也可以作为使用 PhoneGap 的应用程序 当提出问题时 结果会存储在本地 我希望 Phon
  • java.lang.NoClassDefFoundError: org.joda.time.DateTime

    在 android 4 3 API 18 上启动应用程序时出现此错误 没有编译错误 并且库已添加到build gradle中 compile joda time joda time 2 9 2 在 android api 23 上工作没有问
  • Neo4j cpu 卡在 GC 上

    突然间 工作了一个月后 CPU 几乎没有使用 1 到 5 之间 neo4j 服务器在垃圾收集时 cpu 占用率达到 100 我在 ubuntu 4 处理器服务器上运行 neo4j entherprise 2 0 3 未嵌入 这是我的 neo
  • 将 XSD 导入 OpenAPI

    我的 XSD 文件中有一些模型定义 我需要从 OpenApi 定义中引用这些模型 由于文件太大 手动重新建模是不可能的 我需要将其放入构建系统中 这样如果 XSD 发生更改 我可以为 OpenApi 重新生成模型 架构 我尝试过并且几乎有效
  • Flutter - 每次关闭应用程序时存储对象列表的最佳方式?

    情况 我对 Flutter 和移动开发都很陌生 因此对 Dart 不太了解 我已经从有类似问题的人那里阅读了一些解决方案 但没有设法将这些解决方案应用于我自己的事情 问题 我有一个待办事项应用程序 它有 2 个对象列表 我想在用户重新打开应
  • 在 Eclipse/RCP 中定位工具栏

    我正在开发我的小型 RCP 应用程序 它需要一个自定义透视切换器来控制用户可以访问哪些视图 所以我在这里尝试添加一个带有几个按钮的工具栏来切换视角 我认为对这些内容进行一些控制的最佳方法是在 Application ActionBar Ad
  • 如何尽快有效地发出数千个网络请求

    我需要从 C 控制台应用程序发出 100 000 个轻量级 即小内容长度 Web 请求 我可以做到这一点的最快方法是什么 即在尽可能短的时间内完成所有请求 以及我应该遵循哪些最佳实践 我不能一劳永逸 因为我需要捕获响应 大概我想用async
  • MongoDB:匹配嵌套数组元素的计数

    我有一个简单的父子对象作为文档存储在 MongoDB 中 像 Order OrderItems 这样简单的东西 订单有一个 OrderItem 数组 我想要做的是查询满足一组条件的订单项目的数量 示例 在订单 999 中 找出数量为 3 的
  • PostgreSQL 立即选择值并递增

    我正在寻找以下可能的解决方案 我将数据存储在表中 以跟踪客户在数据库中想要的特殊增量编号 这是他们内部使用的特殊号码 我想要做的是当我选择它时自动增加表中的这个数字 因此 我不存在使用该系统的其他人使用相同 ID 号进行另一笔交易的问题 所
  • 使用内容重命名 PDF 文件的批处理脚本

    我有一个批处理脚本 用于提取 PDF 信息并重命名 PDF 该脚本对于 1 个 PDF 文件运行良好 但我需要直接在folder有很多 PDF 文件 那么该怎么做呢 该脚本需要针对每个 PDF 文件逐个运行 直至结束 一旦 PDF 文件被重
  • UWP,如何处理图像和缩放?

    我们有一个 Xamarin Forms 项目 它将在 Android iOS 和 UWP 上运行 在 Android 上 不同的文件夹中有许多不同的图像 以支持大量不同的屏幕 和 PPI 在 iOS 上 您有类似的系统 2x 3x 等 我一
  • Android 相机教程(使用 SurfaceView)

    这是我的示例代码 package newslab video server import android app Activity import android hardware Camera import android os Bundl