AndroidcameraSource.stop()导致应用程序冻结

2024-01-20

我正在使用 google Vision API 构建一个具有二维码扫描仪的应用程序。读取二维码后,我无法停止相机。流量是MainActivity -> QrActivity一旦二维码收到检测,应用程序应返回到主活动。

如果我不打电话cameraSource.release()它工作正常,但设备会发热很多,并对电池消耗产生重大影响。但是,如果我释放相机源,mainActivity 将变得无响应并且应用程序将崩溃。

为什么它变得没有反应?发布相机源的正确位置在哪里?

Qr活动

@Override
protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_qr);
    cancelBtn = (Button) findViewById(R.id.cancel_button);
    cancelBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            onBackPressed();
        }
    });

    new QrReader(this);
}

QrReader类

public class QrReader {

    private static final String TAG = "QrReader";

    private SurfaceView cameraView;
    private TextView barcodeInfo;
    private BarcodeDetector barcodeDetector;
    private CameraSource cameraSource;
    private Activity mActivity;
    private AccessPointCredentials barCodeData;

    public QrReader(Activity activity) {
        this.mActivity = activity;

        cameraView = (SurfaceView) mActivity.findViewById(R.id.camera_view);
        barcodeInfo = (TextView) mActivity.findViewById(R.id.code_info);

        barcodeDetector =
                new BarcodeDetector.Builder(mActivity)
                        .setBarcodeFormats(Barcode.QR_CODE)
                        .build();

        cameraSource = new CameraSource
                .Builder(mActivity, barcodeDetector)
                .setAutoFocusEnabled(true)
                .build();

        cameraView.getHolder().addCallback(new SurfaceHolder.Callback() {

            @Override
            public void surfaceCreated(SurfaceHolder holder) {

                cameraSource = new CameraSource
                        .Builder(mActivity, barcodeDetector)
                        .setAutoFocusEnabled(true)
                        .setFacing(0)
                        .build();
                try {                  
                    cameraSource.start(cameraView.getHolder());

                } catch (Exception ioe) {
                    ioe.printStackTrace();
                }
            }

            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
            }

            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {
                  // Log.i(TAG, "surfaceDestroyed: stopping camera Source");

                  // cameraSource.release();
            }
        });

        barcodeDetector.setProcessor(new Detector.Processor<Barcode>() {
            @Override
            public void release() {
                Log.i(TAG, "release: ");
            }

            @Override
            public void receiveDetections(Detector.Detections<Barcode> detections) {
                final SparseArray<Barcode> barCodes = detections.getDetectedItems();

                if (barCodes.size() != 0) {

                    Log.i(TAG, "received a Barcode");
                    barcodeInfo.post(new Runnable() {    // Use the post method of the TextView
                        public void run() {
                            barcodeInfo.setText(barCodes.valueAt(0).displayValue);

                        }
                    });
                    Gson g = new Gson();
                    try {
                        barCodeData = g.fromJson(barCodes.valueAt(0).rawValue, AccessPointCredentials.class);
                    } catch (Exception e) {
                        barCodeData = new AccessPointCredentials();
                        barCodeData.setSsid(barCodes.valueAt(0).rawValue);
                        barCodeData.setPass(null);
                        e.printStackTrace();
                    }

                    connectToWifi(barCodeData);

                    // CameraSource.release causes app to freeze

                    // cameraSource.release();
                }
            }
        });
    }

    private void connectToWifi(final AccessPointCredentials credentials) {

                //wificonnect code

    }

}

已经三个月了,但我偶然发现了同样的问题并解决了。 receiveDetections 方法内的代码在不同的线程上运行,因此如果您想做一些需要 ui 线程的事情,您需要从处理程序发布它:

Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
     @Override
     public void run() {
         cameraSource.release();
     }
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AndroidcameraSource.stop()导致应用程序冻结 的相关文章

