整個程式碼主軸包含...
- 偵測手機上是否已安裝 Zxing。
- 下載 Zxing apk。
- 安裝 Zxing apk。
- 使用已安裝的 Zxing 應用程式,並取回 QR code 內容。
1、偵測手機上是否已安裝 Zxing
Intent intent = new Intent("com.google.zxing.client.android.SCAN");
if(getPackageManager().queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY).size() == 0) {
//未安裝Zxing
}else{
//已安裝Zxing
}
new Intent內容為 Zxing package,你也可以用此判斷式去偵測任何已知 package的app是否已經被安裝在device上。2、下載 Zxing apk
必要宣告
//--------寫入SD卡的暫存檔路徑 private String currentTempFilePath = ""; //--------zxing apk 載點 private String zxingDownload_url; //--------檔名 (由載點剪字) private String fileName; //--------副檔名 (由載點剪字) private String fileExName;
下載的副程式
//-------開始下載
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);
}
}
}
傳入url即 Zxing apk 載點。3、安裝 Zxing 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);
}
傳入tempFile為Zxing apk,intent設定為使用 packageInstaller 來安裝指定apk。4、使用已安裝的 Zxing 應用程式,並取回 QR code 內容
這個部分是參照至 Zxing 的 wiki,它推薦你將 Zxing 與你的 app 分開,用你的 app 去開啟Zxing,而不是把整包 Zxing 專案的 source code 都包進你的專案。
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
}
}
}
上面的是由按鈕去觸發掃描器的範例,startActivityForResult的第二個參數是用於讓你的程式能夠區別是哪的activty開啟了掃描器;第二段程式是當Zxing完成掃描回到原activity後可以讀出 QR code 的值,content為字串內容,format為格式,cancel適用於使用倒回鍵的情況。補充
Runnable r = new Runnable(){
public void run(){
try{
startDownload(zxingDownload_url);
}
catch(Exception e){
Log.e(LogTag, e.getMessage(), e);
}
}
};
new Thread(r).start();
由於 startDownload() 會 throw Exception 所以調用時需要 try catch,另外似乎是因為 Stream的關係,如果不用 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內嗎?
要怎樣才能正常跑 ? 因為我不會這些手機程式
回覆刪除不知道要加那些程式
不曉得有沒有更完整的原始碼 並講解 .. 謝謝