如何正确管理First ZXING Intent?

时间:2014-07-27 19:18:01

标签: android

我已在我的App中实现了ZXing功能,以读取QR码。 Xzing通过一个明确的意图运行Barcode扫描程序,因此首先启动意图,它会要求安装条形码。

因此,它会将您重定向到Play商店并安装应用程序。

无论如何,这里有一些不太容易管理的东西,因为Intent已经启动,但我们永远无法获得回报。

所以应用程序永远等待....

是否有任何拦截或类似的事件......

也许在Integrator中已经有条形码安装的OnActivity结果?

我试着先根据这里所说的Zxing via intent来处理PackageManager 但实际上测试list.size()是成功的... Zalando Arghhh !!!

会发生什么?

目标是检查是否安装了BarCode,如果没有,请使用StartActivityForResult安装它,一旦安装完成,启动扫描意图。

此致

1 个答案:

答案 0 :(得分:0)

所以, 很遗憾我没有回答我的问题,因为我想知道它是不是只比使用Xzing更常见。 实际首选的Xzing实现似乎是使用intent来启动barCode Scanner应用程序。 如果您的设备上尚未安装BarCode扫描仪,则会出现此问题。 在这种情况下,意图启动游戏商店让你下载它。 这是问题所在,因为除非我没有理解,因为我没有得到答案,我认为我没有错,一旦下载,安装和启动BarCode扫描仪,你就不会# 39;收到你发送的意图的任何答案!让你的用户在两把椅子之间屁股。

另一个替代方案可能是先与包管理员联系,询问是否安装了Barcode Scanner。这样,您与包管理器讨论安装应用程序,然后启动扫描意图。 不幸的是,我也试过了,但出于某种原因,我并不理解向包管理员询问是否有com.google.zxing.client.android.SCAN"存在给... Zalando一个肯定的答案!?! Arghhh!

其他可能性应该是将Xzing的各个部分直接集成到您的应用中。 我阅读了很多关于这个主题的帖子,所有帖子都基于不同的Xzing版本,并提供了不同的方法,我没有成功获得一个有效的解决方案。 显然,肖恩欧文似乎显然不鼓励这种解决方案。我真的不明白,因为在某些情况下,在您使用应用程序时不得不下载第三方应用程序可能会让人觉得不舒服并且无法改善用户体验。那是我的观点。我认为即使它导致Stackoverflow严重降级!!

那说我的答案是使用Zbar。 Zbar不再在Android上维护,因为它的开发者切换到了Xzing!好.... 无论如何,它是一个非常高效和使用的库,特别是出于最后的原因,它是一个高品质的产品。 在这里,我将解释如何实现它:

- 首先下载档案https://sourceforge.net/projects/zbar/files/AndroidSDK/ZBarAndroidSDK-0.1.zip - 当然要提取它。 您将获得各种目录:  *示例,使用CameraTest活动我鼓励您集成到Eclipse中进行测试,也因为您将获得其组件  * libs你会发现子目录x86,armeab-v7a,armeabi和zbar.jar库。

在Eclipse中导入cameraTest项目后,您应该拥有一个名为CameraTestActivity的完全正常工作的代码扫描程序。

因此,要在您的应用程序中集成functionnality,请按照以下步骤操作:

当然,所有必需的组件都在CameraTestActivirty中。

将CameraTestActivity.java和CameraPreview.java从CameraTestActivity src复制/粘贴到您正确的src目录中。 您希望根据需要复制/粘贴包。 我个人将CameraTestActivity重命名为QRCodeScanActivity

将libT中的所有directoris从CameraTestActivity复制/粘贴到正确的libs目录。

在适当的AndroidManifest.xml中包含AndroidManifest.xml的以下部分

<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />  Here it's as you want, it should work also on non autofocus devices

      ......你已经在场的宣言......            ....    

将main.xml从layout i CameraTestActivity复制/粘贴到正确的布局目录中。 CameraTestActivity将在扫描期间强制纵向方向。 根据需要重命名此文件; qrcodescan.xml如果你想要。

您必须声明使用zbar.jar库。 右键单击您的应用程序名称,选择属性,单击Java Build Path,然后单击Add JARs并浏览yourAppName \ libs以选择zbar.jar。

您必须在代码中更改2或3个小东西。 在QRCodeScanActivity中,以前是CameraTest Activity:

public class QRCodeScanActivity extends Activity {

    // declare a constant to use in the Intent created in your application to start he scan.
    public final static int ACTIVITY_SCAN_CODE = 33;

    .....

    // Declare an intent to respond to your activity
    Intent activityResult = new Intent();

    // Not mandatory, you can add an intermediate String to return to your application
    String textScanned;

    ......

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

        // Put here the name you choosed in place of main.xml
        setContentView(R.layout.qrcodescan);  

        ....    

        // Later you will choose if you let the TextView and the Button or not. Personnaly, I removed it to just keep the test if (barcodescanned) and its content.
        scanText = (TextView)findViewById(R.id.scanText);

        scanButton = (Button)findViewById(R.id.ScanButton);

        scanButton.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {
                    if (barcodeScanned) {
                        barcodeScanned = false;
                        scanText.setText("Scanning...");
                        mCamera.setPreviewCallback(previewCb);
                        mCamera.startPreview();
                        previewing = true;
                        mCamera.autoFocus(autoFocusCB);
                   }
               }
        });

    }

    public void onPause() {
        super.onPause();
        releaseCamera();
    }

    ...............

    PreviewCallback previewCb = new PreviewCallback() {
            public void onPreviewFrame(byte[] data, Camera camera) {
                Camera.Parameters parameters = camera.getParameters();
                Size size = parameters.getPreviewSize();

                Image barcode = new Image(size.width, size.height, "Y800");
                barcode.setData(data);

                int result = scanner.scanImage(barcode);

                if (result != 0) {
                    previewing = false;
                    mCamera.setPreviewCallback(null);
                    mCamera.stopPreview();

                    SymbolSet syms = scanner.getResults();
                    for (Symbol sym : syms) {
                        scanText.setText("barcode result " + sym.getData());
                        barcodeScanned = true;

                        // Here is what you have to add to return the result to your application
                        textScanned = sym.getData();
                        activityResult.putExtra("SCANNED", textScanned);
                        setResult(RESULT_OK, activityResult);
                        finish();
                    }
                }
            }
        };

    // Mimic continuous auto-focusing
    AutoFocusCallback autoFocusCB = new AutoFocusCallback() {
            public void onAutoFocus(boolean success, Camera camera) {
                autoFocusHandler.postDelayed(doAutoFocus, 1000);
            }
        };
}

立即申请:

您想要开始扫描的地方;添加:

     Intent intent = new Intent(this, QRCodeScanActivity.class);
     startActivityForResult(intent, QRCodeScanActivity.ACTIVITY_SCAN_CODE);

你应该有必要的代码来接收结果:

public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    super.onActivityResult(requestCode, resultCode, intent);

    if (requestCode == QRCodeScanActivity.ACTIVITY_SCAN_CODE) {
         String textScanned = intent.getStringExtra("SCANNED");
         ....
    }
}

这应该很好。

此致