當前位置:首頁 » 安卓系統 » androidqrcode

androidqrcode

發布時間: 2022-05-07 04:47:20

『壹』 如何保存生成的二維碼圖像 android

得看二維碼生成工具是否有此功能,按理說沒生成一個二維碼應該再其臨時文件目錄里會有的,不同軟體的臨時目錄不同,你可以通過文件瀏覽器找找。另外,有的在線二維碼工具會提供永久保存服務,記住鏈接地址就可以隨時調用,也可保存到(電腦或手機)本地。

『貳』 android開發 如何實現掃描本地二維碼圖片

開源的二維碼掃描庫主要有zxing和zbar,zbar在iPos平台上應用比較成熟,而在Android平台上主流還是用zxing庫,因此這里主要講述如何利用zxing進行二維碼開發。

  • 如何將zxing的Android源碼導入工程。

    • 在導入zxing的android源碼之前,先去官方下載zxing的源碼http://code.google.com/p/zxing/downloads/list。

    • 這里以1.6版本為例,zxing 1.6源碼結構如下:


      <?xmlversion="1.0"encoding="utf-8"?>
      <manifestxmlns:android="http://schemas.android.com/apk/res/android"
      package="com.qrcode"
      android:versionCode="1"
      android:versionName="1.0">
      <uses-sdkandroid:minSdkVersion="7"/>

      <uses-permissionandroid:name="android.permission.VIBRATE"/><!--震動許可權-->
      <uses-permissionandroid:name="android.permission.CAMERA"/>
      <uses-featureandroid:name="android.hardware.camera"/><!--使用照相機許可權-->
      <uses-featureandroid:name="android.hardware.camera.autofocus"/><!--自動聚焦許可權-->
      <applicationandroid:icon="@drawable/icon"android:label="@string/app_name">
      <activityandroid:name=".MainActivity"
      android:label="@string/app_name">
      <intent-filter>
      <actionandroid:name="android.intent.action.MAIN"/>
      <categoryandroid:name="android.intent.category.LAUNCHER"/>
      </intent-filter>
      </activity>

      <!--隱藏鍵盤--><!--全屏-->
      <activity
      android:configChanges="orientation|keyboardHidden"
      android:name="com.zxing.activity.CaptureActivity"
      android:screenOrientation="portrait"
      android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
      android:windowSoftInputMode="stateAlwaysHidden">
      </activity>
      </application>
      </manifest>

    • 這種情況大致就可以實現二維碼掃描了,想細化的話,還可以多看看安卓二維碼掃描開發相關的教程

『叄』 android 二維碼掃描的原理是什麼

