Android zxing Embedded BarcodeView 未恢复 [英] Android zxing Embedded BarcodeView not resuming

查看:36
本文介绍了Android zxing Embedded BarcodeView 未恢复的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的 android 应用程序中,我使用了一个使用 BarcodeView 的 Fragment(CameraFragment 见下文).当条码被扫描 (BarcodeCallBack) 时,我会检查它是否符合某个模式,如果不符合,我想继续扫描,但这不起作用.相机继续运行但未扫描条码.作为快速修复,我替换了整个 Fragment,但这不是必须的.​​.....

In my android app I use a Fragment (CameraFragment see below) which uses a BarcodeView. When a Barcode is scanned(BarcodeCallBack) I check if it fits a pattern and if not I want to resume the scanning, but this does not work. The camera keeps running but no Barcode is scanned. As a quickfix I replace the entire Fragment but this is not how it has to be...

片段:

package com.stickydata;
import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Vibrator;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.amazonaws.mobile.AWSMobileClient;
import com.amazonaws.mobilehelper.auth.IdentityManager;
import com.google.zxing.ResultPoint;
import com.journeyapps.barcodescanner.BarcodeCallback;
import com.journeyapps.barcodescanner.BarcodeResult;
import com.journeyapps.barcodescanner.BarcodeView;
import com.stickydata.AWSUtil.SDtagUtil;
import com.stickydata.events.EventResumeBarcodeScan;

import org.greenrobot.eventbus.EventBus;

import java.util.List;

import static com.facebook.FacebookSdk.getApplicationContext;

public class CameraFragment extends Fragment  {
    private IdentityManager identityManager;
Context mcontext;
    private BarcodeView barcodeView;
    final int PERMISSIONS_REQUEST_ACCESS_CAMERA=0;
    View view;


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        view=inflater.inflate(R.layout.fragment_camera, container, false);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&
                getActivity().checkSelfPermission(Manifest.permission.CAMERA)
                        != PackageManager.PERMISSION_GRANTED) {
            requestPermissions(new String[]{Manifest.permission.CAMERA},
                    PERMISSIONS_REQUEST_ACCESS_CAMERA);
        } else {
            barcodeView = (BarcodeView) view.findViewById(R.id.barcode_scanner);
            barcodeView.decodeSingle(callback);

        }


        mcontext=getContext();

        return view;
    }



    @Override
    public void onResume() {

        super.onResume();
        barcodeView = (BarcodeView) view.findViewById(R.id.barcode_scanner);
        barcodeView.resume();
        barcodeView.decodeSingle(callback);

    }

    @Override
    public void onPause() {
        super.onPause();
        barcodeView = (BarcodeView) view.findViewById(R.id.barcode_scanner);
        barcodeView.pause();
    }


    private BarcodeCallback callback = new BarcodeCallback() {
        @Override
        public void barcodeResult(BarcodeResult result) {
            if (result.getText() != null) {
                barcodeView.pause();
                //the vibrator on success
                Vibrator v = (Vibrator) getApplicationContext().getSystemService(Context.VIBRATOR_SERVICE);
               // Vibrate for 500 milliseconds
                v.vibrate(200);
               //after the string has been read we prozess it
                String tag_string=result.getText();
                AWSMobileClient.initializeMobileClientIfNecessary(getApplicationContext());
                // Obtain a reference to the mobile client. It is created in the Application class.
                final AWSMobileClient awsMobileClient = AWSMobileClient.defaultMobileClient();

                // Obtain a reference to the identity manager.
                identityManager = awsMobileClient.getIdentityManager();
                SDtagUtil sdTag=new SDtagUtil(tag_string,identityManager,awsMobileClient,mcontext);

                if(!sdTag.prozessTag()){//if the tag was not scanned succesfully let us start the scan again
                    EventBus.getDefault().post(new EventResumeBarcodeScan("bla"));
                    //TODO NOT WORKING
                  //  barcodeView.resume();
                  //  barcodeView.decodeSingle(callback);

                }


            }


        }

        @Override
        public void possibleResultPoints(List<ResultPoint> resultPoints) {
        }
    };

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        if (requestCode == PERMISSIONS_REQUEST_ACCESS_CAMERA|| grantResults!=null) {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                barcodeView = (BarcodeView) view.findViewById(R.id.barcode_scanner);
                barcodeView.decodeContinuous(callback);
            }
        }
    }
}

