[android]QR code掃描

今天一時興起就來寫個code
IDE是使用Android Studio

首先呢~先來介紹今天的主角 zxing~~
zxing 是zebra crossing 的縮寫
是開源的 一維、二維條碼辨識的library

首先  這是介面布局
一個Button 兩個TextView

然後遇到第一個問題  如何在Android Studio中加入library??
上網參考了stack overflow的解答
只要在build.gradle中加入這幾行就OK了
repositories {
    mavenCentral()
 
    maven {
        url "http://dl.bintray.com/journeyapps/maven"
    }
}
 
dependencies {
    // Supports Android 4.0.3 and later (API level 15)
    compile 'com.journeyapps:zxing-android-embedded:2.0.1@aar'
 
    // Supports Android 2.1 and later (API level 7), but not optimal for later Android versions.
    // If you only plan on supporting Android 4.0.3 and up, you don't need to include this.
    compile 'com.journeyapps:zxing-android-legacy:2.0.1@aar'
 
    // Convenience library to launch the scanning and encoding Activities.
    // It automatically picks the best scanning library from the above two, depending on the
    // Android version and what is available.
    compile 'com.journeyapps:zxing-android-integration:2.0.1@aar'
 
    // Version 3.0.x of zxing core contains some code that is not compatible on Android 2.2 and earlier.
    // This mostly affects encoding, but you should test if you plan to support these versions.
    // Older versions e.g. 2.2 may also work if you need support for older Android versions.
    compile 'com.google.zxing:core:3.0.1'
}
阿阿阿阿~~ 還沒搞懂gradle 所以我沒辦法解釋這些東西
我只知道他是去下載然後build zxing((大概是八=..=
接下來來寫activity
package com.catstudio.scanme;

import android.app.Activity;
import com.google.zxing.integration.android.*;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

/**
 * Created by cat on 2015/3/30.
 */
public class MainActivity extends Activity{

    private Activity mainactivity;
    private TextView scan_content;
    private TextView scan_format;
    private Button scan_btn;
    protected void onCreate(Bundle saveInstanceStat){
        super.onCreate(saveInstanceStat);
        setContentView(R.layout.main_layout);
        init_view();
        scan_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                IntentIntegrator scanIntegrator = new IntentIntegrator(mainactivity);
                scanIntegrator.initiateScan();
            }
        });
    }
    public void onActivityResult(int requestCode, int resultCode, Intent intent){
        IntentResult scanningResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent);
        if(scanningResult!=null){
            String scanContent=scanningResult.getContents();
            String scanFormat=scanningResult.getFormatName();
            scan_content.setText(scanContent);
            scan_format.setText(scanFormat);
        }else{
            Toast.makeText(getApplicationContext(),"nothing",Toast.LENGTH_SHORT).show();
        }
    }
    private void init_view(){
        this.scan_content=(TextView)findViewById(R.id.scan_content);
        this.scan_format=(TextView)findViewById(R.id.scan_format);
        this.mainactivity=this;
        this.scan_btn = (Button)findViewById(R.id.scan_btn);
    }
}
當點擊Button就可以用IntentIntegration的initiateScan方法開始掃描
掃描完的結果會回傳到Activity  這時候要用onActivityResult  這個方法
然後就簡單了   把data顯示到TextView就OK了


附上幾張完成圖


