Android集成二維碼掃描功能

来源:http://www.cnblogs.com/xiaomiduizhang/archive/2017/05/24/6897810.html
-Advertisement-
Play Games

文章轉載自 https://github.com/yipianfengye/android-zxingLibrary 在具體介紹該掃描庫之前我們先看一下其具體的使用方式,看看是不是幾行代碼就可以集成二維碼掃描的功能。 在module的build.gradle中執行compile操作 在demo Ap ...


文章轉載自  https://github.com/yipianfengye/android-zxingLibrary

 

在具體介紹該掃描庫之前我們先看一下其具體的使用方式,看看是不是幾行代碼就可以集成二維碼掃描的功能。

  • 在module的build.gradle中執行compile操作
compile 'cn.yipianfengye.android:zxing-library:2.1'
  • 在demo Application中執行初始化操作
@Override
    public void onCreate() {
        super.onCreate();

        ZXingLibrary.initDisplayOpinion(this);
    }
  • 在代碼中執行打開掃描二維碼界面操作
/**
         * 打開預設二維碼掃描界面
         */
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, CaptureActivity.class);
                startActivityForResult(intent, REQUEST_CODE);
            }
        });

這裡的REQUEST_CODE是我們定義的int型常量。

  • 在Activity的onActivityResult方法中接收掃描結果
/**
         * 處理二維碼掃描結果
         */
        if (requestCode == REQUEST_CODE) {
            //處理掃描結果(在界面上顯示)
            if (null != data) {
                Bundle bundle = data.getExtras();
                if (bundle == null) {
                    return;
                }
                if (bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_SUCCESS) {
                    String result = bundle.getString(CodeUtils.RESULT_STRING);
                    Toast.makeText(this, "解析結果:" + result, Toast.LENGTH_LONG).show();
                } else if (bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_FAILED) {
                    Toast.makeText(MainActivity.this, "解析二維碼失敗", Toast.LENGTH_LONG).show();
                }
            }
        }

怎麼樣是不是很簡單?下麵我們可以來看一下具體的執行效果:

執行效果:

image

但是這樣的話是不是太簡單了,如果我想選擇圖片解析呢?別急,對二維碼圖片的解析也是支持的

  • 集成對二維碼圖片的解析功能

  • 調用系統API打開圖庫

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/*");
startActivityForResult(intent, REQUEST_IMAGE);
  • 在Activity的onActivityResult方法中獲取用戶選中的圖片並調用二維碼圖片解析API
if (requestCode == REQUEST_IMAGE) {
            if (data != null) {
                Uri uri = data.getData();
                ContentResolver cr = getContentResolver();
                try {
                    Bitmap mBitmap = MediaStore.Images.Media.getBitmap(cr, uri);//顯得到bitmap圖片

                    CodeUtils.analyzeBitmap(mBitmap, new CodeUtils.AnalyzeCallback() {
                        @Override
                        public void onAnalyzeSuccess(Bitmap mBitmap, String result) {
                            Toast.makeText(MainActivity.this, "解析結果:" + result, Toast.LENGTH_LONG).show();
                        }

                        @Override
                        public void onAnalyzeFailed() {
                            Toast.makeText(MainActivity.this, "解析二維碼失敗", Toast.LENGTH_LONG).show();
                        }
                    });

                    if (mBitmap != null) {
                        mBitmap.recycle();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

執行效果

image

有了預設的二維碼掃描界面,也有了對二維碼圖片的解析,可能有的同學會說如果我想定製化顯示UI怎麼辦呢?沒關係也支持滴。

  • 定製化顯示掃描UI

由於我們的掃描組件是通過Fragment實現的,所以能夠很輕鬆的實現掃描UI的定製化。

  • 在新的Activity中定義Layout佈局文件
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/activity_second"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/second_button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="取消"
        android:layout_marginTop="20dp"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"
        android:layout_marginBottom="10dp"
        android:layout_gravity="bottom|center_horizontal"
        />

    <FrameLayout
        android:id="@+id/fl_my_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        ></FrameLayout>

</FrameLayout>

啟動id為fl_my_container的FrameLayout就是我們需要替換的掃描組件,也就是說我們會將我們定義的掃描Fragment替換到id為fl_my_container的FrameLayout的位置。而上面的button是我們添加的一個額外的控制項,在這裡你可以添加任意的控制項,各種UI效果等。具體可以看下麵在Activity的初始化過程。

  • 在Activity中執行Fragment的初始化操作
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        /**
         * 執行掃面Fragment的初始化操作
         */
        CaptureFragment captureFragment = new CaptureFragment();
        // 為二維碼掃描界面設置定製化界面
        CodeUtils.setFragmentArgs(captureFragment, R.layout.my_camera);
        
        captureFragment.setAnalyzeCallback(analyzeCallback);
        /**
         * 替換我們的掃描控制項
         */ getSupportFragmentManager().beginTransaction().replace(R.id.fl_my_container, captureFragment).commit();
    }

