Android 二维码扫码功能实现(Zxing集成,避坑启示)
這兩天想要實現一個能掃碼的app,找了一下,發現zxing用的比較多,就在網上找了找怎么用zxing。我主要是按照宇寶守護神的博文“Android 二維碼的掃碼功能實現(一)”的步驟完成的,博文鏈接在此:https://blog.csdn.net/qq_34902522/article/details/78384661
但是這個博文的時間比較早,2017年的,所以在按照他的步驟實現過程中,我遇到了非常非常多原作者沒有遇見的坑,在這里我完整的把我的過程記錄下來(真的是血淚史啊@~@)
zxing開源項目的地址:https://github.com/zxing/zxing/releases,把zxing項目下載下來。
1. 在Android Studio中新建一個空白項目。
2. 在新建項目中,file→new→import Module,將下載好的zxing項目作為module導入進來,注意,選擇android這個文件夾。然后next→finish。這里面可以按照自己的需要給module取名,默認的“android”也是可以的。
3. 我們可以看到導進來之后,project中出現了一個名為“android”的文件夾
同時也出現了我們遇到的第一個bug,提示“The minSdk version should not be declared in the android manifest file. You can move the version from the manifest to the defaultConfig in the build.gradle file.” 根據提示,打開android(新導入的module名)→src→main→AndroidMainfest.xml,里面定義了一句
<uses-sdk android:minSdkVersion="19" android:targetSdkVersion="22"/>把它刪掉就好了。重新Sync整個項目就沒有問題了。
4. 導入的步驟還沒有做完,打開新導入庫(我這里是android)的build.gradle,① 把"apply plugin: ‘com.android.application’語句改成"apply plugin: ‘com.android.library",② 刪掉"applicationId “com.google.zxing.client.android”";③?添加
dependencies{implementation 'com.google.zxing:android-core:3.3.0'implementation 'com.google.zxing:core:3.3.3'implementation 'com.google.zxing:android-integration:3.3.0' }上面添加的代碼段中,解決了第一個坑,core版本要選3.3.3的,因為在3.3.0版本中,會缺少一些我們掃碼過程中必須要用的函數比如說getStartTimestamp()、getEndTimestamp()等,宇寶守護神也遇到了這個問題,但是他通過暴力地把函數改了來解決這個問題,可惜我不只有這個問題,還有暴力不能解決的。尋找問題的方法:下面這個鏈接里面有各個版本的jar包,下載下來,通過jd-gui將jar包反編譯就可以發現其中的差別,通過查找自己缺失的函數來確定使用哪個版本的jar包。
https://repo1.maven.org/maven2/com/google/zxing/
5. 繼續引庫。右鍵項目,Open Module Settings→打開窗口中左邊選擇application module(app),右邊選dependencies→點綠色加號→Module dependency→:android→OK,OK.
6.Sync后,又一個意外之喜來了,提示錯誤“java.lang.RuntimeException: Manifest merger failed with multiple errors, see logs”。接下來我們要看看是什么情況。點擊左下角Terminal,輸入
gradlew compileDebugSource --stacktrace -infoTerminal里面輸出了很多亂七八糟的東西,往上翻翻,看到了error了。部分如下:
打開看之后,發現是所有switch-case出錯了,查找資料發現,改成if-else格式就可以了。接下來就是改了,按照提示,找到對應的文件下面,把所有報錯的地方的switch-case改成if-else。
7.再Sync,當當當當!有一個bug來啦,如下
提示說Manifest文件出問題了,那就去看看Androidmanifest.xml,打開這個文件后,點擊下圖左下角Merged Manifest,就可以在下圖右邊的框框里面看到error信息了。
根據提示,刪除android:AndroidManifest.xml中的
android:icon="@drawable/launcher_icon"然后按照錯誤提示修改一下代碼里面sdk的版本,或者直接點一下提示里面給的建議,好像會直接幫修改好,輕松快樂。
8. 再Sync,終于沒有錯了。下面可以跑教程博客里面給出的代碼了,代碼在上述鏈接里面有給,這里就不再粘了。還有幾個bug需要我們去修改。
第一個問題:提示沒有下面兩個類。我的解決非常暴力,直接在下載的zxing文件里面搜索,找到IntentIntegrator.java和IntentResult.java,把它們復制到MainActivity文件夾下面,這樣就不需要import了,直接把這兩句話刪了。
復制過來之后,project中就變成了下圖這樣
但是需要注意的是,我們要打開把IntentIntegrator.java和IntentResult.java開頭的那個packet名給改了,MainActivity里面是啥樣,這倆就改成啥樣。
還有一個小地方,直接復制過來的話會有如下這個錯誤
我們需要在layout文件夾下面的activity_main.xml中添加button的布局控件,下面這段代碼作為一個小樣例放在這里。
<Buttonandroid:id="@+id/scanner"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="掃碼"/>到這一步,我們基本上解決了所有bug,下面就可以輕松愉快地真機調試,開始我們的第一步啦。
總結
以上是生活随笔為你收集整理的Android 二维码扫码功能实现(Zxing集成,避坑启示)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浮点数的运算精度丢失
- 下一篇: 2016-2017NBU期末考试记录