你好!具體的我不懂怎麼講,就相當於商品的身份證,二維碼不容易仿冒。你看看下面的介紹吧。。。網路找到的。
什麼是條碼技術?
條形碼,簡稱「條碼」,是由一組黑白相間、寬度不同的條狀符號組成。
條碼技術是研究如何把計算機所需要的數據表示成條碼形式,和如何將條碼表示的數據和符號轉變為計算機可以自動採集、識別的數據。因而,條碼技術就包括從編碼到製作、識讀、處理等一系列技術。
根據不同的編碼規則,提出的編碼方案已經有多達四十餘種,目前應用最為廣泛的有:交叉二五碼、三九碼、UPC碼、EAN碼、128碼等。
從印製條形碼的材料、顏色分類,可分黑白條形碼、彩色條形碼、發光條形碼(熒光條形碼、磷光條形碼)和磁性條形碼等。
近年來又出現了按矩陣方式或堆棧方式排列信息的二維條形碼。
我國的適用標准:一維條碼通用商品條碼是與EAN碼等效,二維條碼是與PDF417兼容的碼制。
條形碼有什麼優點?
A.輸入速度快:與鍵盤輸入相比,條碼輸入的速度是鍵盤輸入的5倍,並且能實現"即時數據輸入"。
B.可靠性高:鍵盤輸入數據出錯率為三百分之一,利用光學字元識別技術出錯率為萬分之一,而採用條碼技術誤碼率低於百萬分之一。
C.採集信息量大:利用傳統的一維條碼一次可採集幾十位字元的信息,二維條碼更可以攜帶數千個字元的信息,並有一定的自動糾錯能力。
D.靈活實用:條碼標識既可以作為一種識別手段單獨使用,也可以和有關識別設備組成一個系統實現自動化識別,還可以和其他控制設備聯接起來實現自動化管理。
另外,條碼標簽易於製作,對設備和材料沒有特殊要求,識別設備操作容易,不需要特殊培訓,且設備也相對便宜。
條形碼的應用領域
倉庫管理系統(商品、庫位標識)
在工業中的應用(零部件標識,過程式控制制,信息傳遞等)
辦公室自動化管理(固定資產管理,門衛、考勤管理等)
還可以用於如,圖書管理、商場管理、血庫管理、郵電管理、海關報關單管理等等。
一維條碼的結構與組成
我國採用的一維條碼是通用商品條碼,採用EAN條碼結構。EAN條碼是國際上通用的通用商品代碼。我國主版是由13位數字及相應的條碼符號組成,在較小的商品上也採用8位數字碼及其相應的條碼符號。
每個條碼的組成可分為:
1.前綴碼。由三位數字組成,是國家的代碼,我國為690,是國際物品編碼會統一決定的。
2.製造廠商代碼。由四位數字組成,我國物品編碼中心統一分配並統一注冊,一廠一碼。
3商品代碼。由五位數字組成,表示每個製造廠商的商品,由廠商確定,可標識十萬種商品。
4.校驗碼。由一位數字組成,用以校驗前面各碼的正誤。
一維條碼的特點
條形碼符號圖形結構簡單;
每個條形碼字元由一定的條符組成,佔有一定的寬度和印製面積;
每種編碼方案均有自己的字元集;
每種編碼方案與對應的閱讀裝置的性能要求密切配合。一維條碼的容量多數一維條碼所能表示的字元集不過是10個數字,26個英文字母及一些特殊字元。條碼字元集最大的Code l28條碼,所能表示的字元個數也不過是128個ASCII符。什麼是二維條碼?二維條碼能夠在橫向和縱向兩個方位同時表達信息,因此能在很小的面積內表達大量的信息。二維條碼可以分為堆疊式二維條碼和矩陣式二維條碼。堆疊式二維條碼形態上是由多行短截的一維條碼堆疊而成;矩陣式二維條碼以矩陣的形式組成,在矩陣相應元素位置上用「點」表示二進制「1」,用「空」表示二進制「0」,由「點」和「空」的排列組成代碼。堆疊式二維條碼,有代表性的包括PDF417、Code 49、Code 16K等。矩陣式二維條碼有代表性的是Code one、Aztec、Date Matrix、QR碼等。二維條碼的特點1.高密度編碼,信息容量大:可容納多達1850個大寫字母或2710個數字或1108個位元組,或500多個漢字,比普通條碼信息容量約高幾十倍。2.編碼范圍廣:該條碼可以把圖片、聲音、文字、簽字、指紋等可以數字化的信息進行編碼,用條碼表示出來;可以表示多種語言文字;可表示圖像數據。3.容錯能力強,具有糾錯功能:這使得二維條碼因穿孔、污損等引起局部損壞時,照樣可以正確得到識讀,損毀面積達50%仍可恢復信息。4.解碼可靠性高:它比普通條碼解碼錯誤率百萬分之二要低得多,誤碼率不超過千萬分之一。5.可引入加密措施:保密性、防偽性好6.成本低,易製作,持久耐用7.條碼符號形狀、尺寸大小比例可變8.二維條碼可以使用激光或CCD閱讀器識讀。

『肆』 android怎樣生成條碼和二維碼

