Android zxing Embedded BarcodeView 未恢复 [英] Android zxing Embedded BarcodeView not resuming
问题描述
在我的 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屋!