(转载)Android项目实战(二十八):使用Zxing实现二维码及优化实例
Android項目實戰(二十八):使用Zxing實現二維碼及優化實例
作者:聽著music睡 字體:[增加?減小] 類型:轉載 時間:2016-11-21?我要評論
這篇文章主要介紹了Android項目實戰(二十八):使用Zxing實現二維碼及優化實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下。前言:
多年之前接觸過zxing實現二維碼,沒想到今日項目中再此使用竟然使用的還是zxing,百度之,竟是如此牛的玩意。
當然,項目中我們也許只會用到二維碼的掃描和生成兩個功能,所以不必下載完整的jar包,使用簡化版的即可,下文可見。
這篇文章講述:
1、如果快速在項目中集成zxing,實現掃描和生成二維碼功能?????????????????
2、根據項目需求去修改源碼實現我們的要求并進行優化
一、快速集成zxing二維碼
1、下載庫文件 :http://xiazai.jb51.net/201611/yuanma/ZXingBarCode_jb51.zip?,
下載完成后可以看到:
我們從這些文件中拷貝需要的到自己的項目中,下面開始:
①、res 目錄下 : raw文件夾 整個復制到個人項目相對位置
②、res --> values目錄下:ids.xml文件中的內容全部復制到個人項目相對位置,個人項目沒有則直接復制文件到相對位置
③、res --> values目錄下:colors.xml文件中的內容全部復制到個人項目的相對位置
④、res --> layout目錄下:camera.xml 布局文件復制到個人項目相對位置
⑤、res --> drawable_mdpi 目錄下:navbar.9.png圖片復制到個人項目相對位置,這張圖片是標題欄背景圖片,這里建議先改成navbar.png 不要使用.9圖片
⑥、libs目錄下:zxing.jar文件復制到個人項目相對位置,并且右鍵點擊as library
⑦、src --> com目錄下:zxing 文件夾復制到個人項目相對位置 ,會報錯,修改R的目錄結構即可
⑧、AndroidManifest.xml文件中 添加 (二維碼掃描activity,這個需要后面自己去修改,用于實現自己的要求)
?| 1 | <activity android:name="com.zxing.activity.CaptureActivity"/> |
⑨、AndroidManifest.xml文件中 添加權限
?| 1 2 3 4 5 | <uses-permission android:name="android.permission.CAMERA" /> ??<uses-permission android:name="android.permission.VIBRATE" /> ??<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> ??<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> |
2、準備工作完成了,下面開始寫demo
現在需求是一個主界面MainActivity.java 里面有兩個按鈕,分別跳轉 生成二維碼界面和 掃描二維碼界面
然后分別開始寫兩個activity功能的實現:
①、 生成二維碼
先寫布局文件? ,一個圖片 , 一個開始生成按鈕 , 一個輸入框(二維碼需要根據文本信息生成,沒有文本信息無法生成)
activity_create.xml
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" ??xmlns:tools="http://schemas.android.com/tools" ??android:layout_width="match_parent" ??android:layout_height="match_parent" ??android:orientation="vertical" ??tools:context="com.maiji.zxingdemo.CreateActivity"> ??<ImageView ????android:id="@+id/create_img" ????android:layout_width="300dp" ????android:layout_height="300dp" ????android:scaleType="fitXY" ????android:layout_gravity="center_horizontal" ????/> ??<Button ????android:id="@+id/create_btn" ????android:layout_width="wrap_content" ????android:layout_height="wrap_content" ????android:layout_gravity="center_horizontal" ????android:text="開始生成二維碼" ????/> ??<EditText ????android:id="@+id/create_edit" ????android:layout_width="match_parent" ????android:layout_height="wrap_content" /> </LinearLayout> |
activity代碼: 代碼比較簡單 ,不在此解釋了
?| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | private ImageView create_img; ??private Button create_btn; ??private EditText create_edit; ??@Override ??protected void onCreate(Bundle savedInstanceState) { ????super.onCreate(savedInstanceState); ????setContentView(R.layout.activity_create); ????initView(); ????initEvent(); ??} ??private void initEvent() { ????create_btn.setOnClickListener(this); ??} ??private void initView() { ????create_img = (ImageView) findViewById(R.id.create_img); ????create_btn = (Button) findViewById(R.id.create_btn); ????create_edit = (EditText) findViewById(R.id.create_edit); ??} ??@Override ??public void onClick(View v) { ????switch (v.getId()){ ??????case R.id.create_btn: ????????String content = "" ; ????????if (create_edit.getText().toString().equals("")){ ??????????Toast.makeText(this,"請輸入二維碼信息",Toast.LENGTH_SHORT).show(); ??????????return; ????????} ????????content = create_edit.getText().toString(); ????????try { ??????????//生成二維碼圖片,第一個參數是二維碼的內容,第二個參數是正方形圖片的邊長,單位是像素 ??????????Bitmap qrcodeBitmap = EncodingHandler.createQRCode(content, 800); ??????????if (qrcodeBitmap!=null) { ????????????create_img.setImageBitmap(qrcodeBitmap); ??????????}else{ ????????????Toast.makeText(this,"生成二維碼失敗",Toast.LENGTH_SHORT).show(); ??????????} ????????} catch (Exception e) { ??????????// TODO Auto-generated catch block ??????????e.printStackTrace(); ????????} ????????break; ????} ??} ??public byte[] Bitmap2Bytes(Bitmap bm) { ????ByteArrayOutputStream baos = new ByteArrayOutputStream(); ????bm.compress(Bitmap.CompressFormat.PNG, 100, baos); ????return baos.toByteArray(); ??} |
效果圖:
②、掃描二維碼
這個就更簡單了,只需要打開一個zxing提供的activity 然后獲取到掃描得到的字符串即可
看ScanActivity(掃描Activity)的關鍵代碼
?| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | private TextView zxing_content; @Override protected void onCreate(Bundle savedInstanceState) { ??super.onCreate(savedInstanceState); ??setContentView(R.layout.activity_scan); ??zxing_content = (TextView) findViewById(R.id.zxing_content); ??Intent startScan = new Intent(this,CaptureActivity.class); ??startActivityForResult(startScan, 0); //實際打開了一個zxing提供給我們的掃描activity,當然我們后面會對這個activity進行一些優化修改 } /** ?* 掃一掃,成功后返回值進行判斷 ?*/ @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { ??super.onActivityResult(requestCode, resultCode, data); ??if (resultCode == -1) { ????String result = data.getExtras().getString("result"); ????zxing_content.setText(result); //顯示掃描二維碼得到的數據 ??} } |
布局文件:
?| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" ??xmlns:tools="http://schemas.android.com/tools" ??android:layout_width="match_parent" ??android:layout_height="match_parent" ??tools:context="com.maiji.zxingdemo.ScanActivity"> ??<TextView ????android:id="@+id/zxing_content" ????android:layout_width="wrap_content" ????android:layout_height="wrap_content" ????android:layout_centerInParent="true" ????android:textSize="30sp" ????/> </RelativeLayout> |
效果圖:
二、修改源碼,實現項目的需求
1、修改掃描二維碼的界面
對應的是 zxing-->activity-->CaptureActivity.java?? ,布局文件為 camera.xml
所以修改界面只需要在 camera.xml文件中修改即可。
無非就是把原來的“CANCEL”取消按鈕去掉,把頂部的標題欄換一下。
布局里面有一個 <SurfaceView>控件 用于顯示相機拍出的畫面預覽,這里可以根據需求改是全界面顯示還是顯示局部
<com.zxing.view.ViewfinderView>控件,即掃描框,默認的是寬高比1:1.5,實際需要修改寬高,在下面介紹
2、修改掃描框的寬高
第1步操作做完之后會發現,我們沒法修改掃描框的寬高。
修改掃描框寬高很簡單,找到 zxing-->camera-->CameraManager.java 文件
這里較為頂部的代碼中看到:
?| 1 2 3 4 | private static final int MIN_FRAME_WIDTH = 240; private static final int MIN_FRAME_HEIGHT = 240; private static final int MAX_FRAME_WIDTH = 480; private static final int MAX_FRAME_HEIGHT = 480; |
這四個屬性的值即掃描框的寬高,然后可以根據需求直接修改,當然這個值在不同分辨率的設備上寬高不一致 , 有需要的話可以進行一下單位轉換
?| 1 2 3 4 | public static int Dp2Px( Context context,float dp) { ?final float scale = context.getResources().getDisplayMetrics().density; ?return (int) (dp * scale + 0.5f); } |
?效果圖: 我修改了掃描框的最小最大寬高分別一致,并且載camera.xml布局中刪去了“CANCEL”取消按鈕
?3、給掃描框添加文字提示
看一下微信的掃描界面,會發現掃描框下面有一段文字提示。 那么我們這里沒有,需要添加
找到zxing-->view-->Viewfinderview.java
這里是自定義掃描框的類
找到代碼:
?| 1 2 3 | canvas.drawRect(frame.left + 2, middle - 1, frame.right - 1, middle + 2, paint); ??Collection<ResultPoint> currentPossible = possibleResultPoints; |
在這兩行代碼之間我們畫上文字提示
?| 1 2 3 4 5 6 7 8 9 10 | canvas.drawRect(frame.left + 2, middle - 1, frame.right - 1, middle + 2, paint); TextPaint textPaint = new TextPaint(); ???textPaint.setARGB(0xFF, 0xFF, 0xFF,0xFF);? //字體顏色 ???textPaint.setTextSize(32);? //字體大小 ???textPaint.setAntiAlias(true); //設置抗鋸齒,否則字跡會很模糊 ???StaticLayout layout = new StaticLayout("將二維碼放入框內,即可自動掃描",textPaint, ???????frame.right-frame.left, Layout.Alignment.ALIGN_NORMAL,1.0F,0.0F,true); ???canvas.translate(frame.left+5, (float) (frame.bottom + (float)30)); //繪制起始位置 ???layout.draw(canvas); Collection<ResultPoint> currentPossible = possibleResultPoints; |
然后在看下掃描界面效果圖:
4、解決掃描界面相機預覽拉伸變形問題
實現了上面幾步的優化,仔細的同學可能會發現,如果我們給SurfaceView設置全屏顯示(可以看到的相機畫面很多),會發現相機拍攝出來的預覽圖有些拉伸變形
原因:zxing橫屏變豎屏之后,Camera的代碼還是采用的橫屏代碼設置的參數
優化方法:找到 zxing-->camera--> CameraConfigurationManager.java
?| 1 2 3 4 5 6 7 8 9 | initFromCameraParameters方法中,在 Log.d(TAG, "Screen resolution: " + screenResolution);這句之后增加 Point screenResolutionForCamera = new Point(); screenResolutionForCamera.x = screenResolution.x; screenResolutionForCamera.y = screenResolution.y; ????? if (screenResolution.x < screenResolution.y) { screenResolutionForCamera.x = screenResolution.y; screenResolutionForCamera.y = screenResolution.x; ?} |
再將cameraResolution = getCameraResolution(parameters, screenResolution);更改為
?| 1 | cameraResolution = getCameraResolution(parameters, screenResolutionForCamera); |
完成之后,在進行掃描操作,這時候相機拍出來的預覽界面就正常顯示,不再有拉伸變形問題。
至此便給項目引入了一個可以使用的二維碼模塊功能了。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
原文鏈接:http://www.cnblogs.com/xqxacm/p/6078729.html
如對本文有疑問,請提交到交流社區,廣大熱心網友會為你解答!!??點擊進入社區
您可能感興趣的文章:
- Android上使用ZXing識別條形碼與二維碼的方法
- Android開發框架之自定義ZXing二維碼掃描界面并解決取景框拉伸問題
- Android基于google Zxing實現各類二維碼掃描效果
- Android基于google Zxing實現二維碼的生成
- Android利用ZXing掃描二維碼的實例代碼解析
- Android基于zxing的二維碼(網格)掃描 仿支付寶網格掃描
- Android中使用ZXing生成二維碼(支持添加Logo圖案)
- Android 基于google Zxing實現二維碼、條形碼掃描,仿微信二維碼掃描效果(推薦)
- Android-Zxing實現二維碼的掃描與生成
- Android實現基于ZXing快速集成二維碼掃描功能
相關文章
- 2016-09-09手把手教你用ViewPager自定義實現Banner輪播
- 2017-02-02Android之側滑菜單DrawerLayout的使用介紹
- 2016-09-09Android Volley圖片加載功能詳解
- 2016-12-12詳解Android6.0運行時權限管理
- 2016-11-11Android AsyncTask 后監聽異步加載完畢的動作詳解
- 2016-02-02以一個著色游戲展開講解Android中區域圖像填色的方法
- 2013-05-05android中知道圖片name時獲取圖片的簡單方法
- 2016-12-12Android 開發仿簡書登錄框可刪除內容或顯示密碼框的內容
- 2017-06-06親自動手編寫Android通用刷新控件
- 2013-01-01Adapter實現ListView帶多選框等狀態的自定義控件的注意事項
轉載于:https://www.cnblogs.com/liupengfei005257/p/7448708.html
總結
以上是生活随笔為你收集整理的(转载)Android项目实战(二十八):使用Zxing实现二维码及优化实例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: bzoj2424 订货
- 下一篇: android sina oauth2.