二维码扫描相机在 android studio 中无法正常工作

问题描述 投票:0回答:0

我正在做二维码扫描仪项目。我进行了两项活动,例如主要活动和扫描活动。主活动中有一个 EditText 视图和一个按钮。在这里,如果您单击按钮扫描活动运行并扫描二维码。然后结果将显示在 EditText 中。当我点击按钮时,拳头一切正常。但是再点击一下,它就不再起作用了。

这里是 MainAcivity.java

package com.example.scanner_v1;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity {
   private static final int REQUEST_CODE_SCAN = 100;
   private EditText editText;
   @Override
   protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_main);

    editText = findViewById(R.id.editText);
    Button scanButton = findViewById(R.id.scanButton);
    scanButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(MainActivity.this,ScanActivity.class);
            startActivityForResult(intent,REQUEST_CODE_SCAN);
        }
    });
 }
 @Override
 protected void onActivityResult(int requestCode, int resultCode,@Nullable Intent data){
    super.onActivityResult(resultCode,resultCode,data);
    if(requestCode == REQUEST_CODE_SCAN && resultCode == RESULT_OK && data != null){
        String barcode = data.getStringExtra("barcode");
        editText.setText(barcode);
    }
 }

}

这里是 ScanActivity.java

package com.example.scanner_v1;

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

import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.util.SparseArray;
import android.view.SurfaceView;
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;

public class ScanActivity extends AppCompatActivity {
   private static final int PERMISSION_REQUEST_CAMERA = 1;
   private SurfaceView surfaceView;
   private BarcodeDetector barcodeDetector;
   private CameraSource cameraSource;

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

    surfaceView = findViewById(R.id.surfaceView);

    // Create BarcodeDetector and CameraSource
    barcodeDetector = new BarcodeDetector.Builder(this)
            .setBarcodeFormats(Barcode.QR_CODE)
            .build();
    cameraSource = new CameraSource.Builder(this, barcodeDetector)
            .setRequestedPreviewSize(640, 480)
            .setAutoFocusEnabled(true)
            .build();

    // Check for camera permission
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != 
          PackageManager.PERMISSION_GRANTED) {
         ActivityCompat.requestPermissions(this, new String[] 
         {Manifest.permission.CAMERA}, PERMISSION_REQUEST_CAMERA);
      } else {
        startCamera();
      }
   }

   private void startCamera() {
     try {
         if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != 
            PackageManager.PERMISSION_GRANTED) {
             return;
        }
        cameraSource.start(surfaceView.getHolder());
     } catch (IOException e) {
         e.printStackTrace();
     }

    barcodeDetector.setProcessor(new Detector.Processor<Barcode>() {
        @Override
        public void release() {

        }

        @Override
        public void receiveDetections(Detector.Detections<Barcode> detections) {
            SparseArray<Barcode> barcodes = detections.getDetectedItems();
            if (barcodes.size() > 0) {
                String barcodeValue = barcodes.valueAt(0).displayValue;
                Intent intent = new Intent();
                intent.putExtra("barcode", barcodeValue);
                setResult(RESULT_OK, intent);
                finish();
             }
         }
      });
 }

 @Override
 public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, 
 @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    if (requestCode == PERMISSION_REQUEST_CAMERA) {
        if (grantResults.length > 0 && grantResults[0] == 
            PackageManager.PERMISSION_GRANTED) {
            startCamera();
        } else {
            Toast.makeText(this, "Camera permission denied", Toast.LENGTH_SHORT).show();
        }
    }
}

@Override
protected void onDestroy() {
    super.onDestroy();
    barcodeDetector.release();
    cameraSource.release();
}
private void stopCamera() {
    if (cameraSource != null) {
        cameraSource.stop();
    }
}

@Override
protected void onResume() {
    super.onResume();
    startCamera(); // Restart the camera preview when the activity resumes
}



  @Override
  protected void onPause() {
      super.onPause();
      stopCamera(); // Stop the camera preview when the activity pauses
  }
}

这里是build.gradle文件

 plugins {
    id 'com.android.application'
 }

android {
namespace 'com.example.scanner_v1'
compileSdk 33

defaultConfig {
    applicationId "com.example.scanner_v1"
    minSdk 24
    targetSdk 33
    versionCode 1
    versionName "1.0"

    testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}



 buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 
        'proguard-rules.pro'
     }
 }
compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
 }

}

依赖关系{

implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'com.google.android.material:material:1.8.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
//Barcode
implementation 'com.google.android.gms:play-services-vision:20.1.3'

}

现在,如何解决这个问题?

java android android-studio qr-code barcode-scanner
© www.soinside.com 2019 - 2024. All rights reserved.