在我的Android应用程序中,我使用了一个使用BarcodeView的片段(CameraFragment见下文)。当扫描条形码(BarcodeCallBack)时,我检查它是否适合模式,如果不是,我想恢复扫描,但这不起作用。相机保持运行但没有扫描条形码。作为一个quickfix我替换整个片段,但这不是它必须如何......
碎片:
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。问题仍然存在:
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);
}
}
}
}
答案 0 :(得分:2)
您好user1406731使用了错误的回调,我们在移动应用中做了类似的事情。用decodeContinuous()回调替换你的decodeSingle()回调函数,它应该工作。以下是官方文档Continous Callback example中的一个工作示例。希望它可以帮到你。
您好,我试图运行您的代码&amp;做了一点改变。这是我测试过的,对我来说很好用
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);
}
}
}
}
这是我的logcat
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
答案 1 :(得分:1)
我想出了办法,并认为这可能对某人有所帮助。 我遇到了完全相同的问题,然后弄清楚resume()方法会检查它是否在MainThread上运行。
public class Util {
public static void validateMainThread() {
if (Looper.getMainLooper() != Looper.myLooper()) {
throw new IllegalStateException("Must be called from the main thread.");
}
}
}
以下是如何在MainThread上运行代码的示例: Running code in main thread from another thread
我试图从@JavscriptInterface方法运行它,这是我的代码:
public class MyInterface {
Context mContext;
ActivityMain activityMain;
MyInterface(Context c, ActivityMain am) {
mContext = c;
activityMain = am;
}
@JavascriptInterface
public void resumeScanner() {
Toast.makeText(mContext, "resume", Toast.LENGTH_SHORT).show();
Handler mainHandler = new Handler(mContext.getMainLooper());
Runnable myRunnable = new Runnable() {
@Override
public void run() {
activityMain.barcodeView.resume();
}
};
mainHandler.post(myRunnable);
}
}