我找到了一个很好的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();
}
}
到目前为止,还没有人试图回答这个问题,所以我试图找到一些解决方案。我发现:这项活动的一部分是在后台进行的,所以我认为最好的办法是把整个班级分成单独的活动,然后从主要活动中调用它。当这个活动完成后,我将回到主要活动,从而完成相机和条形码检测器的背景活动。好的链接如何停止活动:如何关闭活动并返回到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。有一个,但用于重新启动正在运行的容器-我相信情况并非如此。