通过我的自定义相机视图中的意图使用ZXing条码扫描器时出错

萌乔

我给大家带来了一个有趣的问题!

我的应用程序:我有一个自定义的摄像头视图,在此之上,我向用户显示了额外的信息(过程值等)。我的相机视图顶部还有一个按钮,通过单击此按钮,我试图对ZXing库中的IntentIntegrator.java和IntentResult.java文件使用按意图进行ZXing扫描。扫描结果应提供额外的信息,以显示在摄像机视图的顶部。

问题:它似乎经常发生,但并非总是如此(这很有趣)。当我从自定义相机视图转到zxing条码扫描仪应用程序(通过意图)时,收到错误消息:“抱歉,Android相机遇到问题。您可能需要重新启动设备”。当我在自定义相机视图中处于风景模式时,这种情况几乎总是发生,而当我处于肖像模式时,这种情况并不多见(但仍然会在此模式下发生)。仅供参考,条形码扫描仪应用程序始终以横向模式运行。我听说过有关zxing库和这种“通过意图扫描”方法的很多好消息,所以我真的只是想摆脱这个错误。

这是清单和主应用程序中的一些代码:

<uses-permission android:name="android.permission.CAMERA"/>
 <uses-permission android:name="android.permission.INTERNET" />
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
 <uses-feature android:name="android.hardware.camera" />

这是我的“扫描”按钮的onClick()方法:

public void onClick(View v) {

    switch (v.getId()) {
    case 5:
        //Scan QR button pressed
        IntentIntegrator scanIntegrator = new IntentIntegrator(this);
        scanIntegrator.initiateScan();
        break;

这是我的onActivityResult()方法中的一些代码:

protected void onActivityResult(int requestCode, int resultCode, Intent intent) {

        super.onActivityResult(requestCode, resultCode, intent);
        IntentResult scanningResult = IntentIntegrator.parseActivityResult(requestCode, resultCode,intent);
        TextView tvInf = (TextView) findViewById(7);
        if(resultCode == RESULT_OK ){
            // Have got scanning result
            String scanContent = scanningResult.getContents();
            tvInf.setBackgroundResource(R.drawable.customborder);
            tvInf.getBackground().setAlpha(160);
            tvInf.setText(scanContent);
        }else {
            // Didn't receive any scan data
            tvInf.setText("");
            tvInf.setVisibility(View.INVISIBLE);
            Toast toast = Toast.makeText(getApplicationContext(), "No scan data received!", Toast.LENGTH_LONG);
            toast.show();
        }

这是我的自定义相机视图类:

    // Class for adding camera to the custom surface view
public class CustomCameraView extends SurfaceView implements SurfaceHolder.Callback {
    Camera camera;
    SurfaceHolder previewHolder;
    boolean previewing = false;

    // Constructor :
    @SuppressWarnings("deprecation")
    public CustomCameraView(Context context) {
        super(context);

        previewHolder = this.getHolder();
        int sdk = android.os.Build.VERSION.SDK_INT;
        if (sdk < android.os.Build.VERSION_CODES.HONEYCOMB ){
            previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        }
        previewHolder.addCallback(this);
    }


        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            if (camera != null){
                camera.stopPreview();
                camera.release();
                camera = null;
                previewing = false;

            }
        }

        @Override
        public void surfaceCreated(SurfaceHolder holder) {

                camera = Camera.open();
                camera.setDisplayOrientation(90);
        }

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width,
                int height) {

            if(previewing){
                camera.stopPreview();
                previewing= false;
            }

            // Checking to see if natural device orientation is Portrait or Landscape :
            if (width > height){
                camera.setDisplayOrientation(0);
                Parameters parameters = camera.getParameters();
                parameters.setPreviewSize(width, height);
                camera.setParameters(parameters);

            }else {
                camera.setDisplayOrientation(90);
                Parameters parameters = camera.getParameters();
                parameters.setPreviewSize(height, width);
                camera.setParameters(parameters);

            }

            try {
                camera.setPreviewDisplay(previewHolder);
                camera.startPreview();
                previewing = true;
            } catch (Exception e) {e.printStackTrace();}    

        }

}

最后,这是我如何在主类的onCreate()方法中创建相机视图的方法:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //Setting no title bar and full screen feature on
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

    //Creating new frame layout:
    FrameLayout frame = new FrameLayout(this.getApplicationContext());
    setContentView(frame);
    frame.setId(10); // FrameLayout ID=10
    //Creating new camera view and adding this to frame
    cv = new CustomCameraView(this.getApplicationContext());
    cv.setId(11); // ID = 11
    frame.addView(cv);

我真的希望有人对此有一个答案,因为我更希望继续进行应用程序的更复杂的阶段:)问候,乔尔

肖恩·欧文(Sean Owen)

您正在尝试使用Intents作为外部应用程序调用条形码扫描仪,但是也已经将大量项目代码粘贴到您的应用程序中。这完全没有必要,这是您的问题。删除它,然后按照http://zxing.github.io/zxing/apidocs/com/google/zxing/integration/android/IntentIntegrator.html中的给定说明进行操作

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

ZXing条码扫描器以片段形式自定义

Android Zxing条码扫描器无法正确扫描

ZXing条码扫描器WinRT无法启动StartPreviewAsync()

如何在android中横向和纵向使用ZXing条码扫描器

在自定义视图中扫描 Wifi

USB条码扫描器。

RXJS条码扫描器

Core.jar 不在 Zxing Core 文件夹中?- Zxing 条码扫描器

当我单击按钮 Rails 时,从视图中调用自定义控制器操作

努力使用Cordova条码扫描器插件

通过意图在活动之间传递自定义对象时出错

pyqt条码扫描器行

实时条码扫描器firebase

Phonegap条码扫描器:无法运行

自定义视图相机

我可以通过浏览器的HTML页面链接广播自定义意图吗?

通过SNAPI.dll API对Symbol条码扫描器DS4208进行图像捕获

当我在自定义适配器中使用imagebutton时,setOnItemClickListener在列表视图中不起作用

如何向我的 ds4208 条码扫描器添加前缀值

如何在 App 启动时初始化条码扫描器

使用excel作为数据库的Android条码扫描器

使用Ionic创建自定义相机视图

条码扫描器在浏览器中的工作

通过SurfaceView使用Zxing条码阅读器

如何通过在自定义视图中按按钮从超级视图中删除自定义视图?

如何解析从我的条码扫描器接收到的扫描结果数据到颤振的新屏幕或页面

Angular2:在组件视图中通过ngIf使用自定义时间

Phonegap,条码扫描器无法在android上运行

POS for .NET条码扫描器DeviceEnabled设置失败