当前位置: 首页 > 知识库问答 >
问题:

如何在mainactivity中停止和重新启动java代码(QRcode、Android、Vision)

耿运浩
2023-03-14

我找到了一个很好的QRcode/条形码识别代码——它工作得很好,但是!它不停地工作。检测到的代码以条形码文本显示,但方法/proces/camera(initialiseDetectorsAndSources())仍在工作。我尝试了一些方法来阻止它,并找到了那个摄像源。release()在某种程度上起作用了:相机停止了,但我不确定探测器进程是否仍在后台某处运行?。然后,我添加了一个按钮,再次启动initialiseDetectorsAndSources()方法=

如何在创建代码后停止代码的进程或识别?

如何重新开始读取下一个qrcode的过程?

我可以将initialiseDetectorsAndSources()方法移动到mainactivity之外的新类吗。。。这个方法在程序启动后开始-我想在。。。例如,我按下一个按钮。

谢谢你的帮助:)

这是我的主要活动。爪哇:

package net.ginekolog.qrtest01;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;

import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.media.AudioManager;
import android.media.ToneGenerator;
import android.os.Bundle;
import android.util.SparseArray;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.vision.CameraSource;
import com.google.android.gms.vision.Detector;
import com.google.android.gms.vision.barcode.Barcode;
import com.google.android.gms.vision.barcode.BarcodeDetector;

import java.io.IOException;
import java.util.Objects;

public class MainActivity extends AppCompatActivity {

    private SurfaceView surfaceView;
    private BarcodeDetector barcodeDetector;
    private CameraSource cameraSource;
    private static final int REQUEST_CAMERA_PERMISSION = 201;
    private ToneGenerator toneGen1;
    private TextView barcodeText;
    private String barcodeData;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        toneGen1 = new ToneGenerator(AudioManager.STREAM_MUSIC, 100);
        surfaceView = findViewById(R.id.surface_view);
        barcodeText = findViewById(R.id.barcode_text);

