Xamarin.Android: Сканирование QR-кода - Улучшение качества чтения - PullRequest
0 голосов
/ 22 февраля 2019

Я пытаюсь создать простое приложение, которое может сканировать qr-код и обрабатывать его данные.

Я сделал это с помощью следующего урока: https://www.c -sharpcorner.com / article / xamarin-android-qr-code-reader-by-mobile-camera /

Код компилируется и работает отлично - изображение с камеры отображается правильно, но теперь я протестировал код на нескольких разных устройствах, на некоторых онспособен считывать код qr при удерживании его в камере и правильно отображать прочитанные данные, но на некоторых других устройствах, к сожалению, нет.Независимо от расстояния кода qr до камеры.

Качество самой камеры не проблема, я думаю, качество отображения изображения с камеры кажется хорошим, по крайней мере, на мой взгляд,и при установке внешнего приложения qr на том же устройстве, где мое собственное приложение не может прочитать код qr, это внешнее приложение может читать код qr без проблем.

В чем причина этого?Как я могу повысить качество моего BarcodeDetector, чтобы он мог читать код qr на всех устройствах?

Позвольте мне кратко поделиться своими наблюдениями:- Samsung Galaxy SIII Neo: собственное приложение (код ниже) работает, поэтому может считывать и обрабатывать код qr, а также внешнее приложение qr- Acer One 10: то же самое собственное приложение, изображение с камеры отображается хорошо (аналогично устройству Samsung), но с тем же кодом qr (который работал выше) для сканирования через камеру, это не имеет никакого эффекта.Независимо от расстояния до устройства.Тем не менее, использование внешнего приложения qr работает всегда.- Samsung Galaxy S4: то же, что и Acer One 10

Пожалуйста, позвольте мне наконец-то поделиться своим кодом, возможно, мне будет проще помочь:

QrCodeScanner.axml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <SurfaceView
        android:layout_width="480dp"
        android:layout_height="480dp"
        android:layout_centerInParent="true"
        android:id="@+id/surfaceView" />
    <TextView
        android:text="Please focus qr code
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/surfaceView"
        android:textSize="20sp"
        android:layout_marginTop="20dp"     
        android:gravity="center_horizontal"
        android:id="@+id/textView" />
</RelativeLayout>

QrCodeScannerActivity.cs:

//...
using Android.Gms.Vision;
using Android.Gms.Vision.Barcodes;
using Android.Support.V4.App;
using Android.Support.V7.App;
using static Android.Gms.Vision.Detector;
//...
[Activity(Label = "QrCodeScannerActivity")]
public class QrCodeScannerActivity : AppCompatActivity, ISurfaceHolderCallback, IProcessor
{
    SurfaceView cameraPreview;
    TextView resultTxt;
    BarcodeDetector barcodeDetector;
    CameraSource cameraSource;
    const int RequestCameraPermissionID = 1001;

    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        SetContentView(Resource.Layout.QrCodeScanner);
        cameraPreview = FindViewById<SurfaceView>(Resource.Id.surfaceView);
        resultTxt = FindViewById<TextView>(Resource.Id.textView);

        barcodeDetector = new BarcodeDetector
            .Builder(this)
            .SetBarcodeFormats(BarcodeFormat.QrCode)                
            .Build();
        cameraSource = new CameraSource
            .Builder(this, barcodeDetector)
            .SetAutoFocusEnabled(true)
            .SetFacing(CameraFacing.Front)
            .SetRequestedPreviewSize(480, 480)
            .SetRequestedFps(30.0f)                
            .Build();

        cameraPreview.Holder.AddCallback(this);
        barcodeDetector.SetProcessor(this);
    }
    public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Permission[] grantResults)
    {
        switch (requestCode)
        {
            case RequestCameraPermissionID:
            {
                if (grantResults[0] == Permission.Granted)
                {
                    if (ActivityCompat.CheckSelfPermission(ApplicationContext, Manifest.Permission.Camera) != Android.Content.PM.Permission.Granted)
                    {
                        ActivityCompat.RequestPermissions(this, new string[]
                        {
                            Manifest.Permission.Camera
                        }, RequestCameraPermissionID);
                        return;
                        }
                        try
                        {
                            cameraSource.Start(cameraPreview.Holder);
                        }
                        catch (InvalidOperationException)
                        {

                        }
                    }
                }
                break;
        }
    }
    public void SurfaceChanged(ISurfaceHolder holder, [GeneratedEnum] Format format, int width, int height)
    {

    }
    public void SurfaceCreated(ISurfaceHolder holder)
    {
        if (ActivityCompat.CheckSelfPermission(ApplicationContext, Manifest.Permission.Camera) != Android.Content.PM.Permission.Granted)
        {
            ActivityCompat.RequestPermissions(this, new string[]
            {
                Manifest.Permission.Camera
            }, RequestCameraPermissionID);
            return;
        }
        try
        {
            cameraSource.Start(cameraPreview.Holder);
        }
        catch (InvalidOperationException)
        {

        }
    }
    public void SurfaceDestroyed(ISurfaceHolder holder)
    {
        cameraSource.Stop();
    }
    public void ReceiveDetections(Detections detections)
    {            
        SparseArray qrcodes = detections.DetectedItems;
        if (qrcodes.Size() != 0)
        {
            resultTxt.Post(() =>
            {
                Vibrator vib = (Vibrator)GetSystemService(Context.VibratorService);
                vib.Vibrate(1000);
                resultTxt.Text = ((Barcode)qrcodes.ValueAt(0)).RawValue;
            });
        }
    }
    public void Release()
    {

    }
}

AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.kling.klingonemobile" android:installLocation="preferExternal">
<uses-sdk android:minSdkVersion="16" android:targetSdkVersion="27" />
    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-permission android:name="android.permission.VIBRATE"/>
  <application android:label="KlingOnEMobile" android:theme="@android:style/Theme.Holo.Light.NoActionBar" android:windowActionBar="false" android:windowNoTitle="true" android:icon="@drawable/Joker_0256x0256">
    <meta-data android:name="com.google.android.gms.vision.DEPENDENCIES" android:value="barcode" />    
  </application>
</manifest>

Буду очень благодарен за каждый ответ.

С уважением

...