一、問題描述 在開發中需要將信息轉換為二維碼存儲並要求帶有公司的logo,我們知道Google的Zxing開源項目就很好的幫助我們實現條形碼、二維碼的生成和解析,但帶有logo的官網並沒有提供demo,下面就通過實例看看如何實現以及Zxing的使用。 二、案例介紹 1、案例運行效果 2、案例准備工作 在項目中加入jar,只需加入core/zxing/zxing/ 三、Zxing主要組件 1、BarcodeFormat 定義了不同的二進制編碼方式,取值如下 EAN_13條形碼,共計13位代碼,比較常見,如商品上的包裝上的都是這種條形碼 CODE_QR二維碼(矩陣碼),比條形碼存在更多信息,當下比較流行 CODE_128條形碼 可表示可表示從 ASCII 0 到ASCII 127 共128個字元,用於企業管理,生產流程式控制制 CODE_39條形碼,編制簡單只接受如下43個字元 2、MultiFormatWriter 主要包含一個 encode()方法,可實現產生編碼(條形、二維碼) BitMatrix encode(String contents, BarcodeFormat format, int width, int height,Hashtable hints)方法 參數: contents:要編碼的內容 format:編碼格式(條形、二維) width,height:生成碼的大小 hints:包含EncodeHintType(編碼提示類型)信息的集合,主要設置字元編碼,比如支持漢字的utf-8,如下: Hashtable hst = new Hashtable(); hst.put(EncodeHintType.CHARACTER_SET, “UTF-8″); 返回值:BitMatrix 二維矩陣點 3、BitMatrix BitMatrix :表現為一個二維矩陣,x表示列的位置,y表示行的位置,循序從左上角開始,一列一列排列(先x後y) 主要方法: getWidth():返回矩陣的寬度 getHeight():返回矩陣的高度 boolean get(x,y) :非常重要的方法,實現根據給定的x,y判斷該位置是否有黑塊 在產生二維碼的應用中就是通過這個方法進行判斷,然後把有黑塊的點記錄下來,使用Bitmap的setPixels()方法生成圖形,詳解案例的createCode()方法中的代碼 四、完整代碼 public class MainActivity extends Activity { private EditText etCompany; private EditText etPhone; private EditText etEmail; private EditText etWeb; private Bitmap logo; private static final int IMAGE_HALFWIDTH = 40;//寬度值,影響中間圖片大小 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //獲得資源圖片,可改成獲取本地圖片或拍照獲取圖片 logo=BitmapFactory.decodeResource(super.getResources(),R.drawable.y014); etCompany =(EditText) findViewById(R.id.etCompany); etPhone=(EditText) findViewById(R.id.etPhone); etEmail =(EditText) findViewById(R.id.etEmail); etWeb =(EditText) findViewById(R.id.etWeb); findViewById(R.id.but).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub String company=etCompany.getText().toString().trim() ; String phone =etPhone .getText().toString().trim() ; String email = etEmail.getText().toString().trim() ; String web = etWeb.getText().toString().trim() ; //二維碼中包含的文本信息 String contents= "BEGIN:VCARD/nVERSION:3.0/nORG:"+company+"/nTEL:"+phone+"/nURL:"+web+"/nEMAIL:"+email+"/nEND:VCARD"; try { //調用方法createCode生成二維碼 Bitmap bm=createCode(contents,logo,BarcodeFormat.QR_CODE); ImageView img=(ImageView)findViewById(R.id.imgCode) ; //將二維碼在界面中顯示 img.setImageBitmap(bm); } catch (WriterException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); } /** * 生成二維碼 * @param string 二維碼中包含的文本信息 * @param mBitmap logo圖片 * @param format 編碼格式 * @return Bitmap 點陣圖 * @throws WriterException */ public Bitmap createCode(String string,Bitmap mBitmap, BarcodeFormat format) throws WriterException { Matrix m = new Matrix(); float sx = (float) 2 * IMAGE_HALFWIDTH / mBitmap.getWidth(); float sy = (float) 2 * IMAGE_HALFWIDTH / mBitmap.getHeight(); m.setScale(sx, sy);//設置縮放信息 //將logo圖片按martix設置的信息縮放 mBitmap = Bitmap.createBitmap(mBitmap, 0, 0, mBitmap.getWidth(), mBitmap.getHeight(), m, false); MultiFormatWriter writer = new MultiFormatWriter(); Hashtable hst = new Hashtable(); hst.put(EncodeHintType.CHARACTER_SET, "UTF-8");//設置字元編碼 BitMatrix matrix = writer.encode(string, format, 400, 400, hst);//生成二維碼矩陣信息 int width = matrix.getWidth();//矩陣高度 int height = matrix.getHeight();//矩陣寬度 int halfW = width / 2; int halfH = height / 2; int[] pixels = new int[width * height];//定義數組長度為矩陣高度*矩陣寬度,用於記錄矩陣中像素信息 for (int y = 0; y < height; y++) {//從行開始迭代矩陣 for (int x = 0; x < width; x++) {//迭代列 if (x > halfW - IMAGE_HALFWIDTH && x < halfW + IMAGE_HALFWIDTH && y > halfH - IMAGE_HALFWIDTH && y < halfH + IMAGE_HALFWIDTH) {//該位置用於存放圖片信息 //記錄圖片每個像素信息 pixels[y * width + x] = mBitmap.getPixel(x - halfW + IMAGE_HALFWIDTH, y - halfH + IMAGE_HALFWIDTH); } else { if (matrix.get(x, y)) {//如果有黑塊點,記錄信息 pixels[y * width + x] = 0xff000000;//記錄黑塊信息 } } } } Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); // 通過像素數組生成bitmap bitmap.setPixels(pixels, 0, width, 0, 0, width, height); return bitmap; } }

『伍』 android 二維碼掃描的時候,二維碼和屏幕的二位碼垂直,不一致,怎麼辦

CameraConfigurationManager 這個類 setDesiredCameraParameters 這個方法下if (toInt(android.os.Build.VERSION.SDK, DEFAULT_VERSION_VALUE) > 8) camera.setDisplayOrientation(90); // 設置相機角度 /** * 字元串轉整數 * * @param str * @param defValue * @return */ public static int toInt(String str, int defValue) { try { return Integer.parseInt(str); } catch (Exception e) { } return defValue; }

『陸』 android如何將一個字元串生成二維碼

二維碼應用有一個很有名的開源項目ZXing。從它的官網下載Demo,我們需要的是~\ZXingDemo\libs\zxing.jar,這是ZXing的庫,開始!
首先是AndroidMainfest.xml,要注冊activity:
<activity android:name="com.cleaderwin.home.dp." />

還要有相關操作許可權:
<uses-permission android:name="android.permission.INTERNET" >
</uses-permission>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" >
</uses-permission>
<uses-permission android:name="android.permission.CAMERA" >
</uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
</uses-permission>

然後是.xml:
<ImageView
android:id="@+id/imageView"
android:layout_width="200dp"
android:layout_height="200dp"
android:layout_gravity="center"/>

剩下VideoActivity:
import java.util.Hashtable;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;

public class VideoActivity extends Activity {
private int QR_WIDTH;
private int QR_HEIGHT;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_video);
createQRImage("http://www..com");
}
}