其中analyzeCallback是我們定義的掃描回調函數,其具體的定義:

/**
     * 二維碼解析回調函數
     */
    CodeUtils.AnalyzeCallback analyzeCallback = new CodeUtils.AnalyzeCallback() {
        @Override
        public void onAnalyzeSuccess(Bitmap mBitmap, String result) {
            Intent resultIntent = new Intent();
            Bundle bundle = new Bundle();
            bundle.putInt(CodeUtils.RESULT_TYPE, CodeUtils.RESULT_SUCCESS);
            bundle.putString(CodeUtils.RESULT_STRING, result);
            resultIntent.putExtras(bundle);
            SecondActivity.this.setResult(RESULT_OK, resultIntent);
            SecondActivity.this.finish();
        }

        @Override
        public void onAnalyzeFailed() {
            Intent resultIntent = new Intent();
            Bundle bundle = new Bundle();
            bundle.putInt(CodeUtils.RESULT_TYPE, CodeUtils.RESULT_FAILED);
            bundle.putString(CodeUtils.RESULT_STRING, "");
            resultIntent.putExtras(bundle);
            SecondActivity.this.setResult(RESULT_OK, resultIntent);
            SecondActivity.this.finish();
        }
    };

仔細看的話,你會發現我們調用了CondeUtils.setFragmentArgs方法,該方法主要用於修改掃描界面掃描框與透明框相對位置的,與若不調用的話,其會顯示預設的組件效果,而如果調用該方法的話,可以修改掃描框與透明框的相對位置等UI效果,我們可以看一下my_camera佈局文件的實現。

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <SurfaceView
        android:id="@+id/preview_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />

    <com.uuzuche.lib_zxing.view.ViewfinderView
        android:id="@+id/viewfinder_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:inner_width="200dp"
        app:inner_height="200dp"
        app:inner_margintop="150dp"
        app:inner_corner_color="@color/scan_corner_color"
        app:inner_corner_length="30dp"
        app:inner_corner_width="5dp"
        app:inner_scan_bitmap="@drawable/scan_image"
        app:inner_scan_speed="10"
        app:inner_scan_iscircle="false"
        />

</FrameLayout>

上面我們自定義的掃描控制項的佈局文件,下麵我們看一下預設的掃描控制項的佈局文件:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <SurfaceView
        android:id="@+id/preview_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />

    <com.uuzuche.lib_zxing.view.ViewfinderView
        android:id="@+id/viewfinder_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />

</FrameLayout>

可以發現其主要的區別就是在自定義的掃描控制項中多了幾個自定義的掃描框屬性:

<declare-styleable name="innerrect">
        <attr name="inner_width" format="dimension"/><!-- 控制掃描框的寬度 -->
        <attr name="inner_height" format="dimension"/><!-- 控制掃描框的高度 -->
        <attr name="inner_margintop" format="dimension" /><!-- 控制掃描框距離頂部的距離 -->
        <attr name="inner_corner_color" format="color" /><!-- 控制掃描框四角的顏色 -->
        <attr name="inner_corner_length" format="dimension" /><!-- 控制掃描框四角的長度 -->
        <attr name="inner_corner_width" format="dimension" /><!-- 控制掃描框四角的寬度 -->
        <attr name="inner_scan_bitmap" format="reference" /><!-- 控制掃描圖 -->
        <attr name="inner_scan_speed" format="integer" /><!-- 控制掃描速度 -->
        <attr name="inner_scan_iscircle" format="boolean" /><!-- 控制小圓點是否展示 -->
    </declare-styleable>

