日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

(转载)Android项目实战(二十八):使用Zxing实现二维码及优化实例

發布時間:2025/3/21 Android 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (转载)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快速集成二維碼掃描功能
Tags: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实现二维码及优化实例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。