// 要轉換的地址或字元串,可以是中文
public void createQRImage(String url) {
ImageView img = (ImageView)findViewById(R.id.imageView);
QR_WIDTH = 300;
QR_HEIGHT = 300;
// 判斷URL合法性
if (url == null || "".equals(url) || url.length() < 1) {
return;
}
Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
// 圖像數據轉換,使用了矩陣轉換
BitMatrix bitMatrix = null;
try {
bitMatrix = new QRCodeWriter().encode(url, BarcodeFormat.QR_CODE, QR_WIDTH, QR_HEIGHT, hints);
} catch (WriterException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
int[] pixels = new int[QR_WIDTH * QR_HEIGHT];
// 下面這里按照二維碼的演算法,逐個生成二維碼的圖片,
// 兩個for循環是圖片橫列掃描的結果
for (int y = 0; y < QR_HEIGHT; y++) {
for (int x = 0; x < QR_WIDTH; x++) {
if (bitMatrix.get(x, y)) {
pixels[y * QR_WIDTH + x] = 0xff000000;
} else {
pixels[y * QR_WIDTH + x] = 0xffffffff;
}
}
}
// 生成二維碼圖片的格式,使用ARGB_8888
Bitmap bitmap = Bitmap.createBitmap(QR_WIDTH, QR_HEIGHT, Bitmap.Config.ARGB_8888);
bitmap.setPixels(pixels, 0, QR_WIDTH, 0, 0, QR_WIDTH, QR_HEIGHT);
// 顯示到一個ImageView上面
img.setImageBitmap(bitmap);
}
}