片段xml文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


    <com.journeyapps.barcodescanner.BarcodeView
        android:id="@+id/barcode_scanner"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:zxing_use_texture_view="true"
    app:zxing_preview_scaling_strategy="fitCenter"/>
</LinearLayout>

按照建议更改为 decodeContinous.问题依旧:

Changed to decodeContinous as suggested. The problem remains:

package com.stickydata;
import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Vibrator;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.amazonaws.mobile.AWSMobileClient;
import com.amazonaws.mobilehelper.auth.IdentityManager;
import com.google.zxing.ResultPoint;
import com.journeyapps.barcodescanner.BarcodeCallback;
import com.journeyapps.barcodescanner.BarcodeResult;
import com.journeyapps.barcodescanner.BarcodeView;
import com.stickydata.AWSUtil.SDtagUtil;
import com.stickydata.events.EventResumeBarcodeScan;

import org.greenrobot.eventbus.EventBus;

import java.util.List;

import static com.facebook.FacebookSdk.getApplicationContext;

public class CameraFragment extends Fragment  {
    private IdentityManager identityManager;
Context mcontext;
    private BarcodeView barcodeView;
    final int PERMISSIONS_REQUEST_ACCESS_CAMERA=0;
    View view;


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        view=inflater.inflate(R.layout.fragment_camera, container, false);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&
                getActivity().checkSelfPermission(Manifest.permission.CAMERA)
                        != PackageManager.PERMISSION_GRANTED) {
            requestPermissions(new String[]{Manifest.permission.CAMERA},
                    PERMISSIONS_REQUEST_ACCESS_CAMERA);
        } else {
            barcodeView = (BarcodeView) view.findViewById(R.id.barcode_scanner);
            barcodeView.decodeContinuous(callback);

        }


        mcontext=getContext();

        return view;
    }



    @Override
    public void onResume() {

        super.onResume();
        barcodeView = (BarcodeView) view.findViewById(R.id.barcode_scanner);
        barcodeView.resume();
        barcodeView.decodeContinuous(callback);

    }

    @Override
    public void onPause() {
        super.onPause();
        barcodeView = (BarcodeView) view.findViewById(R.id.barcode_scanner);
        barcodeView.pause();
    }


    private BarcodeCallback callback = new BarcodeCallback() {
        @Override
        public void barcodeResult(BarcodeResult result) {
            if (result.getText() != null) {
                barcodeView.pause();
                //the vibrator on success
                Vibrator v = (Vibrator) getApplicationContext().getSystemService(Context.VIBRATOR_SERVICE);
               // Vibrate for 500 milliseconds
                v.vibrate(200);
               //after the string has been read we prozess it
                String tag_string=result.getText();
                AWSMobileClient.initializeMobileClientIfNecessary(getApplicationContext());
                // Obtain a reference to the mobile client. It is created in the Application class.
                final AWSMobileClient awsMobileClient = AWSMobileClient.defaultMobileClient();

                // Obtain a reference to the identity manager.
                identityManager = awsMobileClient.getIdentityManager();
                SDtagUtil sdTag=new SDtagUtil(tag_string,identityManager,awsMobileClient,mcontext);

                if(!sdTag.prozessTag()){//if the tag was not scanned succesfully let us start the scan again
                   // EventBus.getDefault().post(new EventResumeBarcodeScan("bla"));
                    //TODO NOT WORKING
                    barcodeView.resume();
                    barcodeView.decodeContinuous(callback);

                }


            }


        }

        @Override
        public void possibleResultPoints(List<ResultPoint> resultPoints) {
        }
    };

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        if (requestCode == PERMISSIONS_REQUEST_ACCESS_CAMERA|| grantResults!=null) {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                barcodeView = (BarcodeView) view.findViewById(R.id.barcode_scanner);
                barcodeView.decodeContinuous(callback);
            }
        }
    }
}

推荐答案

嗨 user1406731 您使用了错误的回调,我们在我们的移动应用程序中做了类似的事情.用 decodeContinuous() 回调替换你的 decodeSingle() 回调函数,它应该可以工作.这是官方文档中的一个工作示例 连续回调示例.希望能帮到你.

Hi user1406731 you are using the wrong callback, we do something similar in our mobile app. Replace your decodeSingle() callback function with decodeContinuous() callback and it should work. Here is a working example from the official doc Continous Callback example. Hope it helps you.

