Android 从我的自定义相机视图通过intent使用ZXing条形码扫描仪时出错

Android 从我的自定义相机视图通过intent使用ZXing条形码扫描仪时出错,android,android-intent,android-camera,zxing,Android,Android Intent,Android Camera,Zxing,我有一个有趣的问题给你们大家 我的应用程序: 我有一个自定义的摄像头视图,在此之上,我向用户显示额外的信息处理值等等。我在相机视图的顶部还有一个按钮,通过单击该按钮,我试图使用ZXing库中的IntentIntegrator.java和IntentResult.java文件进行ZXing-by-intent扫描。扫描结果应提供额外信息,显示在摄像机视图顶部 问题是: 这似乎经常发生,但并不总是有趣的事情。当我通过intent从自定义摄像头视图转到zxing条形码扫描仪应用程序时,我收到错误消息:

我有一个有趣的问题给你们大家

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

问题是: 这似乎经常发生,但并不总是有趣的事情。当我通过intent从自定义摄像头视图转到zxing条形码扫描仪应用程序时,我收到错误消息:对不起,android摄像头遇到问题。您可能需要重新启动设备。这种情况几乎总是发生在我在自定义相机视图中处于横向模式时,而不是在纵向模式时,但在该模式下仍然会发生。仅供参考,条形码扫描仪应用程序始终以横向模式运行。我听说过很多关于zxing库和这个通过intent方法扫描的好东西,所以我真的只想消除这个错误

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

<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" />
下面是我的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();}    

        }

}
我真的希望有人能回答这个问题,因为我更愿意进入我的应用程序中更复杂的阶段: 当做
Joar

您试图使用Intents将条形码扫描仪作为外部应用程序调用,但同时也将大量项目代码粘贴到了您的应用程序中。这完全没有必要,这是你的问题。将其卸下,然后按照

中给出的说明在哪个设备上进行测试?它安装了什么Android版本?希望您使用的是最新的zxing库。我正在测试三星Galaxy S3和三星Galaxy Tab 2 10.1。Android版本4.3在S3上,4.2在标签上。我从GitHub的zxing库中获得了IntentIntegrator.java和IntentResult.java,我认为这是最新版本。感谢Sean的快速响应。我不确定我是否完全理解这些方向。我必须导入一个库吗?在这种情况下,导入哪个库?我读了之前的一篇文章,在那里我可以得到两个.java意图处理程序类,并将它们添加到我的project.No中。您只需使用IntentIntegrator和IntentResult类。如果最简单的话,您可以复制源代码,但它也可以作为Maven依赖项提供,因此您也可以只获取.jar文件。这是我最初尝试的,我复制了IntentIntegrator和IntentResult,如问题中所述。但是现在我删除了这两个类,并尝试将.jar文件添加到构建路径中。这导致了一些奇怪的错误。我不能使用我的android.R库,或任何自定义菜单或绘图。有什么建议吗?否则这些课程不会影响你的应用程序。你还有其他错误。删除所有其他项目代码。
    // 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();}    

        }

}
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);