『柒』 在android中怎麼識別二維碼

用開源框架 Zxing

我這有個demo


『捌』 Android二維碼識別源碼,可有多種實現方式

這里簡單介紹一下ZXing庫。ZXing是一個開放源碼的,用Java實現的多種格式的1D/2D條碼圖像處理庫,它包含了聯繫到其他語言的埠。Zxing可以實現使用手機的內置的攝像頭完成條形碼的掃描及解碼。該項目可實現的條形碼編碼和解碼。目前支持以下格式:UPC-A,UPC-E、EAN-8,EAN-13、39碼、93碼。ZXing是個很經典的條碼/二維碼識別的開源類庫,以前在功能機上,就有開發者使用J2ME運用ZXing了,不過要支持JSR-234規范(自動對焦)的手機才能發揮其威力。
下面是ZXing的demo運行,我這里創建了一個二維碼,內容是我博客的網址,大夥可以用微信的掃一掃功能,試一下。就可以直接打開我博客。

2、ZXing庫主要類
下面給大家介紹一下,ZXing庫裡面主要的類以及這些類的作用:
CaptureActivity。這個是啟動Activity 也就是掃描器。
CaptureActivityHandler 解碼處理類,負責調用另外的線程進行解碼。
DecodeThread 解碼的線程。
com.google.zxing.client.android.camera 包,攝像頭控制包。
ViewfinderView 自定義的View,就是我們看見的拍攝時中間的框框了。

3、使用ZXing生成二維碼
下面針對二維碼生成和解析做個簡單介紹,至於詳細的使用方法,建議大家還是自己看看源碼,使用起來很簡單,不過這個開源項目的代碼,值得好好看看。首先給出二維碼生成的方法:
View Code
上面就是二維碼生成的方法介面,如果你只是使用者方法,很簡單,只要傳入一個URL即可,就像我截圖裡面一樣,傳入一個合法的網址即可。或者像現在一些移動APP的推廣,把APP下載地址轉為二維碼,只要掃一下就可以下載相應的APP。這個也是目前比較流行的APP的推廣方式。
上面代碼做的事情不多,主要是調用ZXing庫裡面QRCodeWriter().encode的方法對我們傳進去的URL進行編碼,具體如何編碼,這個我這里就不詳細說,有興趣可以看ZXing的源碼。文章最後會給出ZXing的源碼和例子代碼。

4、掃描二維碼獲取信息
掃描獲取二維碼信息的工作稍微復雜一些,主要是需要編寫Camera的使用,這個跟我們一般使用Camera一樣,需要使用Surfaceview作為預覽,這一部我這里就不說了,這個應該不是太復雜。對於使用過Camera做預覽的朋友,應該是挺簡單的事情。獲取二維碼數據的關鍵處理是在Camera的自動對焦回調函數哪裡,調用ZXing的解碼介面。
View Code
這里稍微多說一句,由於解碼需要一定時間,所以ZXing的解碼調用,都是使用了Handler作為線程通信機制,解碼的工作都是放在獨立線程裡面使用的,如果你直接在主線程解碼,恐怕ANR問題是避免不了。
View Code
上面是解碼的線程處理不同狀態的時候需要注意的地方,我們這里只看獲取圖像成功的地方,成功獲取圖片解碼的實在DecodeThread裡面實現,DecodeThread裡面解碼成功後,會把數據序列化,然後保存到Bundle裡面,我們可以直接通過Bundle的序列化,獲取到圖片數據。同時會把解碼後的結果保存到MSG裡面,然後就可以根據實際情況進行處理,例如上面代碼,解碼成功後,會調用一個處理函數:
View Code
上面就是整個二維碼的解碼流程,裡面因為涉及很多Camera的使用,所以你如果需要使用二維碼識別,需要注意一下你的程序需要申請下面的許可權,一般的Camera使用以及Camera的自動對焦等。
View Code
5、結語
上面就是生成和識別二維碼的關鍵流程和代碼,有興趣的朋友可以自己查看ZXing的源碼,裡面有很多圖像分析的知識可以學習。具體使用也可以參考我下面給出的Demo。二維碼對於現在移動開發來說很是很常用的技術,所以有空可以了解一下,說不定什麼時候就用上了。另外,ZXing庫除了二維碼外,其實對於條形碼也是支持的,只是我這里沒有介紹。有需要的自己去看看源碼即可。
轉載

