这里我要问大家一个问题,你们都是如何在自己的App中加入二维码扫描功能的呢?
相信会有一大部分朋友说,使用的是ZXing或者ZBar这种开源库。
但是不知道大家有没有思考过,二维码功能这么常见,为什么Google却没有提供一个官方的二维码扫描库呢?
反正我是没思考过。有需求,找开源,这可能已经成了很多Android开发者的常态化思维。
但令我没想到的是,官方的二维码扫描库,它真的要来了。
由于我是Google的GDE,有的时候可以提前体验到一些Google还未正式对外开放,仍在开发当中的API。
就在不久之前,我收到了一封Google发来的邮件,内容如下:
当我看到邮件里提到了Google官方要推出一个二维码、条形码扫描库时,我立刻被吸引到了,并且跟Google表达了我想尝鲜的意愿。
几经折腾之后,我终于将这个库的一整套流程跑通了。总体来说,体验还不错,有优点也有缺点,下面我来逐条分析。
第一个优点是,API非常简单,傻瓜式接口,初学者都会用。比起ZXing和ZBar的学本成本要低很多。
其次,更加保护用户隐私性。因为它的功能实现是基于Intent机制委托Android系统来调起手机摄像头的,系统扫描出结果之后再将信息返回给我们,这样我们就不用在自己的App当中去申请摄像头权限了。
至于缺点的话,最大的问题就是,它依赖于Google Play Service,所以对于国内手机而言的话,基本就是完全无法使用的(不过下文也有其他解决方案)。而如果你们的产品是面向海外市场的话,这条就算不上什么缺点了。
另外我测试了一下,二维码的识别效率不算很高,至少目前跟微信的识别效率是没法比的。但是毕竟后期升级维护都是靠Google,服务有保障,相信以后识别效率会有显著的提升。
优缺点就介绍到这里吧,如果你对这个库感兴趣,也想跟我一样尝鲜的话,那么本篇文章接下来的内容就是教你如何集成并使用这个库来进行二维码扫描。
首先确保你的手机有安装Google Play Service,并且版本在21.45.15以上,不然后面的代码是跑不通的。
另外这个库暂时还没有上线,所以不能通过在线maven仓库的方式集成到我们项目当中。而是要先将这个库下载到本地,再通过本地maven仓库的方式集成进来。
我们一步步操作。
这个库的下载地址本来是在Google Drive上的,但是由于需要权限才能访问下载,所以我将它上传到了百度网盘上共享给大家。
链接: https://pan.baidu.com/s/13nhR3ZXsa9ELBIX6giUCQg 提取码: gfs8
下载完成后,在你电脑的当前登录用户目录下创建一个.m2/repository目录,并将下载好的库移到这个目录当中解压(注意解压后的顶层目录必须是com目录)。
Linux或Mac用户可以使用以下命令完成上述操作,Windows用户请手动操作。
mkdir -p ~/.m2/repository
cd ~/.m2/repository
unzip <downloaded SDK zip file>
接下来在Android Studio中创建一个新的项目,并在项目根目录的build.gradle文件中添加以下配置:
allprojects {
repositories {
google()
mavenCentral()
mavenLocal() // added
}
}
注意一定要加入mavenLocal()这行,这样才可以加载到我们本地下载下来的二维码扫描库。
然后在app目录下的build.gradle文件中添加如下依赖:
dependencies {
...
implementation 'com.google.android.gms:play-services-code-scanner:16.0.0-eap1'
}
到这里为止,我们就成功将Google的这个二维码扫描库集成到我们项目当中了。
接下来介绍用法,用法就更加简单了。因为它的本质是发起一个Intent来调起系统的相机程序,然后获取扫描的结果值就可以了。不需要权限声明,也不需要动态申请权限,调用一个API即可搞定。代码如下所示:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val button = findViewById<Button>(R.id.button)
val textView = findViewById<TextView>(R.id.text_view)
button.setOnClickListener {
val scanner = GmsBarcodeScanning.getClient(applicationContext)
scanner.startScan().addOnSuccessListener {
val result = it.rawValue
textView.text = result
}
}
}
}
这里当我们点击一个按钮时,会调用GmsBarcodeScanning的getClient()方法来获取一个GmsBarcodeScanner的实例。
然后调用startScan()即可开始扫描二维码,调用addOnSuccessListener()方法注册一个回调监听。当获取到二维码扫描结果的时候,我们将扫描出的结果显示在TextView上面。
整体代码非常简单,另外再附上activity_main.xml的布局内容,同样也非常简单:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Scan Code" />
<TextView
android:id="@+id/text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
LinearLayout>
现在运行一下程序,效果如下图所示:
可以看到,整个二维码扫描界面都是由Google给我们提供的,扫描框也是典型的Google风格。我们只需要调用API,获取扫描结果即可,接入成本非常非常低。
但是如此方便的二维码扫描库却只能造福海外的开发者,国内由于没有Google Play Service,我们无法直接享受到这个库所带来的便利性。
于是我也将这个问题提给了Google,对于中国的开发者,如果也想要用这个二维码扫描库怎么办?
得到的答复是,Google是将ML Kit barcode scanner绑定成为了Google Play Service的一部分安装到各个手机上的,如果我们的手机上没有Google Play Service,那么就需要将ML Kit barcode scanner的完整版本集成到我们的项目当中才行。
完整版本的集成文档我也讨来了,链接如下:
https://developers.google.com/ml-kit/vision/barcode-scanning/android
上述文档中还包含了如何从一张图片、或者一个Bitmap对象中解析二维码的功能,具体详情请参考文档即可,这里就不再展开讲解了。