頻道欄目
首頁 > 資訊 > 其他 > 正文

Github項目解析(十)--)幾行代碼快速集成二維碼掃描庫

16-07-28        來源:[db:作者]  
收藏   我要投稿

上一篇文章中我們講解了activity切換動畫相關的知識點,這里的切換動畫指的是是activity跳轉時的動畫效果。在上一篇文章中我們總結了有五種方式實現activity切換時實現動畫效果。并且依次的介紹一下每種實現activity切換動畫效果的實現方式,以及效果。

而本文將講解一下我最近寫的一個快速集成二維碼掃描庫,這里需要說明的是其核心的實現掃描的功能,是通過調用ZXing庫實現的。內部App中使用到了二維碼掃描功能,但是網上找了一些關于二維碼掃描的例子,只是我在集成的時候發現通過android studio集成zxing二維碼庫不是特別方便,由于我就有了將其制作成標準庫的想法,也就有了本文即快速集成二維碼掃描庫。

本文的項目地址是在:android-zxingLibrary,歡迎star和follow。

使用方式:

集成默認的二維碼掃描頁面

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

在module的build.gradle中執行compile操作
compile 'cn.yipianfengye.android:zxing-library:1.1'
在代碼中執行打開掃描二維碼界面操作
/**
         * 打開默認二維碼掃描界面
         */
        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方法中接收掃描結果
@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == REQUEST_CODE) {
            //處理掃描結果(在界面上顯示)
            if (null != data) {
                Bundle bundle = data.getExtras();
                if (bundle == null) {
                    return;
                }
                String result = bundle.getString("result");
                Toast.makeText(this, "result:" + result, 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布局文件

<framelayout android:id="@+id/activity_second" android:layout_height="match_parent" android:layout_width="match_parent" xmlns:android="http://schemas.android.com/apk/res/android"></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布局文件的實現。


<framelayout android:layout_height="fill_parent" android:layout_width="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto">

    

    

</framelayout>

上面我們自定義的掃描控件的布局文件,下面我們看一下默認的掃描控件的布局文件:


<framelayout android:layout_height="fill_parent" android:layout_width="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto">

    

    

</framelayout>

可以發現其主要的區別就是在自定義的掃描控件中多了三個自定義的掃描框屬性:inner_width、inner_height和inner_margintop,通過這三個屬性可以控制掃描框的相對位置。

執行效果

這里寫圖片描述

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

創建二維碼庫的流程:

創建一個android studio項目,并創建zxingLibrary庫;

這里寫圖片描述

在zxingLibrary庫中實現二維碼的掃描操作;

在實現過程中有以下幾個注意點:

(1)由于二維碼掃描界面是一個Activity,所以需要在AndroidManifest.xml中定義,而我為了減少對項目的依賴,選擇了在zxingLibrary中的AndroidManifest.xml中定義該Activity。



        
    

(2)由于掃描操作需要使用攝像頭等權限,也在zxingLibrary中的AndroidManifest.xml中申請了部分權限:


    

    
    

    
    
    
    

(3)原來的項目中二維碼掃面的部分是作為主項目實現的,部分代碼使用了switch(id)的操作,而這樣的代碼在library中有問題,所以我做了修改:

修改之前:

@Override
  public void handleMessage(Message message) {
    switch (message.what) {
      case R.id.decode:
        decode((byte[]) message.obj, message.arg1, message.arg2);
        break;
      case R.id.quit:
        Looper.myLooper().quit();
        break;
    }
  }

修改之后:

@Override
  public void handleMessage(Message message) {
    if (message.what == R.id.decode) {
      decode((byte[]) message.obj, message.arg1, message.arg2);
    } else if (message.what == R.id.quit) {
      Looper.myLooper().quit();
    }
  }
將zxingLibrary庫上傳至Jcenter中

為了使用compile,所以講zxingLibrary庫上傳至了jCenter中

總結:

以上就是我實現的這個快速繼承二維碼掃描庫的過程。主要優點就是可以通過android studio快速的繼承到我們的項目中,有興趣的同學可以到github上看一下具體實現。項目地址:android-zxingLibrary

相關TAG標簽
上一篇:臺積電:絕大多數7nm客戶都會轉向6nm_IT新聞_博客園
下一篇:最后一頁
相關文章
圖文推薦

關于我們 | 聯系我們 | 廣告服務 | 投資合作 | 版權申明 | 在線幫助 | 網站地圖 | 作品發布 | Vip技術培訓 | 舉報中心

版權所有: 紅黑聯盟--致力于做實用的IT技術學習網站

美女MM131爽爽爽毛片