『玖』 android 二維碼掃描 有哪些

這里簡單介紹一下ZXing庫。ZXing是一個開放源碼的,用Java實現的多種格式的1D/2D條碼圖像處理庫,它包含了聯繫到其他語言的埠。Zxing可以實現使用手機的內置的攝像頭完成條形碼的掃描及解碼。該項目可實現的條形碼編碼和解碼。目前支持以下格式:UPC-A,UPC-E、EAN-8,EAN-13、39碼、93碼。ZXing是個很經典的條碼/二維碼識別的開源類庫,以前在功能機上,就有開發者使用J2ME運用ZXing了,不過要支持JSR-234規范(自動對焦)的手機才能發揮其威力。
下面是ZXing的demo運行,我這里創建了一個二維碼,內容是我博客的網址,大夥可以用微信的掃一掃功能,試一下。就可以直接打開我博客。

『拾』 Android 二維碼掃描怎樣實現第二次掃描

首先看一下掃描界面

CaptureCodeActivity.java代碼:

packagecom.haier.qr.code;

importjava.io.IOException;
importjava.io.Serializable;
importjava.util.Map;
importjava.util.Vector;

importandroid.app.Activity;
importandroid.app.AlertDialog;
importandroid.content.DialogInterface;
importandroid.content.DialogInterface.OnCancelListener;
importandroid.content.DialogInterface.OnClickListener;
importandroid.content.Intent;
importandroid.graphics.Bitmap;
importandroid.os.Bundle;
importandroid.os.Handler;
importandroid.text.TextUtils;
importandroid.util.Log;
importandroid.view.SurfaceHolder;
importandroid.view.SurfaceHolder.Callback;
importandroid.view.SurfaceView;
importandroid.view.View;
importandroid.view.Window;
importandroid.view.WindowManager;
importandroid.widget.Toast;

importcom.google.zxing.BarcodeFormat;
importcom.google.zxing.DecodeHintType;
importcom.google.zxing.Result;
importcom.haier.cabinet.customer.R;
importcom.haier.cabinet.customer.activity.DeliveryBoxListActivity;
importcom.haier.common.util.AppToast;
importcom.haier.qr.code.zxing.camera.CameraManager;
importcom.haier.qr.code.zxing.decoding.CaptureActivityHandler;
importcom.haier.qr.code.zxing.decoding.FinishListener;
importcom.haier.qr.code.zxing.decoding.InactivityTimer;
importcom.haier.qr.code.zxing.view.ViewfinderView;

/**
*Initialthecamera
*
*@authorjdsjlzx
*/
,View.OnClickListener{

privatestaticfinalStringTAG=CaptureCodeActivity.class
.getSimpleName();

;
;
;
privatebooleanhasSurface;
privateMap<DecodeHintType,?>decodeHints;
privateVector<BarcodeFormat>decodeFormats;
privateStringcharacterSet;
;
;
/**
*聲音震動管理器。如果掃描成功後可以播放一段音頻,也可以震動提醒,可以通過配置來決定掃描成功後的行為。
*/
privateBeepManagerbeepManager;

/**
*閃光燈調節器。自動檢測環境光線強弱並決定是否開啟閃光燈
*/
;

(){
returncameraManager;
}

/**.*/
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
Windowwindow=getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
setContentView(R.layout.activity_capture);

hasSurface=false;
inactivityTimer=newInactivityTimer(this);

beepManager=newBeepManager(this);
ambientLightManager=newAmbientLightManager(this);

//按鈕監聽事件
findViewById(R.id.capture_flashlight).setOnClickListener(this);
}