留言

  1. 感謝分享 想請問有什麼方法可以直接把網址變成超連結嗎?

    回覆刪除
    回覆
    1. 我想這篇應該可以解答你的問題~
      http://magiclen.org/android-html-textview/

      刪除
  2. 您好,想請問一下 如何連掃描到的QR Code用ImageView顯示在結果上呢 !?

    回覆刪除
    回覆
    1. http://stackoverflow.com/questions/19786143/get-a-qrcode-scanned-image-in-onactivityresult-using-zxing-in-android
      似乎是因為圖片太大了所以無法回傳@@
      我能想到的辦法是將得到的data用QRCodeWriter 建立新的QR code
      關於QRCodeWriter範例還請google一下 或是等我有空再更新此篇文章

      刪除
  3. Error:Execution failed for task ':app:transformClassesWithDexForDebug'.
    > com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'C:\Program Files\Java\jdk1.8.0_77\bin\java.exe'' finished with non-zero exit value 2

    回覆刪除
    回覆
    1. 感謝您的分享 不過搞了一個禮拜還是出了一些問題 實在有點頭疼
      能否跟您借個範例檔案參考比對一下嗎 謝謝

      刪除
    2. https://drive.google.com/file/d/0B13pI8uLNji6TmNaUnVOVjV5dVE/view?usp=sharing
      若還是有問題歡迎一起討論~

      刪除
    3. 原來是我自己眼殘
      android studio只要在gradle寫下要compile的資料來源
      自動會抓下來需要的library
      根本不用去抓任何檔案到自己的projects
      我把它想得太複雜了!
      受教了 大感恩!

      刪除
    4. 作者已經移除這則留言。

      刪除
  4. 請問一下有已完成的範本能分享一下嗎

    回覆刪除
  5. 請問一下有已完成的範本能分享一下嗎
    因為沒有基礎都一直錯誤

    回覆刪除
    回覆
    1. https://drive.google.com/file/d/0B13pI8uLNji6TmNaUnVOVjV5dVE/view
      若還是有問題歡迎一起討論~

      刪除
    2. 好哦 我試試看 有問題在麻煩你 謝謝囉

      刪除
  6. 作者已經移除這則留言。

    回覆刪除
    回覆
    1. 它幫你自動修正正確的Android sdk位置

      刪除
    2. 請問一下IntentIntegrator紅字是什麼錯誤
      Textbox放一個就能了嗎?

      刪除
  7. 請問一下 如果IntentIntegrator和IntentResult
    還有
    String scanContent = result.getContents();
    String scanFormat = result.getFormatName();
    有紅字是神麼問題呢

    回覆刪除
    回覆
    1. 你可能沒有import
      是試試加這行
      imports com.google.zxing.*;

      刪除
    2. 作者已經移除這則留言。

      刪除
  8. 想請問一下可以從後置鏡頭改到前置鏡頭嗎?
    謝謝。

    回覆刪除
    回覆
    1. 可以的喔
      只要讓intent多傳一些參數就可以
      像這樣
      IntentIntegrator scanIntegrator = new IntentIntegrator(mainactivity);
      scanIntegrator.addExtra("SCAN_MODE", "QR_CODE_MODE");
      scanIntegrator.addExtra("SCAN_CAMERA_ID", 1);
      scanIntegrator.initiateScan();
      比較需要注意的地方是SCAN_CAMERA_ID 通常前鏡頭是 1 ((通常拉@@

      刪除
  9. 作者已經移除這則留言。

    回覆刪除
  10. 不好意思,我目前做到可以掃描發票並跳出小視窗顯示結果
    想請問一下,有辦法把資料拆開成發票號碼、日期、明細丟到另一個Activity嗎?
    非常感謝你~~

    回覆刪除
  11. 請問如何改成直向掃描呢??

    回覆刪除
  12. 我想問android 6.0以上相機功能不能使用是因為什麼原因?

    回覆刪除
    回覆
    1. 我的可以正常使用喔~
      麻煩提供錯誤訊息

      刪除
    2. 要記得要求runtime權限 camera

      刪除
  13. 您好 請問如何將掃描後的QR code (如:網址) 直接開啟呢?
    謝謝

    回覆刪除
    回覆
    1. 請參考這篇https://developer.android.com/reference/android/content/Intent.html#ACTION_VIEW
      寫起來大概是這樣子
      Intent i = new Intent(Intent.ACTION_VIEW);
      i.setData(Uri.parse(scanningResult.getContents()));
      startActivity(i);

      刪除
  14. 妳好 請問如果我要用成2個掃描跟各別顯示怎麼用?

    回覆刪除
  15. 您好 我想在掃描時開啟閃光燈應該怎麼做呢

    回覆刪除
  16. 請問一下這個也可以掃描發票的qr code 嗎?

    回覆刪除

張貼留言

這個網誌中的熱門文章