我正在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码”,然后允许用户选择合适的应用程序。例如正如他们从图库应用程序中选择图像一样。
有没有解决方案?
答案 0 :(得分:1)
您可以在项目中使用ZXing lib,通过gradle添加它(不幸的是只有3-pt的端口可用)How to integrate ZXing Library to Android Studio for Barcode Scanning?或者将自己包装在应用程序中并将Activity声明为AndroidManifest.XML
然后你的意图将用于你自己的应用。
此外,您可以在ZXing应用上打开Google 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();
}
}