@Override
protectedvoidonResume(){
super.onResume();
Log.d(TAG,"onResume");
cameraManager=newCameraManager(getApplication());
viewfinderView=(ViewfinderView)findViewById(R.id.viewfinder_view);
viewfinderView.setCameraManager(cameraManager);
viewfinderView.setVisibility(View.VISIBLE);

SurfaceViewsurfaceView=(SurfaceView)findViewById(R.id.preview_view);
SurfaceHoldersurfaceHolder=surfaceView.getHolder();
if(hasSurface){
initCamera(surfaceHolder);
}else{
//防止sdk8的設備初始化預覽異常
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

//()toinitthe
//camera.
surfaceHolder.addCallback(this);
}
decodeFormats=null;
characterSet=null;

//載入聲音配置,其實在BeemManager的構造器中也會調用該方法,即在onCreate的時候會調用一次
beepManager.updatePrefs();

//啟動閃光燈調節器
ambientLightManager.start(cameraManager);

//恢復活動監控器
inactivityTimer.onResume();


}


@Override
protectedvoidonPause(){
Log.d(TAG,"onPause");
if(handler!=null){
handler.quitSynchronously();
handler=null;
}
inactivityTimer.onPause();
ambientLightManager.stop();
beepManager.close();

//關閉攝像頭
cameraManager.closeDriver();
if(!hasSurface){
SurfaceViewsurfaceView=(SurfaceView)findViewById(R.id.preview_view);
SurfaceHoldersurfaceHolder=surfaceView.getHolder();
surfaceHolder.removeCallback(this);
}
super.onPause();
}

@Override
protectedvoidonDestroy(){
inactivityTimer.shutdown();
super.onDestroy();
}

/**
*Avalidbarcodehasbeenfound,
*theresults.
*
*@paramrawResult
*Thecontentsofthebarcode.
*@paramscaleFactor
*
*@parambarcode
*.
*/
publicvoidhandleDecode(ResultrawResult,Bitmapbarcode,floatscaleFactor){
Log.d(TAG,"handleDecode");
inactivityTimer.onActivity();

beepManager.playBeepSoundAndVibrate();

StringresultString=rawResult.getText();
if(TextUtils.isEmpty(resultString)){
Toast.makeText(CaptureCodeActivity.this,"Scanfailed!",
Toast.LENGTH_SHORT).show();
}else{
//掃碼完成,處理結果(跳轉到箱子列表)
/*IntentresultIntent=newIntent();
Bundlebundle=newBundle();
bundle.putString("result",resultString);
bundle.putParcelable("bitmap",barcode);
resultIntent.putExtras(bundle);
this.setResult(RESULT_OK,resultIntent);*/
StringterminalNo=getIntent().getStringExtra("terminal_no");
if(resultString.equals(terminalNo)){
AppToast.makeToast(this,"確認成功!");
Intentintent=newIntent(this,DeliveryBoxListActivity.class);
intent.putExtra("terminal_no",terminalNo);
intent.putExtra("box_list",(Serializable)getIntent().getSerializableExtra("box_list"));
startActivity(intent);
CaptureCodeActivity.this.finish();
}else{
/*AppToast.makeToast(this,"確認失敗,請重新掃描確認");*/
showErrorDialog();
}

}

}

privatevoidinitCamera(SurfaceHoldersurfaceHolder){
if(surfaceHolder==null){
thrownewIllegalStateException("NoSurfaceHolderprovided");
}
if(cameraManager.isOpen()){
Log.w(TAG,
"initCamera()whilealreadyopen--lateSurfaceViewcallback?");
return;
}
try{
cameraManager.openDriver(surfaceHolder);
//,whichcanalsothrowa
//RuntimeException.
if(handler==null){
handler=newCaptureActivityHandler(this,decodeFormats,
decodeHints,characterSet,cameraManager);
}

}catch(IOExceptionioe){
Log.w(TAG,ioe);
();
}catch(RuntimeExceptione){
//:
//java.?lang.?RuntimeException:Failtoconnecttocameraservice
Log.w(TAG,"",e);
();
}
}

privatevoid(){
AlertDialog.Builderbuilder=newAlertDialog.Builder(this);
builder.setTitle(getString(R.string.app_name));
builder.setMessage(getString(R.string.msg_camera_framework_bug));
builder.setPositiveButton(android.R.string.yes,newFinishListener(this));
builder.setOnCancelListener(newFinishListener(this));
builder.show();
}

