是否有独立于包的方式来制作QR码相关的意图?

时间:2017-11-08 14:53:33

标签: android android-intent qr-code

我正在Android应用程序中实现一项功能,该功能扫描QR码并对返回的数据执行一些操作。

我目前的解决方案是从zxing包请求扫描活动。

Intent intent = new Intent("com.google.zxing.client.android.SCAN");
intent.setPackage("com.google.zxing.client.android");
intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
startActivityForResult(intent, REQUEST_QR_SCAN);

但是,当用户的手机上没有该应用时,这将无效并导致错误。我想避免检查用户是否安装了此特定应用,因为他们可能选择了不同的QR扫描仪。

我似乎无法找到一种方法让意图说“我想扫描QR码”,然后允许用户选择合适的应用程序。例如正如他们从图库应用程序中选择图像一样。

有没有解决方案?

2 个答案:

答案 0 :(得分:1)

您可以在项目中使用ZXing lib,通过gradle添加它(不幸的是只有3-pt的端口可用)How to integrate ZXing Library to Android Studio for Barcode Scanning?或者将自己包装在应用程序中并将Activity声明为AndroidManifest.XML

然后你的意图将用于你自己的应用。

此外,您可以在ZXing应用上打开Goog​​le Play,以便用户安装它。

答案 1 :(得分:0)

此示例使用库 - https://github.com/dlazaro66/QRCodeReaderView

 public class PayQR extends Fragment implements QRCodeReaderView.OnQRCodeReadListener {

    public static QRCodeReaderView mydecoderview;
    public static String QRData;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_pay_qr, container, false);
        getActivity().setTitle(R.string.Pay_QR);
        try {
            mydecoderview = (QRCodeReaderView) view.findViewById(R.id.qrdecoderview);
            mydecoderview.setOnQRCodeReadListener(this);

            // Use this function to enable/disable decoding
            mydecoderview.setQRDecodingEnabled(true);

            // Use this function to change the autofocus interval (default is 5 secs)
            mydecoderview.setAutofocusInterval(2000L);

            // Use this function to enable/disable Torch
            mydecoderview.setTorchEnabled(true);

            // Use this function to set front camera preview
            mydecoderview.setFrontCamera();

            // Use this function to set back camera preview
            mydecoderview.setBackCamera();
        }catch (RuntimeException ex){

        }
        return view;
    }

    @Override
    public void onResume() {
        super.onResume();
        mydecoderview.startCamera();
    }

    @Override
    public void onQRCodeRead(String text, PointF[] points) {
        try{
        QRData = text.replaceAll("\u00A0"," ");
        Fabric.with(getActivity(), new Crashlytics());
        mydecoderview.stopCamera();
        getActivity().setTitle(R.string.Order_payment);
        }
        catch (RuntimeException ex){

        }
    }

    @Override
    public void onStart() {
        super.onStart();
    }

    @Override
    public void onPause() {
        super.onPause();
    }

    @Override
    public void onStop() {
        super.onStop();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }
}