随机推荐

  • clang 如何引导 C/C++ 代码优化?

    有人告诉我 clang 是一个像 gcc 一样工作的驱动程序 可以进行预处理 编译和链接工作 在编译和链接过程中 据我所知 实际上是llvm进行了优化 O1 O2 O3 Os flto 但我就是无法理解howllvm参与其中 看来编译源代码
  • jQuery 多个选择器,获取哪个选择器触发事件

    当处理具有多个选择器的事件时 例如 item a another item a click function e 是否可以确定哪个父选择器触发了该事件 是吗 item or another item 谢谢你 由于选择器可以是任何东西 因此您
  • 量角器 e2e 抛出 webdriver 未定义

    我的量角器一直在运行 直到几天前我开始遇到 Using the selenium server at http localhost 4444 wd hub UNCAUGHT EXCEPTION Error connect ECONNREFU
  • 在 Haskell 中动态构建列表理解

    我很好奇是否可以在 Haskell 中动态构建列表理解 举个例子 如果我有以下内容 all pows a a b b a y b z y lt take a 0 z lt take b 0 我得到了我所追求的 Main gt List so
  • hashCode 等于 Integer.MIN_VALUE 的 Java 字符串

    是否存在 hashCode 完全等于 Integer MIN VALUE 的已知 Java 字符串 为哈希表编写测试有助于避免在执行余数运算之前在哈希码上运行 Math Abs 的常见错误 理想情况下 该字符串仅包含 ASCII 字符 但我
  • 在mysql中,显示数据库;命令未列出我的所有数据库

    我可以使用 HeidiSQL 访问我的所有数据库 但是如果我转到 mysql exe 窗口并使用显示数据库 11 个中只有 2 个出现 这些都是 127 0 0 1 上的数据库 有什么想法吗 您正在登录 HeidiSQLroot 所以它向您
  • Docker 中的 ng build --prod 非常慢

    当我尝试在 docker 中构建 angular7 项目时 大约需要 40 分钟 需要40分钟的线路是 ng 构建 prod 92 块资产优化 TerserPlugin 我在同一台笔记本电脑上在 docker 外部运行了 ng build
  • 创建 vscode 主题时如何自定义命令调色板颜色和键绑定

    为自己创建一个 VSCode 主题 我喜欢目前的颜色配置 但是当我打开命令调色板时 它是 透视 的 因此很难阅读 设计主题时如何配置调色板 V1 36为命令调色板 快速打开面板添加了这两个颜色自定义 quickInput backgroun
  • Gcc 隐藏来自包含的静态库的符号的可见性

    I have 一个共享库 比如说libShared so 其中包含一个类Bar 用一种方法int Bar do int d const 一个静态库 比如说libStatic a 其中包含一个类Foo 用一种方法int Foo act int
  • 如何在 C# 中更改 EMF+ 图像的颜色

    我正在尝试开发一种特殊类型的热图 其中标记的颜色取决于某些计算变量的值 我需要做的是更改现有 EMF Image 的颜色 以下代码在使用 png 或 wmf 文件时非常有用 但在使用 EMF 文件时 DrawImage 不会绘制任何内容 E
  • 如何创建非托管 Neo4j 扩展?

    我对我的项目有一些具体要求 因此我决定实现非托管 Neo4j 扩展 我在 Neo4j 文档中找到了这些信息 非托管扩展 http neo4j com docs stable server unmanaged extensions html
  • ARKit 人物遮挡样本是如何完成的?

    这可能是一个晦涩的问题 但我在网上看到了很多非常酷的示例 展示了人们如何使用 ARKit 3 中新的 ARKit 人物遮挡技术来有效地将人物与背景 分离 并对 人物 应用某种过滤 人 见 在查看苹果提供的源代码和文档时 我发现我可以检索se
  • scala 中 Magic 的 ColumnNotFound 问题

    我收到 play exceptions JavaExecutionException 尝试后在一段代码中出现 ColumnNotFound comments id 迁移到 MySql 而不是 memorydb Magic 对 Postgre
  • Graphics.MeasureString 允许过多空白

    我正在使用一个函数来调用要在区域内呈现的一段文本 该函数的基本工作原理是 Dim measureSize as Size Do myFont new Font myFont Name myFont Size 1 FontStyle Regu
  • 同时ajax请求angularjs?

    我想一次发送多个ajax请求 这是我的js代码 a class btn btn success Re Check a app controller customersCrtl function scope http timeout func
  • 是否可以缓存 lambda 表达式中计算的值?

    下面代码中的ContainsIngredients方法中 是否可以缓存p 成分value 而不是多次显式引用它 这是一个相当简单的示例 我只是为了说明目的而编写的 但我正在处理的代码引用了内部深处的值p eg p InnerObject E
  • glfwGetVideoMode(glfwGetPrimaryMonitor()) 不起作用

    所以我正在观看关于如何使用 Lwjgl 创建窗口的 java 教程 我到达了这部分 您可以在其中获得主监视器 ByteBuffer vidmode glfwGetVideoMode glfwGetPrimaryMonitor glfwSet
  • 如何设置默认的Windows套件(SDK)版本?

    我曾经在我的 C 应用程序中使用 Windows 8 1 SDK 一切正常 今天我安装了 Windows 10 SDK 但找不到一种方法将其设为默认 我可以在 Visual Studio 项目设置中对新的 SDK 路径进行硬编码 但这是非常
  • Xcode - 单元测试 - 针对 iOS 12 进行编译,但模块的最低部署目标为 13

    我在运行单元测试时遇到问题 问题位于代码行下方 testable导入PROJECT NAME Error Compiling for iOS 12 1 but module PROJECT NAME has a minimum deploy
  • AndroidcameraSource.stop()导致应用程序冻结

    我正在使用 google Vision API 构建一个具有二维码扫描仪的应用程序 读取二维码后 我无法停止相机 流量是MainActivity gt QrActivity一旦二维码收到检测 应用程序应返回到主活动 如果我不打电话camer