整個程式碼主軸包含...
- 偵測手機上是否已安裝 Zxing。
- 下載 Zxing apk。
- 安裝 Zxing apk。
- 使用已安裝的 Zxing 應用程式,並取回 QR code 內容。
1、偵測手機上是否已安裝 Zxing
new Intent內容為 Zxing package,你也可以用此判斷式去偵測任何已知 package的app是否已經被安裝在device上。
- Intent intent = new Intent("com.google.zxing.client.android.SCAN");
- if(getPackageManager().queryIntentActivities(intent,
- PackageManager.MATCH_DEFAULT_ONLY).size() == 0) {
- //未安裝Zxing
- }else{
- //已安裝Zxing
- }
2、下載 Zxing apk
必要宣告
- //--------寫入SD卡的暫存檔路徑
- private String currentTempFilePath = "";
- //--------zxing apk 載點
- private String zxingDownload_url;
- //--------檔名 (由載點剪字)
- private String fileName;
- //--------副檔名 (由載點剪字)
- private String fileExName;
下載的副程式
傳入url即 Zxing apk 載點。
- //-------開始下載
- private void startDownload(String url) throws Exception {
- if (!URLUtil.isNetworkUrl(url)) {
- //-------網址有誤
- }
- else {
- //-------取得URL
- URL myURL = new URL(url);
- //-------建立連線
- URLConnection conn = myURL.openConnection();
- conn.connect();
- //-------InputStream 下載檔案
- InputStream is = conn.getInputStream();
- if (is == null) {
- throw new RuntimeException("stream is null");
- }
- //-------建立暫存檔案
- File myTempFile = File.createTempFile(fileName, "."+fileExName);
- //-------取得暫存檔案路徑
- currentTempFilePath = myTempFile.getAbsolutePath();
- //-------設定串流輸出標地物為暫存檔
- FileOutputStream fos = new FileOutputStream(myTempFile);
- //-------串流輸出
- byte buf[] = new byte[128];
- do {
- int numread = is.read(buf);
- if (numread <= 0) {
- break;
- }
- fos.write(buf, 0, numread);
- } while (true);
- //-------開啟檔案進行安裝
- startInstall(myTempFile);
- //-------關閉串流
- try {
- is.close();
- }
- catch (Exception ex) {
- Log.e(LogTag, "error: " + ex.getMessage(), ex);
- }
- }
- }
3、安裝 Zxing apk
傳入tempFile為Zxing apk,intent設定為使用 packageInstaller 來安裝指定apk。
- //-------開始安裝
- private void startInstall(File tempFile){
- Intent intent = new Intent();
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- intent.setAction(android.content.Intent.ACTION_VIEW);
- //-------設定intent的file與MimeType
- intent.setDataAndType(Uri.fromFile(tempFile),
- "application/vnd.android.package-archive");
- startActivity(intent);
- }
4、使用已安裝的 Zxing 應用程式,並取回 QR code 內容
這個部分是參照至 Zxing 的 wiki,它推薦你將 Zxing 與你的 app 分開,用你的 app 去開啟Zxing,而不是把整包 Zxing 專案的 source code 都包進你的專案。
上面的是由按鈕去觸發掃描器的範例,startActivityForResult的第二個參數是用於讓你的程式能夠區別是哪的activty開啟了掃描器;第二段程式是當Zxing完成掃描回到原activity後可以讀出 QR code 的值,content為字串內容,format為格式,cancel適用於使用倒回鍵的情況。
- public Button.OnClickListener mScan = new Button.OnClickListener() {
- public void onClick(View v) {
- Intent intent = new Intent("com.google.zxing.client.android.SCAN");
- intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
- startActivityForResult(intent, 0);
- }
- };
- public void onActivityResult(int requestCode, int resultCode, Intent intent) {
- if (requestCode == 0) {
- if (resultCode == RESULT_OK) {
- String contents = intent.getStringExtra("SCAN_RESULT");
- String format = intent.getStringExtra("SCAN_RESULT_FORMAT");
- // Handle successful scan
- } else if (resultCode == RESULT_CANCELED) {
- // Handle cancel
- }
- }
- }
補充
由於 startDownload() 會 throw Exception 所以調用時需要 try catch,另外似乎是因為 Stream
- Runnable r = new Runnable(){
- public void run(){
- try{
- startDownload(zxingDownload_url);
- }
- catch(Exception e){
- Log.e(LogTag, e.getMessage(), e);
- }
- }
- };
- new Thread(r).start();
的關係,如果不用 thread 似乎沒有辦法正常下載檔案。
由於下載是寫入SD卡的關係,你的手機或模擬器必須備有SD卡,並且在AndroidManifest.xml
加入必要的權限設定。
- <!--使用網路-->
- <uses-permission android:name="android.permission.INTERNET" />
- <!--系統I/O-->
- <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
- <!--自動安裝程式-->
- <uses-permission android:name="android.permission.INSTALL_PACKAGES" />
- <!--寫入SD卡-->
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
如果你打算先偵測 device 是否裝備 SD卡 並可運行,可以使用下述方法。
- private boolean checkSDCard() {
- if(android.os.Environment.getExternalStorageState()
- .equals(android.os.Environment.MEDIA_MOUNTED))
- return true;
- else
- return false;
- }
參考網站:Google Code Zxing。
請問一下
回覆刪除2、下載 Zxing apk
必要宣告
//--------寫入SD卡的暫存檔路徑
private String currentTempFilePath = "";
//--------zxing apk 載點
private String zxingDownload_url;
//--------檔名 (由載點剪字)
private String fileName;
//--------副檔名 (由載點剪字)
private String fileExName;
裡面要輸入些什麼呢
看你的Zxing載點放在哪,還有下載後要放在SD卡的什麼路徑,基本上這兩個是由你自己決定的。
刪除請問可以把ZXING 包成library
回覆刪除然後打勾 is library 直接綁在APP內嗎?
要怎樣才能正常跑 ? 因為我不會這些手機程式
回覆刪除不知道要加那些程式
不曉得有沒有更完整的原始碼 並講解 .. 謝謝