        Button button = (Button) findViewById(R.id.startQRscanButton);
        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                // Do something in response to button click
                initialiseDetectorsAndSources();
                Toast.makeText(getApplicationContext(), "button clicked", Toast.LENGTH_LONG).show();
            }
                    });

        // initialiseDetectorsAndSources();
        Toast.makeText(getApplicationContext(), "onCreate : end", Toast.LENGTH_LONG).show();
    }

    private void initialiseDetectorsAndSources() {

        Toast.makeText(getApplicationContext(), "iD&S : Barcode scanner started", Toast.LENGTH_SHORT).show();

        barcodeDetector = new BarcodeDetector.Builder(this)
                .setBarcodeFormats(Barcode.ALL_FORMATS)
                .build();

        cameraSource = new CameraSource.Builder(this, barcodeDetector)
                .setRequestedPreviewSize(1024, 768)//1920x1080
                .setAutoFocusEnabled(true)//you should add this feature
                //.setRequestedFps(10)//default is 30
                .build();

        surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
            @Override
            public void surfaceCreated(SurfaceHolder holder) {
                try {
                    if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
                        cameraSource.start(surfaceView.getHolder());
                    } else {
                        ActivityCompat.requestPermissions(MainActivity.this, new
                                String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

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

            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {
                cameraSource.stop();
            }
        });

        barcodeDetector.setProcessor(new Detector.Processor<Barcode>() {
            @Override
            public void release() {
                Toast.makeText(getApplicationContext(), "release : To prevent memory leaks barcode scanner has been stopped", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void receiveDetections(Detector.Detections<Barcode> detections) {
                final SparseArray<Barcode> barcodes = detections.getDetectedItems();
                if (barcodes.size() != 0) {

                    barcodeText.post(new Runnable() {

                        @Override
                        public void run() {

                            if (barcodes.valueAt(0).email != null)
                            {
                                barcodeText.removeCallbacks(null);
                                barcodeData = barcodes.valueAt(0).email + " - email ";
                                // barcodeData = barcodes.valueAt(0).email.address;
                                // barcodeData = barcodes.valueAt(0).rawValue;
                                barcodeText.setText(barcodeData);
                                toneGen1.startTone(ToneGenerator.TONE_CDMA_PIP, 1150);
                                // stop kamera
                                cameraSource.release();
                            }
                            else
                            {
                                barcodeData = barcodes.valueAt(0).displayValue + " display value ";
                                barcodeText.setText(barcodeData);
                                toneGen1.startTone(ToneGenerator.TONE_CDMA_PIP, 1150);
                                // stop ... how ?
                                // cameraSource.stop();
                                // barcodes.clear();
                                cameraSource.release();
                                // barcodeDetector.release();
                                // surfaceView.releasePointerCapture();
                                // surfaceView.clearFocus();
                                // release();
                            }
                        }
                    });

                }
            }
        });
    };

    @Override
    protected void onPause() {
        super.onPause();
        Objects.requireNonNull(getSupportActionBar()).show();
        cameraSource.release();
    }

    @Override
    protected void onResume() {
        super.onResume();
        Objects.requireNonNull(getSupportActionBar()).show();
        initialiseDetectorsAndSources();
    }
}

共有1个答案

荆哲
2023-03-14

到目前为止,还没有人试图回答这个问题,所以我试图找到一些解决方案。我发现:这项活动的一部分是在后台进行的,所以我认为最好的办法是把整个班级分成单独的活动,然后从主要活动中调用它。当这个活动完成后,我将回到主要活动,从而完成相机和条形码检测器的背景活动。好的链接如何停止活动:如何关闭活动并返回到android中的上一个活动

 类似资料:
  • 问题内容: 我很难找到一种方法来启动,停止和重新启动Java中的线程。 具体来说,我在中有一个类Task(当前实现)。我的主应用程序需要能够在线程上启动此任务,在需要时停止(杀死)该线程,有时还可以杀死并重新启动该线程… 我的第一次尝试是与,但我似乎找不到办法重新启动任务。当我使用任何将来的呼叫失败时,因为是“关机” … 那么,我该怎么做呢? 问题答案: 一旦线程停止,你将无法重新启动它。但是,没

  • Triathlon程序执行一个长时间运行的任务,如果该任务已完全执行,则有可能重新启动该任务。我想添加停止执行以重置UI的可能性。为了达到这个目的,我增加了一个新的按钮,停止。代码如下: 如果任务已经完成,程序很好地重新启动,但是如果我在停止它之后调用start,程序就会崩溃。我该纠正什么?

  • 我无法停止。它的样式是。如何启动和停止圆形的小型?

  • 本文向大家介绍Android定时器Timer的停止和重启实现代码,包括了Android定时器Timer的停止和重启实现代码的使用技巧和注意事项,需要的朋友参考一下 本文介绍了Android定时器Timer的停止和重启实现代码,分享给大家,具体如下: 7月份做了一个项目,利用自定义控件呈现一幅动画,当时使用定时器来控制时间,但是当停止开启时总是出现问题。一直在寻找合理的方法解决这个问题,一直没有找到

  • 本文档叙述了在类Unix系统上如何停止和重启Apache 。 Windows NT/2000/XP/2003的用户请参见以服务方式运行Apache ,Windows 9x/ME用户则参见在控制台中运行Apache 。 简介 为了停止或者重新启动Apache ,你必须向正在运行的httpd进程发送信号。有两种发送信号的方法。第一种方法是直接使用UNIX的kill命令向运行中的进程发送信号。你也许你会

  • 问题内容: 我使用以下命令从映像启动docker容器: 当完成后,容器停止(我想这已停止),但它并没有被删除,因为我可以用这个命令来查看它: 有什么办法可以使用相同的参数将此容器保持由生成的数据? 问题答案: 是的,当初始命令完成执行后,容器将停止。 您可以使用以下方法启动已停止的容器: 如果要查看命令的输出,则应添加选项: PS。有一个,但用于重新启动正在运行的容器-我相信情况并非如此。