0

zxingライブラリを使用してQRコードを読み取るアプリケーションに取り組んでいます。問題がありますZxingWidgetController-ビューが表示されているとき、アプリケーションがバックグラウンド/アクティブでない間(画面がロックされているなど)、カメラからの画像が画面に表示されません-背景のみが表示され、スキャナーが機能していないようです.

メソッドを再度呼び出すとinitCapture、少し遅れてカメラからのビデオが表示されますが、この場合、アプリケーションがアクティビティを失うたびにスキャナーを再初期化する必要があります。この動作はまったく快適ではありません。

このバグは、zXing を使用するほぼすべてのアプリケーションで繰り返される可能性があるため、zXing のバグであると思われます。

zXing initCapture メソッドのコードは次のとおりです。

- (void)initCapture {
#if HAS_AVFF
  AVCaptureDeviceInput *captureInput =
    [AVCaptureDeviceInput deviceInputWithDevice:
            [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo] 
                                          error:nil];
    if(!captureInput)
    {
        NSLog(@"ERROR - CaptureInputNotInitialized");
    }


  AVCaptureVideoDataOutput *captureOutput = [[AVCaptureVideoDataOutput alloc] init]; 
  captureOutput.alwaysDiscardsLateVideoFrames = YES;
    if(!captureOutput)
    {
        NSLog(@"ERROR - CaptureOutputNotInitialized");
    }


  [captureOutput setSampleBufferDelegate:self queue:dispatch_get_main_queue()];

  NSString* key = (NSString*)kCVPixelBufferPixelFormatTypeKey; 
  NSNumber* value = [NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA];

  NSDictionary* videoSettings = [NSDictionary dictionaryWithObject:value forKey:key];

  [captureOutput setVideoSettings:videoSettings]; 
  self.captureSession = [[[AVCaptureSession alloc] init] autorelease];
  self.captureSession.sessionPreset = AVCaptureSessionPresetMedium; // 480x360 on a 4

    if([self.captureSession canAddInput:captureInput])
    {
        [self.captureSession addInput:captureInput];
    }
    else
    {
        NSLog(@"ERROR - cannot add input");
    }
    if([self.captureSession canAddOutput:captureOutput])
    {
        [self.captureSession addOutput:captureOutput];
    }
    else
    {
        NSLog(@"ERROR - cannot add output");
    }

  [captureOutput release];

  if (!self.prevLayer)
  {
      [self.prevLayer release];
  }
  self.prevLayer = [AVCaptureVideoPreviewLayer layerWithSession:self.captureSession];

  // NSLog(@"prev %p %@", self.prevLayer, self.prevLayer);
  self.prevLayer.frame = self.view.bounds;
  self.prevLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
  [self.view.layer addSublayer: self.prevLayer];

  [self.captureSession startRunning];
#endif
}

たぶん、あなたたちは何が悪いのか知っていますか?

4

1 に答える 1

0

あなたの質問がわかりません。アプリケーションがバックグラウンド/アクティブでない場合、もちろん機能しません。あなたはそれを明確にするべきです。

于 2012-10-26T03:30:10.683 に答える