我想要一个使用ZXing条码扫描器的应用程序。我认为ScanningViaIntent是这个应用程序集成扫描的好方法。但是,我想在运行时知道用户是否能够使用这个应用程序。有没有一种简单的方法可以做到这一点?或者我应该不时检查他们的AndroidManifest.xml以查看设备所需的功能是什么 + 检查用户是否安装了 Play 商店?
编辑:只是为了说清楚;我想在代码中知道是否有设备支持。我知道 ScanningViaIntent 可以很好地处理未安装的应用程序。:)
我想要一个使用ZXing条码扫描器的应用程序。我认为ScanningViaIntent是这个应用程序集成扫描的好方法。但是,我想在运行时知道用户是否能够使用这个应用程序。有没有一种简单的方法可以做到这一点?或者我应该不时检查他们的AndroidManifest.xml以查看设备所需的功能是什么 + 检查用户是否安装了 Play 商店?
编辑:只是为了说清楚;我想在代码中知道是否有设备支持。我知道 ScanningViaIntent 可以很好地处理未安装的应用程序。:)
ZXing 团队提供了一个小型代码库来优雅地处理这种情况,包括提示用户在尚未安装 ZXing 条码扫描器时下载它。
详细信息和下载链接可以在这里找到:
我意识到这种链接在这里是不受欢迎的,但是除了完全复制链接站点的信息并发布所提供库的全部内容之外,我看不出还有什么方法可以充分回答这个问题。任何关于如何的建议将不胜感激
编辑:抱歉,我应该检查 OPs 问题中的链接,发现他已经知道 ZXing 的 IntentIntegrator 代码库
也许您可以在客户端中执行类似initiateScan
方法的操作ZXing
如果没有安装,它会提示下载ZXing。
是的,我认为您应该检查用户是否有相机,或者是否有其他东西,例如自动对焦。对于我的一些项目,我不得不将 ZXing 直接集成到项目中以避免此类问题。
但毕竟有些情况只是告诉用户他必须有最低要求才能使用扫描功能就足够了^^
这就是我最终的做法。至少在我找到更好的方法之前。:)
/**
* Convenience method for checking for ZXing app support. Requirements found
* in http://code.google.com/p/zxing/source/browse/trunk/android/AndroidManifest.xml
* and
* http://code.google.com/p/zxing/source/browse/trunk/android-integration/src/com/google/zxing/integration/android/IntentIntegrator.java
* .
*
* @return boolean true if app is supported, false if not.
*/
protected boolean hasSupportForZxing() {
PackageManager packageManager = getPackageManager();
if(!packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA)){ // ZXing required away faced camera
return false;
}
if(!packageManager.hasSystemFeature(PackageManager.FEATURE_SCREEN_LANDSCAPE)){ // ZXing requires landscape mode
if(packageManager.hasSystemFeature(PackageManager.FEATURE_SCREEN_PORTRAIT)){ // PackageManager doc states that if both landscape and portrait support is missing then both are probably supported (compatibility reasons)
return false;
}
}
if(!isMarketUrisHandled()){
return false;
}
return true;
}
protected boolean isMarketUrisHandled() {
Intent marketIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=dummy"));
List<ResolveInfo> resolveInfos = getPackageManager().queryIntentActivities(marketIntent, 0);
return resolveInfos.size() > 0;
}