Android整合二維碼掃描功能,android整合

來源:互聯網
上載者:User

Android整合二維碼掃描功能,android整合

文章轉載自  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();                }            }        }

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

執行效果:

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

  • 整合對二維碼圖片的解析功能

  • 調用系統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();                }            }

執行效果

有了預設的二維碼掃描介面,也有了對二維碼圖片的解析,可能有的同學會說如果我想定製化顯示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:

執行效果

當然了如果以上的以上,你還是對定製化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);            }        });
  • 執行效果

  • 支援控制閃光燈
/** * 開啟閃光燈 */CodeUtils.isLightEnable(true);/** * 關閉閃光燈 */ CodeUtils.isLightEnable(false);

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.