Java 我想在同一活动中停止摄影机源后重新启动它

Java 我想在同一活动中停止摄影机源后重新启动它,java,android,camera,surfaceview,Java,Android,Camera,Surfaceview,我申请了条形码检测器,所以我使用SurfaceView来处理camerasource。在摄像头检测到条形码并返回其值后,我使其停止。没有函数可以在任何事件上重新启动摄影机源和曲面视图,只有一个函数,即camersource.start() 它启动了,但问题是它在后台工作,我看不到如何解决这个问题?并再次显示surfaceview和相机源。 下面是activityoncreate方法的全部代码 @Override protected void onCreate(Bundle savedI

我申请了条形码检测器,所以我使用SurfaceView来处理camerasource。在摄像头检测到条形码并返回其值后,我使其停止。没有函数可以在任何事件上重新启动摄影机源和曲面视图,只有一个函数,即camersource.start()

它启动了,但问题是它在后台工作,我看不到如何解决这个问题?并再次显示surfaceview和相机源。

下面是activityoncreate方法的全部代码

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        surfaceView = (SurfaceView) findViewById(R.id.cameraPreview);
        txtShow = (TextView) findViewById(R.id.txtShow);

        startBarcode();

    }

    public void startBarcode() {
        barcodeDetector = new BarcodeDetector.Builder(this)
                .setBarcodeFormats(Barcode.ALL_FORMATS)
                .build();
        cameraSource = new CameraSource.Builder(this, barcodeDetector)
                .setRequestedPreviewSize(800, 600)
                .setAutoFocusEnabled(true)
                .build();

        //Events

        surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
            @Override
            public void surfaceCreated(SurfaceHolder holder) {
                if (ActivityCompat.checkSelfPermission(getApplicationContext(), android.Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
                    //Make Request Runtime Permission
                    ActivityCompat.requestPermissions(MainActivity.this,
                            new String[]{Manifest.permission.CAMERA}, RequestCameraPermissionId);
                    return;
                }
                try {
                    cameraSource.start(surfaceView.getHolder());

                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
                if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {

                    //Make Request Runtime Permission
                    ActivityCompat.requestPermissions(MainActivity.this,
                            new String[]{Manifest.permission.CAMERA}, RequestCameraPermissionId);
                    return;
                }
                try {
                    cameraSource.start();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

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

        barcodeDetector.setProcessor(new Detector.Processor<Barcode>() {

            @Override
            public void release() {

            }

            @Override
            public void receiveDetections(Detector.Detections<Barcode> detections) {
                final SparseArray<Barcode> qrCodes = detections.getDetectedItems();
                if (qrCodes.size() != 0) {
                    txtShow.post(new Runnable() {
                        @Override
                        public void run() {
                            //create vibrate
                            Vibrator vibrator = (Vibrator) getApplicationContext().getSystemService(Context.VIBRATOR_SERVICE);
                            vibrator.vibrate(500);


                            //set result for Text View
                            txtShow.setText(qrCodes.valueAt(0).displayValue);

                            // surfaceView.setTop(200);
                            cameraSource.stop();


                            final MediaPlayer mp = MediaPlayer.create(MainActivity.this, R.raw.barcode);
                            mp.start();
@覆盖
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
surfaceView=(surfaceView)findViewById(R.id.cameraPreview);
txtShow=(TextView)findViewById(R.id.txtShow);
startBarcode();
}
public void startBarcode(){
barcodeDetector=新的barcodeDetector.Builder(此)
.setBarcodeFormats(条形码.所有_格式)
.build();
cameraSource=新建cameraSource.Builder(这是barcodeDetector)
.setRequestedPreviewSize(800600)
.setAutoFocusEnabled(真)
.build();
//事件
surfaceView.getHolder().addCallback(新的SurfaceHolder.Callback()){
@凌驾
已创建的公共空白表面(表面持有人){
if(ActivityCompat.checkSelfPermission(getApplicationContext(),android.Manifest.permission.CAMERA)!=PackageManager.permission\u已授予){
//请求运行时权限
ActivityCompat.requestPermissions(MainActivity.this,
新字符串[]{Manifest.permission.CAMERA},RequestCameraPermissionId);
返回;
}
试一试{
开始(surfaceView.getHolder());
}捕获(IOE异常){
e、 printStackTrace();
}
}
@凌驾
公共空白表面更改(表面文件夹持有者、整型格式、整型宽度、整型高度){
if(ActivityCompat.checkSelfPermission(MainActivity.this、Manifest.permission.CAMERA)!=PackageManager.permission\u已授予){
//请求运行时权限
ActivityCompat.requestPermissions(MainActivity.this,
新字符串[]{Manifest.permission.CAMERA},RequestCameraPermissionId);
返回;
}
试一试{
cameraSource.start();
}捕获(IOE异常){
e、 printStackTrace();
}
}
@凌驾
公共空间表面覆盖(表面覆盖物持有人){
cameraSource.stop();
}
});
条形码检测器.setProcessor(新检测器.Processor(){
@凌驾
公开无效释放(){
}
@凌驾
公共空隙接收检测(检测器。检测){
最终SparseArray qrCodes=检测。getDetectedItems();
如果(qrCodes.size()!=0){
post(新的Runnable(){
@凌驾
公开募捐{
//制造振动
可控震源可控震源=(可控震源)getApplicationContext().getSystemService(Context.可控震源\u服务);
振动器。振动器(500);
//设置文本视图的结果
txtShow.setText(qrCodes.valueAt(0.displayValue));
//surfaceView.setTop(200);
cameraSource.stop();
最终MediaPlayer mp=MediaPlayer.create(MainActivity.this,R.raw.barcode);
mp.start();

要在cameraSource.stop()之后重新启动,您需要:

cameraSource.start(surfaceView.getHolder());

捕获代码后,您可以停止相机源并重新启动OnCreate methode。或者,您可以使用以下意图再次调用活动:

Intent intent= new Intent (getBaseContext,MainActivity.class); // your activity
startActivity(intent);

如果我没有停止camera source,它将连续工作而不停止。尝试一种简单的方法:当你停止cameraService时,删除surfaceView;当你想重新启动时,只需向你的内容视图添加一个新的surfaceView。@AlexCohn这是一个好主意,但如何删除它并添加新的一个来删除,你可以参考以下答案:。要添加surfaceView sm哦,你可以保留旧相机预览的布局参数。@AlexCohn如果你能给我展示解决方案,我不知道,我会很感激你的。我在重新开始之前尝试过这个方法,但它在后台运行,正如你在我的问题中看到的,相机源仍然停止并且没有重新启动,所以相机源仍然停止我的问题是如何在特定条件下重新启动surfaceview和camera source,如单击按钮。它工作正常,是否有其他方法可以更轻松地完成此操作。