我试图运行你的代码 &做了一点改变.这是我测试过的,对我来说很好

Hi i tried to run your code & made a little change. This is what i tested and works fine for me

import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.google.zxing.ResultPoint;
import com.journeyapps.barcodescanner.BarcodeCallback;
import com.journeyapps.barcodescanner.BarcodeResult;
import com.journeyapps.barcodescanner.BarcodeView;
import com.example.scanner.R;
import com.example.scanner.ui.base.BaseFragment;

import java.util.List;

/**
 * Created by Rishabh Bhatia on 12/5/17.
 */

public class CameraFragment extends BaseFragment {
    Context mcontext;
    private BarcodeView barcodeView;
    final int PERMISSIONS_REQUEST_ACCESS_CAMERA=0;
    View view;


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        view=inflater.inflate(R.layout.fragment_camera, container, false);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&
                getActivity().checkSelfPermission(Manifest.permission.CAMERA)
                        != PackageManager.PERMISSION_GRANTED) {
            requestPermissions(new String[]{Manifest.permission.CAMERA},
                    PERMISSIONS_REQUEST_ACCESS_CAMERA);
        } else {
            barcodeView = (BarcodeView) view.findViewById(R.id.barcode_scanner);
            barcodeView.decodeContinuous(callback);

        }


        mcontext=getContext();

        return view;
    }



    @Override
    public void onResume() {

        super.onResume();
        barcodeView = (BarcodeView) view.findViewById(R.id.barcode_scanner);
        barcodeView.resume();    
    }

    @Override
    public void onPause() {
        super.onPause();
        barcodeView = (BarcodeView) view.findViewById(R.id.barcode_scanner);
        barcodeView.pause();
    }

    private BarcodeCallback callback = new BarcodeCallback() {
        @Override
        public void barcodeResult(BarcodeResult result) {
            if (result.getText() != null) {
                barcodeView.pause();
                //after the string has been read we prozess it
                String tag_string=result.getText();
                Log.e("RISHABH", "pausing scanner, got some data "+tag_string);

                if(!tag_string.equals("abc")){//if the tag was not scanned succesfully let us start the scan again
                    Log.e("RISHABH", "resuming scanner, data needed was not found");
                    barcodeView.resume(); //notice we don't call decodeContinuous function again
                }
            }
        }

        @Override
        public void possibleResultPoints(List<ResultPoint> resultPoints) {
        }
    };

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        if (requestCode == PERMISSIONS_REQUEST_ACCESS_CAMERA) {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                barcodeView = (BarcodeView) view.findViewById(R.id.barcode_scanner);
                barcodeView.decodeContinuous(callback);
            }
        }
    }
}

这是我的日志

05-12 23:54:13.226 31403-31403/com.example.scanner E/RISHABH: pausing scanner, got some data ABC-abc-1234
05-12 23:54:13.226 31403-31403/com.example.scanner E/RISHABH: resuming scanner, data needed was not found
05-12 23:54:18.280 31403-31403/com.example.scanner E/RISHABH: pausing scanner, got some data ABC-abc-1234
05-12 23:54:18.280 31403-31403/com.example.scanner E/RISHABH: resuming scanner, data needed was not found
05-12 23:54:19.350 31403-31403/com.example.scanner E/RISHABH: pausing scanner, got some data ABC-abc-1234
05-12 23:54:19.350 31403-31403/com.example.scanner E/RISHABH: resuming scanner, data needed was not found
05-12 23:54:20.350 31403-31403/com.example.scanner E/RISHABH: pausing scanner, got some data ABC-abc-1234
05-12 23:54:20.350 31403-31403/com.example.scanner E/RISHABH: resuming scanner, data needed was not found
05-12 23:54:21.450 31403-31403/com.example.scanner E/RISHABH: pausing scanner, got some data ABC-abc-1234
05-12 23:54:21.450 31403-31403/com.example.scanner E/RISHABH: resuming scanner, data needed was not found
05-12 23:54:22.510 31403-31403/com.example.scanner E/RISHABH: pausing scanner, got some data ABC-abc-1234
05-12 23:54:22.510 31403-31403/com.example.scanner E/RISHABH: resuming scanner, data needed was not found
05-12 23:54:33.000 31403-31403/com.example.scanner E/RISHABH: pausing scanner, got some data abc

这篇关于Android zxing Embedded BarcodeView 未恢复的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