2017-11-05 1 views
0

안녕하세요 저는 주요 활동을 스캔 할 수 있어야하고 의도와 함께 텍스트 상자에 결과를 얻을 수있는 앱을 개발하려고합니다. 내 유일한 문제는 내가 가끔 바코드를 스캔 할 때 내가 그나마바코드 스캐너 결과 두 번

내가 당신에게

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

    if (ContextCompat.checkSelfPermission(this, Manifest.permission.INTERNET) != PackageManager.PERMISSION_GRANTED){ 
     ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.INTERNET}, 200); 
    } 


    if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) 
    { 
     ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.CAMERA}, 200); 
    } 


    cameraPreview = (SurfaceView) findViewById(R.id.cameraPreview); 
    cameraPreview.setZOrderMediaOverlay(true); 

    barcodeDetector = new BarcodeDetector.Builder(this) 
      .setBarcodeFormats(Barcode.ALL_FORMATS) 
      .build(); 
    cameraSource = new CameraSource 
      .Builder(this, barcodeDetector) 
      .setFacing(CameraSource.CAMERA_FACING_BACK) 
      .setRequestedFps(24) 
      .setRequestedPreviewSize(1600, 1024) 
      .setAutoFocusEnabled(true) 
      .build(); 
    cameraPreview.getHolder().addCallback(new SurfaceHolder.Callback() { 
     @Override 
     public void surfaceCreated(SurfaceHolder holder) { 
      try{ 
       if(ContextCompat.checkSelfPermission(MainActivity.this, android.Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED){ 
        cameraSource.start(cameraPreview.getHolder()); 
       } 
      } 
      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() { 

     } 

     @Override 
     public void receiveDetections(Detector.Detections<Barcode> detections) { 
      final SparseArray<Barcode> barcodes = detections.getDetectedItems(); 
      if (barcodes.size() != 0) 
      { 
       Intent intent = new Intent(MainActivity.this, finish.class); 
       intent.putExtra("barcode", barcodes.valueAt(0)); 
       startActivityForResult(intent, 100); 
       finish(); 

      } 

      } 

    }); 

} 
@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    cameraSource.release(); 
    barcodeDetector.release(); 
} 
을 도움이 될 것입니다 방법을 알고 무엇을 잘 모릅니다 2 ~ 3 배 ... 어쩌면 누군가가 나를 도울 수있는 결과 활동을 여는 것입니다

FINISH 활동

@Override 
protected void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.finish); 
    result = (TextView) findViewById(R.id.editText1); 
    final Barcode barcode = getIntent().getParcelableExtra("barcode"); 
    result.setText(barcode.displayValue); 
+0

바코드 또는 스캐너에 관한 질문보다 코딩 문제가 더 비슷합니다. –

+0

네가 맞지만 아무도 나에게 정보를 보내지 않았다. –

답변

0

당신은 아마들의 OnDestroy에서에서 onCreate에서 설치 및 해체를 원하지 않는다. 이렇게하면 활동이 백그라운드로 이동 한 후에도 카메라가 계속 활성화되어 검색됩니다. 대신 onResume 및 onPause를 사용하십시오.

다른 문제는 바코드를 감지 할 때마다 (동일한 바코드 임에도 불구하고) receiveDetections이 호출된다는 것입니다. 바코드 감지기가 시스템이 활동을 시작할 수있는 것보다 더 빨리 바코드를 감지 할 수 있으면 카메라 및 바코드 감지기를 해제하기 전에 콜백이 여러 번 호출됩니다. 이를 방지하기 위해 플래그를 사용하여 startActivity이 두 번 이상 호출되지 않도록하거나 바코드 감지기 (및 카메라)를 내부에서 해제 할 수 있습니다. receiveDetections