通過以上幾個屬性我們就可以定製化的顯示我們的掃描UI了,比如定製化微信掃描UI:

執行效果

image

當然瞭如果以上的以上,你還是對定製化UI方面不太滿意,可以直接下載我的項目,然後引入lib-zxing module作為你的module,直接修改其代碼。

  • 生成二維碼圖片

  • 生成帶Logo的二維碼圖片:

/**
         * 生成二維碼圖片
         */
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String textContent = editText.getText().toString();
                if (TextUtils.isEmpty(textContent)) {
                    Toast.makeText(ThreeActivity.this, "您的輸入為空!", Toast.LENGTH_SHORT).show();
                    return;
                }
                editText.setText("");
                mBitmap = CodeUtils.createImage(textContent, 400, 400, BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher));
                imageView.setImageBitmap(mBitmap);
            }
        });
  • 生成不帶logo的二維碼圖片
/**
         * 生成不帶logo的二維碼圖片
         */
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                String textContent = editText.getText().toString();
                if (TextUtils.isEmpty(textContent)) {
                    Toast.makeText(ThreeActivity.this, "您的輸入為空!", Toast.LENGTH_SHORT).show();
                    return;
                }
                editText.setText("");
                mBitmap = CodeUtils.createImage(textContent, 400, 400, null);
                imageView.setImageBitmap(mBitmap);
            }
        });
  • 執行效果

image

  • 支持控制閃光燈
/**
 * 打開閃光燈
 */
CodeUtils.isLightEnable(true);

/**
 * 關閉閃光燈
 */
 CodeUtils.isLightEnable(false);

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 什麼是持續集成:http://www.ruanyifeng.com/blog/2015/09/continuous-integration.html 持續集成的好處:https://zhuanlan.zhihu.com/p/20589465?columnSlug=jishuqushi 本人之前待過的 ...
  • 1 #include 2 #include 3 4 using namespace std; 5 6 7 class Handler 8 { 9 public: 10 Handler(Handler* pstHandler): m_pstHandler(pstHandler) 11 { 12 13 ... ...
  • --save參數表示將該模塊寫入dependencies屬性, --save-dev表示將該模塊寫入devDependencies屬性。 devDependencies指定項目開發所需要的模塊。 ...
  • 1 快捷方式:html:xt +tab 過渡XHTML html:xs+tab 嚴格XHTML !+tab html5的標簽結構 2.Charset 編碼 <meta charset="UTF-8"> Ascll Ansi Unicode Gbk 包含全部中文字元 繁體 Gb2312 簡單中文 Bi ...
  • 筆者在查詢bootstrap table資料的時候,看了很多文章,發覺很多文章都寫了關於如何使用bootstrap table的例子,當然最好的例子還是官網。但是對於某部分技術人員來說,入門還是不夠詳細,故有了下列的文章。希望我的文章能給大家帶來幫助。 bootstrap-table作為常用的TAB ...
  • 原文參考http://mp.weixin.qq.com/s/LijjPErxcFB4pN_wUo2cnw 調用函數時,會創建一個新的執行上下文 它的生命周期有兩個階段1創建階段-創建變數對象,建立作用域鏈,確定this的指向2執行階段-執行代碼,完成變數賦值,函數引用及其他代碼的執行 變數對象的創建 ...
  • 前言 本文大量參考了阮一峰老師的開源教程 "ECMAScript6入門" ,適合新手入門或者對ES6常用知識點進行全面回顧,目標是以較少的篇幅涵蓋ES6及部分ES7在實踐中的絕大多數使用場景。更全面、更深入的請進入上面的教程。如果您覺得有遺漏的常見知識點或者錯誤的地方,請評論指出! 新的變數聲明方式 ...
  • <!DOCTYPE html><html><head><meta charset=”utf-8″><title>Vue第一條信息</title><script src=”js/vue.js”></script></head><body><div id=”app”><p>{{ message }}</ ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...