@Override
publicvoidsurfaceChanged(SurfaceHolderholder,intformat,intwidth,
intheight){

}

@Override
publicvoidsurfaceCreated(SurfaceHolderholder){
if(holder==null){
Log.e(TAG,
"***WARNING***surfaceCreated()gaveusanullsurface!");
}
if(!hasSurface){
hasSurface=true;
initCamera(holder);
}

}

@Override
publicvoidsurfaceDestroyed(SurfaceHolderholder){
hasSurface=false;

}

(){
returnviewfinderView;
}

publicHandlergetHandler(){
returnhandler;
}

publicvoiddrawViewfinder(){
viewfinderView.drawViewfinder();

}

@Override
publicvoidonClick(Viewv){
switch(v.getId()){

caseR.id.capture_flashlight:
if(isFlashlightOpen){
cameraManager.setTorch(false);//關閉閃光燈
isFlashlightOpen=false;
}
else{
cameraManager.setTorch(true);//打開閃光燈
isFlashlightOpen=true;
}
break;
default:
break;
}
}

privatevoidshowErrorDialog(){
closeCamera();
viewfinderView.setVisibility(View.GONE);
AlertDialog.Builderbuilder=newAlertDialog.Builder(this);
builder.setTitle(getString(R.string.app_name));
builder.setMessage("掃描確認出錯,請重新掃描二維碼!");
builder.setPositiveButton(android.R.string.ok,newOnClickListener(){

@Override
publicvoidonClick(DialogInterfacedialog,intwhich){
restartCamera();
}
});
builder.setOnCancelListener(newOnCancelListener(){

@Override
publicvoidonCancel(DialogInterfacedialog){
CaptureCodeActivity.this.finish();
}
});
builder.show();
}

voidrestartCamera(){
Log.d(TAG,"hasSurface"+hasSurface);

viewfinderView.setVisibility(View.VISIBLE);

SurfaceViewsurfaceView=(SurfaceView)findViewById(R.id.preview_view);
SurfaceHoldersurfaceHolder=surfaceView.getHolder();
initCamera(surfaceHolder);

//恢復活動監控器
inactivityTimer.onResume();
}

voidcloseCamera(){
if(handler!=null){
handler.quitSynchronously();
handler=null;
}
inactivityTimer.onPause();

//關閉攝像頭
cameraManager.closeDriver();
}

}

在掃描出現問題事彈出dialog,當用戶點擊確定按鈕後重新開始掃描。


privatevoidshowErrorDialog(){
closeCamera();
viewfinderView.setVisibility(View.GONE);
AlertDialog.Builderbuilder=newAlertDialog.Builder(this);
builder.setTitle(getString(R.string.app_name));
builder.setMessage("掃描確認出錯,請重新掃描櫃子上的二維碼!");
builder.setPositiveButton(android.R.string.ok,newOnClickListener(){

@Override
publicvoidonClick(DialogInterfacedialog,intwhich){
restartCamera();
}
});
builder.setOnCancelListener(newOnCancelListener(){

@Override
publicvoidonCancel(DialogInterfacedialog){
CaptureCodeActivity.this.finish();
}
});
builder.show();
}
熱點內容
分布式緩存部署步驟 發布:2025-05-14 13:24:51 瀏覽:610
php獲取上一月 發布:2025-05-14 13:22:52 瀏覽:89
購買雲伺服器並搭建自己網站 發布:2025-05-14 13:20:31 瀏覽:688
sqlserver建立視圖 發布:2025-05-14 13:11:56 瀏覽:484
搭建httpsgit伺服器搭建 發布:2025-05-14 13:09:47 瀏覽:255
新電腦拿回來我該怎麼配置 發布:2025-05-14 13:09:45 瀏覽:240
視頻伺服器新建ftp用戶 發布:2025-05-14 13:03:09 瀏覽:225
php花生 發布:2025-05-14 12:54:30 瀏覽:550
java人才 發布:2025-05-14 12:29:10 瀏覽:649
如何打開軟密碼 發布:2025-05-14 12:28:55 瀏覽:427