3

私はこのアプリを使用してZXINGバーコードをスキャンしています:

https://github.com/jmawebtech/BarcodeReader-MonoTouch

アプリケーションに入り、バーコードをスキャンし、ホームボタンを押してアプリを再入力し、[スキャン]をクリックすると、カメラのシャッターが開かないように見える黒い画面が表示されます。このチケットに画像を添付しました。

キャンセルを押してスキャンに戻ると、カメラが再び開いているのがわかります。

なぜカメラが開かないことがあるのですか?

カメラ画像は閉じたままです

4

3 に答える 3

1

このコードを Info.plist に追加する必要がありました。

UIApplicationExitsOnSuspend はい

App Delegate には、次のコードを追加する必要がありました。

    public override void OnResignActivation (UIApplication application)
    {
        UIApplication.SharedApplication.PerformSelector(new Selector("terminateWithSuccess"), null, 0f);
    }

このソフトウェアで使用されていたビデオ レコーダーは、バックグラウンド スレッドでは実行できません。

于 2012-07-08T01:57:44.080 に答える
1

ViewController以前に表示されたものへの参照を保持し、新しいものを表示する前にそれを破棄する独自のスキャンメソッドを作成することで、これを解決しました。

public static class BarcodeScanner
{
    private static ZxingCameraViewController currentBarcodeScanner;

    public static Task<Result> Scan(UIViewController hostController, MobileBarcodeScanner scanner, MobileBarcodeScanningOptions options)
    {
        return Task.Factory.StartNew(delegate
        {
            Result result = null;

            var scanResultResetEvent = new ManualResetEvent(false);

            hostController.InvokeOnMainThread(delegate
            {
                // Release previously displayed barcode scanner
                if (currentBarcodeScanner != null)
                {
                    currentBarcodeScanner.Dispose();
                    currentBarcodeScanner = null;
                }

                currentBarcodeScanner = new ZxingCameraViewController(options, scanner);

                // Handle barcode scan event
                currentBarcodeScanner.BarCodeEvent += delegate(BarCodeEventArgs e)
                {
                    currentBarcodeScanner.DismissViewController();
                    result = e.BarcodeResult;
                    scanResultResetEvent.Set();
                };

                // Handle barcode scan cancel event
                currentBarcodeScanner.Canceled += delegate
                {
                    currentBarcodeScanner.DismissViewController();
                    scanResultResetEvent.Set();
                };

                // Display the camera view controller
                hostController.PresentViewController(currentBarcodeScanner, true, delegate{});
            });

            // Wait for scan to complete
            scanResultResetEvent.WaitOne();

            return result;
        });
    }
}

あなたはそれをそのように使います

BarcodeScanner.Scan(this)
    .ContinueWith(t => InvokeOnMainThread(() =>
    {
        if (t.Result == null)
        {
            new UIAlertView("Scan Cancelled", "The barcode scan was cancelled", null, null, "OK").Show();
        }
        else
        {
            new UIAlertView("Scan Complete", "Result from barcode scan was " + t.Result, null, null, "OK").Show();
        }
    }))
于 2013-07-18T04:41:45.803 に答える
0

アプリをバックグラウンドで実行しないように極端に変更する必要はありません。

AppDelegate に viewcontroller プロパティを作成することで、この問題を修正しました。cameraviewcontroller を起動してカメラを開くたびに、このプロパティを指すようにしました。私はそれをcvcと呼んだ。

次の方法で参照して、プロパティにアクセスしました。

AppDelegate ad = (AppDelegate)UIApplication.SharedApplication.Delegate;

次に、AppDelegate に次のコードがありました。

    public override void OnResignActivation (UIApplication application)
    {
        cvc.PerformSelector(new Selector("terminateWithSuccess"), null, 0f);
    }

でもキックスタートありがとう

于 2012-08-16T04:15:43.440 に答える