我正在使用这个应用程序来扫描 ZXING 条码:
https://github.com/jmawebtech/BarcodeReader-MonoTouch
如果我进入应用程序,扫描条形码,按主页按钮,重新进入应用程序,然后单击扫描,我会看到一个看起来像相机快门永远不会打开的黑屏。我在这张票上附上了一张图片。
如果我按取消,然后返回扫描,我会看到相机再次打开。
为什么相机在某些情况下永远不会打开?
我正在使用这个应用程序来扫描 ZXING 条码:
https://github.com/jmawebtech/BarcodeReader-MonoTouch
如果我进入应用程序,扫描条形码,按主页按钮,重新进入应用程序,然后单击扫描,我会看到一个看起来像相机快门永远不会打开的黑屏。我在这张票上附上了一张图片。
如果我按取消,然后返回扫描,我会看到相机再次打开。
为什么相机在某些情况下永远不会打开?
我不得不将此代码添加到 Info.plist:
UIApplicationExitsOnSuspend 是
对于 App Delegate,我必须添加以下代码:
public override void OnResignActivation (UIApplication application)
{
UIApplication.SharedApplication.PerformSelector(new Selector("terminateWithSuccess"), null, 0f);
}
该软件中使用的录像机无法在后台线程上运行。
我通过创建自己的扫描方法解决了这个问题,该方法保留了对先前显示的引用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();
}
}))
你不必极端地改变你的应用程序而不是在后台运行。
我通过在 AppDelegate 上创建一个 viewcontroller 属性来解决这个问题,每次我启动 cameraviewcontroller 以打开相机时,我都会指向这个属性。我称它为 cvc。
我通过以下方式引用该属性来访问该属性:
AppDelegate ad = (AppDelegate)UIApplication.SharedApplication.Delegate;
然后在 AppDelegate 我有这个代码:
public override void OnResignActivation (UIApplication application)
{
cvc.PerformSelector(new Selector("terminateWithSuccess"), null, 0f);
}
感谢您的启动