Я разрабатывал AR-приложение с использованием Vuforia и Zxing в движке Unity.
Метод декодирования Zxing BarcodeReader возвращает текст штрих-кода, если только приложение запускается и сканируется в первый раз.Но когда приложение приостанавливается и возобновляется или переключается на другое приложение (браузер) и возвращается к этому приложению, декодирование не возвращает значение (ноль).
Мой код выглядит следующим образом, я воссоздал свежий объект BarcodeReader с методом OnApplicationPause .Но это не сработало.
[AddComponentMenu("System/ArCamCapture")]
public class ArCamCapture : MonoBehaviour
{
private readonly Image.PIXEL_FORMAT m_PixelFormat = Image.PIXEL_FORMAT.RGB888;
private bool _CameraInitialized;
private BarcodeReader _BarCodeReader;
void Start()
{
try
{
_BarCodeReader = new BarcodeReader();
StartCoroutine(InitializeCamera());
VuforiaARController.Instance.RegisterTrackablesUpdatedCallback(OnTrackablesUpdated);
VuforiaARController.Instance.RegisterVuforiaStartedCallback(OnVuforiaStarted);
}
catch (Exception ex)
{
SSTools.ShowMessage("Error : " + ex.Message, SSTools.Position.bottom, SSTools.Time.twoSecond);
}
}
/// <summary>
/// Initialize AR camera to detect barcode
/// </summary>
/// <returns></returns>
private IEnumerator InitializeCamera()
{
// Waiting a little seem to avoid the Vuforia's crashes.
yield return new WaitForSeconds(1.25f);
CameraDevice.Instance.SetFrameFormat(Image.PIXEL_FORMAT.RGB888, true);
// Force autofocus.
var isAutoFocus = CameraDevice.Instance.SetFocusMode(CameraDevice.FocusMode.FOCUS_MODE_CONTINUOUSAUTO);
if (!isAutoFocus)
{
CameraDevice.Instance.SetFocusMode(CameraDevice.FocusMode.FOCUS_MODE_NORMAL);
}
_CameraInitialized = true;
_BarCodeReader.Options.PossibleFormats.Add(BarcodeFormat.DATA_MATRIX);
}
/// <summary>
/// AR camera tracking change
/// </summary>
public void OnTrackablesUpdated()
{
try
{
KeyInputHanlde();
if (Application.internetReachability == NetworkReachability.NotReachable)
{
SSTools.ShowMessage("check your internet connection", SSTools.Position.bottom, SSTools.Time.threeSecond);
return;
}
if (CameraDevice.Instance.SetFrameFormat(m_PixelFormat, true) && _CameraInitialized)
{
Image image = CameraDevice.Instance.GetCameraImage(m_PixelFormat);
if (image == null)
{
SSTools.ShowMessage("image is not available yet", SSTools.Position.bottom, SSTools.Time.twoSecond);
}
else
{
var data = _BarCodeReader.Decode(image.Pixels, image.BufferWidth, image.BufferHeight, RGBLuminanceSource.BitmapFormat.RGB24);
if (data != null)
{
//user code
}
else
{
SSTools.ShowMessage("Scanning ...", SSTools.Position.bottom, SSTools.Time.twoSecond);
}
}
}
}
catch (Exception ex)
{
SSTools.ShowMessage("Error : " + ex.Message, SSTools.Position.bottom, SSTools.Time.twoSecond);
_CameraInitialized = true;
}
}
/// <summary>
/// When Vuforia camera is on
/// </summary>
private void OnVuforiaStarted()
{
CameraDevice.Instance.SetFocusMode(
CameraDevice.FocusMode.FOCUS_MODE_CONTINUOUSAUTO);
}
/// <summary>
/// When android application is OnResume and OnPause state
/// </summary>
/// <param name="pauseStatus"></param>
private void OnApplicationPause(bool isPaused)
{
if (!isPaused)
{
SSTools.ShowMessage($"is paused: {isPaused}", SSTools.Position.bottom, SSTools.Time.oneSecond);
CameraDevice.Instance.SetFocusMode(
CameraDevice.FocusMode.FOCUS_MODE_CONTINUOUSAUTO);
CameraDevice.Instance.SetFrameFormat(Image.PIXEL_FORMAT.RGB888, true);
_BarCodeReader = new BarcodeReader();
_BarCodeReader.Options.PossibleFormats.Add(BarcodeFormat.DATA_MATRIX);
}
}
}
Какую конфигурацию я здесь пропустил?Спасибо