一般Camera調(diào)用open以及startPreview需要確保不多次調(diào)用, 如果Camera.open(); 或者camera.startPreview();連續(xù)調(diào)用了多次,將可能會發(fā)生 java.lang.RuntimeException: startPreview failed;
可以使用boolean 全局變量來記錄當(dāng)前camera的狀態(tài)。來保證這一點(diǎn)。 private void initCamera() { if (!isView) { camera = Camera.open(); } if (camera != null && !isView) { try { Camera.Parameters myParameters = camera.getParameters(); myParameters.setPictureFormat(ImageFormat.JPEG); camera.setParameters(myParameters); camera.setPreviewDisplay(holder); camera.startPreview(); } catch (IOException e) { e.printStackTrace(); } isView = true; }
} 摘自:http://blog.csdn.net/davidbeckham2901/article/details/7696497 1 https://code.google.com/p/zxing/ 下載庫 android平臺所需文件為 android code(因?yàn)橐獙W(xué)習(xí)所以沒有打jar包直接用源碼) androidtest android-integration 其中androidtest 并不是必須的只是一些例子而已 androidtest 依賴 android-integration,android。 android 依賴code 2 導(dǎo)入工程 android 與 androidtest code目錄下的src文件夾是二維碼解析與編碼的庫,它是一個(gè)javase 工程 我在這裡降它更改為android工程,然後把這個(gè)android(可以直接把a(bǔ)ndroid- integration裏面的類文件直接拷貝到code目錄裏面合併這2個(gè)庫)設(shè)置為一個(gè)庫,添加到android與amdrpodtest工程裏面,處理一些錯(cuò)誤可以運(yùn)行了。 3 androidtest 工程掃描主要代碼為 IntentIntegrator integrator = new IntentIntegrator(ZXingTestActivity.this); //設(shè)置二維碼掃描屏幕的參數(shù) IntentIntegrator integrator = new IntentIntegrator(ZXingTestActivity.this); 生成二維碼代碼 private void encodeBarcode(CharSequence type, CharSequence data) { IntentIntegrator integrator = new IntentIntegrator(this); 注意:只要安裝了 android工程 上面的代碼在任何你寫的android工程裏面都可以調(diào)用掃描二維碼的功能 4 IntentIntegrator 類 這個(gè)類是一個(gè)工具類 它把生成與掃描二維碼的代碼整合在了一起方便調(diào)用不需要再直接的調(diào)用庫裏面的代碼,但是它也是與庫所分離的,如上所述它需要先安裝android工程才能夠運(yùn)行, 調(diào)用過程:1如上代碼當(dāng)new一個(gè)IntentIntegrator 對象的時(shí)候,會調(diào)用initiateScan方法來初始化一些數(shù)據(jù)但是更重要的作用是在調(diào)用掃描類 initiateScan方法裏面添加掃描的類型比如產(chǎn)品條形碼 或者二維碼 其實(shí)這些數(shù)據(jù)有無都可以 new 出一個(gè)intent 參數(shù)為com.google.zxing.client.android.scan 這個(gè)不是一個(gè)類 而是在android 工程裏面定義的一個(gè)interfilter而它 指向的activity 就是android工程裏面的CaptureActivity這個(gè)是主要的掃描類, 跳轉(zhuǎn)的時(shí)候回加入一些數(shù)據(jù)如: intentScan.putExtra("SCAN_FORMATS", joinedByComma.toString());//掃描類型 initiateScan方法的返回值為AlertDialog 這個(gè)主要是爲(wèi)了在沒有安裝android 工程的情況下程序會給出一個(gè)提示(2.2版本目前支持的工程有 private static final String BS_PACKAGE = "com.google.zxing.client.android" ; ) 檢查包存在的方法是獲取所以包名看是否有這2個(gè)包 findTargetAppPackage(Intent intent) 實(shí)現(xiàn)這個(gè)功能 2 在成功掃描之後 CaptureActivity 退出 返回到 androidtest主activity 的onActivityResult方法裏面調(diào)用 IntentIntegrator 的parseActivityResult方法來接收掃描出來的數(shù)據(jù)顯示在屏幕上面。 這就是在不理會庫的情況下調(diào)用過程 CaptureActivity類處理外來數(shù)據(jù)(因?yàn)樗约罕旧硪部梢赃\(yùn)行)這裡先不說它本身是如何處理運(yùn)行的只說處理外來的數(shù)據(jù) 主要在onResume裏面處理 包括camera的調(diào)用同樣也是在這里 1 檢查action 是否是com.google.zxing.client.android.scan 2 獲取類型 DecodeFormatManager.parseDecodeFormats(intent); 例如UPC_A UPC_E CODE_93 等在DecodeFormatManager有定義。 此方法是多態(tài)的可以接收 intent uri 與Iterable String scanFormatsString = intent.getStringExtra(Intents.Scan.FORMATS); 獲取類型 FORMATS 的值為SCAN_FORMATS 即剛才在IntentIntegrator 跳轉(zhuǎn)過來的時(shí)候 添加的掃描類型 其中還 有一些細(xì)節(jié)性的處理在這裡就不說了(因?yàn)槲疫€沒看呢). 下步掃描處理明天開始學(xué)習(xí)。 至此 google zxing 條碼掃描已經(jīng)完成了,使用起來很簡單但是得安裝它所需要的庫,所以明天開始學(xué)習(xí)android 工程,若有那裡不對之處還請高手指出,歡迎正在學(xué)習(xí)這個(gè)的與已經(jīng)學(xué)習(xí)過的朋友來此討論與指點(diǎn),不勝感激。 |
|