二維碼是用某種特定的幾何圖形按一定規(guī)律在平面(二維方向上)分布的黑白相間的圖形記錄數(shù)據符號信息的,在代碼編制上巧妙地利用構成計算機內部邏輯基礎的0、1比特流的概念,使用若干個與二進制相對應的幾何形體來表示文字數(shù)值信息,通過圖象輸入設備或光電掃描設備自動識讀以實現(xiàn)信息自動處理: 二維條碼 / 二維碼能夠在橫向和縱向兩個方位同時表達信息,因此能在很小的面積內表達大量的信息,那么二維碼如何使用?。我們常見的 Android 應用使用二維碼下載時,前提是你的 Android 手機上要裝有可掃描(或識別)二維碼的軟件,在Android平臺上,常見的手機碼工具有快拍(Quick拍)或條碼掃描器(Barcode Scanner),我們就以快拍為例,安裝好快拍二維碼掃描工具之后,就可以打開該軟件:打開快拍二維碼掃描工具后,對準網站上的二維碼:稍等片刻,快拍會自動識別并掃描下該 二維碼的地址:掃描完整后,快拍會顯示該二維碼的信息,1處為二維碼信息,2號為二維碼的掃描結果,也就是 apk 文件的地址,然后點擊3號的地方進行下載:至此,快拍已經完成了它的使命(怎么使用二維碼):識別二維碼并下載,地址欄正是上一步的 apk 文件地址,下載完成后安裝即可。

創(chuàng)新互聯(lián)建站是一家成都網站制作、做網站、外貿營銷網站建設,提供網頁設計,網站設計,網站制作,建網站,按需開發(fā),網站開發(fā)公司,于2013年開始是互聯(lián)行業(yè)建設者,服務者。以提升客戶品牌價值為核心業(yè)務,全程參與項目的網站策劃設計制作,前端開發(fā),后臺程序制作以及后期項目運營并提出專業(yè)建議和思路。
在蘋果手機自帶的應用里,包括相機,是沒有掃描二維碼這個功能的。但是可以采取其他手段如下:
1、QQ、微信、微博這一類軟件,它們就有掃描二維碼的功能,支持用手機上的相機直接掃描二維碼,也支持掃描你保存到手機相冊中的二維碼。
2、這里以微信為例,打開以后點擊屏幕右上角的 + 按鈕,如圖所示
3、接下來打開微信里的“掃一掃”功能,如圖所示
4、隨后將手機相機對準二維碼,讓它顯示在屏幕的框內,即可掃描了。
開源的二維碼掃描庫主要有zxing和zbar,zbar在iPos平臺上應用比較成熟,而在Android平臺上主流還是用zxing庫,因此這里主要講述如何利用zxing進行二維碼開發(fā)。
如何將zxing的Android源碼導入工程。
在導入zxing的android源碼之前,先去官方下載zxing的源碼。
這里以1.6版本為例,zxing 1.6源碼結構如下:
其中android文件夾就是android平臺下的官方例子,在導入之前先要對core文件下的源碼進行編譯,得到核心包core.jar。
編譯方法請參照:
然后就可以導入android平臺下的例子了,導入方法如下:
打開Eclipse,新建android項目:(注意不要直接把android文件夾拷到workspace下導入,那樣會無法導入)
導入核心包core.jar。
修改strings.xml文件。在導入core.jar之后工程還是會有下面的錯誤,出現(xiàn)這種錯誤可能是由于字符錯誤導致的,只需要把所有的%s 和%f改成?%1s和f?? 即可
修改完之后重新清理項目,此時已經沒有錯誤了
將zxing代碼嵌入自己的工程
在自己的工程中嵌入簡化的zxing代碼即可實現(xiàn)二維碼生成和識別功能
嵌入方法:
將上述簡化的代碼拖到自己工程目錄下;
將values文件夾和raw文件夾復制自己工程目錄下;
建立CaptureActivity.java的布局文件capture.xml:
?xml?version="1.0"?encoding="utf-8"?
FrameLayout?xmlns:android=""
android:layout_width="fill_parent"
android:layout_height="fill_parent"?
SurfaceView
android:id="@+id/preview_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"?/
com.zxing.view.ViewfinderView
android:id="@+id/viewfinder_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"?/
RelativeLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="center"
android:orientation="vertical"?
TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerInParent="true"
android:gravity="center"
android:paddingBottom="10dp"
android:paddingTop="10dp"
android:text="Scan?Barcode"
android:textColor="@android:color/white"
android:textSize="18sp"
android:textStyle="bold"?/
Button
android:id="@+id/btn_cancel_scan"
android:layout_width="230dp"
android:layout_height="40dp"
android:layout_alignParentBottom="true"
android:layout_centerInParent="true"
android:layout_marginBottom="75dp"
android:text="Cancel"
android:textSize="15sp"
android:textStyle="bold"?/
/RelativeLayout
/FrameLayout
導入core.jar包
修改AndrodMainfest.xml
?xml?version="1.0"?encoding="utf-8"?
manifest?xmlns:android=""
package="com.qrcode"
android:versionCode="1"
android:versionName="1.0"
uses-sdk?android:minSdkVersion="7"?/
uses-permission?android:name="android.permission.VIBRATE"?/??!--?震動權限?--
uses-permission?android:name="android.permission.CAMERA"?/
uses-feature?android:name="android.hardware.camera"?/????????!--?使用照相機權限?--
uses-feature?android:name="android.hardware.camera.autofocus"?/???!--?自動聚焦權限?--
application?android:icon="@drawable/icon"?android:label="@string/app_name"
activity?android:name=".MainActivity"
android:label="@string/app_name"
intent-filter
action?android:name="android.intent.action.MAIN"?/
category?android: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
這種情況大致就可以實現(xiàn)二維碼掃描了,想細化的話,還可以多看看安卓二維碼掃描開發(fā)相關的教程
首先看一下掃描界面
CaptureCodeActivity.java代碼:
package?com.haier.qr.code;
import?java.io.IOException;
import?java.io.Serializable;
import?java.util.Map;
import?java.util.Vector;
import?android.app.Activity;
import?android.app.AlertDialog;
import?android.content.DialogInterface;
import?android.content.DialogInterface.OnCancelListener;
import?android.content.DialogInterface.OnClickListener;
import?android.content.Intent;
import?android.graphics.Bitmap;
import?android.os.Bundle;
import?android.os.Handler;
import?android.text.TextUtils;
import?android.util.Log;
import?android.view.SurfaceHolder;
import?android.view.SurfaceHolder.Callback;
import?android.view.SurfaceView;
import?android.view.View;
import?android.view.Window;
import?android.view.WindowManager;
import?android.widget.Toast;
import?com.google.zxing.BarcodeFormat;
import?com.google.zxing.DecodeHintType;
import?com.google.zxing.Result;
import?com.haier.cabinet.customer.R;
import?com.haier.cabinet.customer.activity.DeliveryBoxListActivity;
import?com.haier.common.util.AppToast;
import?com.haier.qr.code.zxing.camera.CameraManager;
import?com.haier.qr.code.zxing.decoding.CaptureActivityHandler;
import?com.haier.qr.code.zxing.decoding.FinishListener;
import?com.haier.qr.code.zxing.decoding.InactivityTimer;
import?com.haier.qr.code.zxing.view.ViewfinderView;
/**
*?Initial?the?camera
*?
*?@author?jdsjlzx
*/
public?class?CaptureCodeActivity?extends?Activity?implements?Callback,View.OnClickListener?{
private?static?final?String?TAG?=?CaptureCodeActivity.class
.getSimpleName();
private?CameraManager?cameraManager;
private?CaptureActivityHandler?handler;
private?ViewfinderView?viewfinderView;
private?boolean?hasSurface;
private?MapDecodeHintType,???decodeHints;
private?VectorBarcodeFormat?decodeFormats;
private?String?characterSet;
private?InactivityTimer?inactivityTimer;
private?boolean?isFlashlightOpen;
/**
?*?聲音震動管理器。如果掃描成功后可以播放一段音頻,也可以震動提醒,可以通過配置來決定掃描成功后的行為。
?*/
private?BeepManager?beepManager;
/**
?*?閃光燈調節(jié)器。自動檢測環(huán)境光線強弱并決定是否開啟閃光燈
?*/
private?AmbientLightManager?ambientLightManager;
public?CameraManager?getCameraManager()?{
return?cameraManager;
}
/**?Called?when?the?activity?is?first?created.?*/
@Override
public?void?onCreate(Bundle?savedInstanceState)?{
super.onCreate(savedInstanceState);
Window?window?=?getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
setContentView(R.layout.activity_capture);
hasSurface?=?false;
inactivityTimer?=?new?InactivityTimer(this);
beepManager?=?new?BeepManager(this);
ambientLightManager?=?new?AmbientLightManager(this);
//按鈕監(jiān)聽事件
findViewById(R.id.capture_flashlight).setOnClickListener(this);
}
@Override
protected?void?onResume()?{
super.onResume();
Log.d(TAG,?"onResume");
cameraManager?=?new?CameraManager(getApplication());
viewfinderView?=?(ViewfinderView)?findViewById(R.id.viewfinder_view);
viewfinderView.setCameraManager(cameraManager);
viewfinderView.setVisibility(View.VISIBLE);
SurfaceView?surfaceView?=?(SurfaceView)?findViewById(R.id.preview_view);
SurfaceHolder?surfaceHolder?=?surfaceView.getHolder();
if?(hasSurface)?{
initCamera(surfaceHolder);
}?else?{
//?防止sdk8的設備初始化預覽異常
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
//?Install?the?callback?and?wait?for?surfaceCreated()?to?init?the
//?camera.
surfaceHolder.addCallback(this);
}
decodeFormats?=?null;
characterSet?=?null;
//?加載聲音配置,其實在BeemManager的構造器中也會調用該方法,即在onCreate的時候會調用一次
beepManager.updatePrefs();
//?啟動閃光燈調節(jié)器
ambientLightManager.start(cameraManager);
//?恢復活動監(jiān)控器
inactivityTimer.onResume();
}
@Override
protected?void?onPause()?{
Log.d(TAG,?"onPause");
if?(handler?!=?null)?{
handler.quitSynchronously();
handler?=?null;
}
inactivityTimer.onPause();
ambientLightManager.stop();
beepManager.close();
//?關閉攝像頭
cameraManager.closeDriver();
if?(!hasSurface)?{
SurfaceView?surfaceView?=?(SurfaceView)?findViewById(R.id.preview_view);
SurfaceHolder?surfaceHolder?=?surfaceView.getHolder();
surfaceHolder.removeCallback(this);
}
super.onPause();
}
@Override
protected?void?onDestroy()?{
inactivityTimer.shutdown();
super.onDestroy();
}
/**
?*?A?valid?barcode?has?been?found,?so?give?an?indication?of?success?and?show
?*?the?results.
?*?
?*?@param?rawResult
?*????????????The?contents?of?the?barcode.
?*?@param?scaleFactor
?*????????????amount?by?which?thumbnail?was?scaled
?*?@param?barcode
?*????????????A?greyscale?bitmap?of?the?camera?data?which?was?decoded.
?*/
public?void?handleDecode(Result?rawResult,?Bitmap?barcode,?float?scaleFactor)?{
Log.d(TAG,?"handleDecode");
inactivityTimer.onActivity();
beepManager.playBeepSoundAndVibrate();
String?resultString?=?rawResult.getText();
if?(TextUtils.isEmpty(resultString))?{
Toast.makeText(CaptureCodeActivity.this,?"Scan?failed!",
Toast.LENGTH_SHORT).show();
}?else?{
//掃碼完成,處理結果(跳轉到箱子列表)
/*Intent?resultIntent?=?new?Intent();
Bundle?bundle?=?new?Bundle();
bundle.putString("result",?resultString);
bundle.putParcelable("bitmap",?barcode);
resultIntent.putExtras(bundle);
this.setResult(RESULT_OK,?resultIntent);*/
String?terminalNo?=?getIntent().getStringExtra("terminal_no");
if?(resultString.equals(terminalNo))?{
AppToast.makeToast(this,?"確認成功!");
Intent?intent?=?new?Intent(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();
}
}
}
private?void?initCamera(SurfaceHolder?surfaceHolder)?{
if?(surfaceHolder?==?null)?{
throw?new?IllegalStateException("No?SurfaceHolder?provided");
}
if?(cameraManager.isOpen())?{
Log.w(TAG,
"initCamera()?while?already?open?--?late?SurfaceView?callback?");
return;
}
try?{
cameraManager.openDriver(surfaceHolder);
//?Creating?the?handler?starts?the?preview,?which?can?also?throw?a
//?RuntimeException.
if?(handler?==?null)?{
handler?=?new?CaptureActivityHandler(this,?decodeFormats,
decodeHints,?characterSet,?cameraManager);
}
}?catch?(IOException?ioe)?{
Log.w(TAG,?ioe);
displayFrameworkBugMessageAndExit();
}?catch?(RuntimeException?e)?{
//?Barcode?Scanner?has?seen?crashes?in?the?wild?of?this?variety:
//?java.?lang.?RuntimeException:?Fail?to?connect?to?camera?service
Log.w(TAG,?"Unexpected?error?initializing?camera",?e);
displayFrameworkBugMessageAndExit();
}
}
private?void?displayFrameworkBugMessageAndExit()?{
AlertDialog.Builder?builder?=?new?AlertDialog.Builder(this);
builder.setTitle(getString(R.string.app_name));
builder.setMessage(getString(R.string.msg_camera_framework_bug));
builder.setPositiveButton(android.R.string.yes,?new?FinishListener(this));
builder.setOnCancelListener(new?FinishListener(this));
builder.show();
}
@Override
public?void?surfaceChanged(SurfaceHolder?holder,?int?format,?int?width,
int?height)?{
}
@Override
public?void?surfaceCreated(SurfaceHolder?holder)?{
if?(holder?==?null)?{
Log.e(TAG,
"***?WARNING?***?surfaceCreated()?gave?us?a?null?surface!");
}
if?(!hasSurface)?{
hasSurface?=?true;
initCamera(holder);
}
}
@Override
public?void?surfaceDestroyed(SurfaceHolder?holder)?{
hasSurface?=?false;
}
public?ViewfinderView?getViewfinderView()?{
return?viewfinderView;
}
public?Handler?getHandler()?{
return?handler;
}
public?void?drawViewfinder()?{
viewfinderView.drawViewfinder();
}
@Override
public?void?onClick(View?v)?{
switch?(v.getId())?{
case?R.id.capture_flashlight:
if?(isFlashlightOpen)?{
cameraManager.setTorch(false);?//?關閉閃光燈
isFlashlightOpen?=?false;
}
else?{
cameraManager.setTorch(true);?//?打開閃光燈
isFlashlightOpen?=?true;
}
break;
default:
break;
}
}
private?void?showErrorDialog()?{
closeCamera();
viewfinderView.setVisibility(View.GONE);
AlertDialog.Builder?builder?=?new?AlertDialog.Builder(this);
builder.setTitle(getString(R.string.app_name));
builder.setMessage("掃描確認出錯,請重新掃描二維碼!");
builder.setPositiveButton(android.R.string.ok,?new?OnClickListener()?{
@Override
public?void?onClick(DialogInterface?dialog,?int?which)?{
restartCamera();
}
});
builder.setOnCancelListener(new?OnCancelListener()?{
@Override
public?void?onCancel(DialogInterface?dialog)?{
CaptureCodeActivity.this.finish();
}
});
builder.show();
}
void?restartCamera(){
Log.d(TAG,?"hasSurface?"?+?hasSurface);
viewfinderView.setVisibility(View.VISIBLE);
SurfaceView?surfaceView?=?(SurfaceView)?findViewById(R.id.preview_view);
SurfaceHolder?surfaceHolder?=?surfaceView.getHolder();
initCamera(surfaceHolder);
//?恢復活動監(jiān)控器
inactivityTimer.onResume();
}
void?closeCamera(){
if?(handler?!=?null)?{
handler.quitSynchronously();
handler?=?null;
}
inactivityTimer.onPause();
//?關閉攝像頭
cameraManager.closeDriver();
}
}
在掃描出現(xiàn)問題事彈出dialog,當用戶點擊確定按鈕后重新開始掃描。
private?void?showErrorDialog()?{
closeCamera();
viewfinderView.setVisibility(View.GONE);
AlertDialog.Builder?builder?=?new?AlertDialog.Builder(this);
builder.setTitle(getString(R.string.app_name));
builder.setMessage("掃描確認出錯,請重新掃描柜子上的二維碼!");
builder.setPositiveButton(android.R.string.ok,?new?OnClickListener()?{
@Override
public?void?onClick(DialogInterface?dialog,?int?which)?{
restartCamera();
}
});
builder.setOnCancelListener(new?OnCancelListener()?{
@Override
public?void?onCancel(DialogInterface?dialog)?{
CaptureCodeActivity.this.finish();
}
});
builder.show();
}
二維碼用某種特定幾何圖形按定規(guī)律平面(二維向)布黑白相間圖形記錄數(shù)據符號信息代碼編制巧妙利用構計算機內部邏輯基礎0、1比特流概念使用若干與二進制相應幾何形體表示文字數(shù)值信息通圖象輸入設備或光電掃描設備自識讀實現(xiàn)信息自處理:
二維條碼
/
二維碼能夠橫向縱向兩位同表達信息能面積內表達量信息二維碼何使用我見
Android
應用使用二維碼載前提
Android
手機要裝掃描(或識別)二維碼軟件Android平臺見手機碼工具快拍(Quick拍)或條碼掃描器(Barcode
Scanner)我快拍例安裝快拍二維碼掃描工具打該軟件:打快拍二維碼掃描工具準網站二維碼:稍等片刻快拍自識別并掃描該
二維碼址:掃描完整快拍顯示該二維碼信息1處二維碼信息2號二維碼掃描結
apk
文件址點擊3號進行載:至快拍已經完使命(使用二維碼):識別二維碼并載址欄步
apk
文件址載完安裝即
當前題目:android二維碼掃描,android手機掃描二維碼
網頁路徑:http://chinadenli.net/article1/dsijdod.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供電子商務、、網站導航、域名注冊、微信小程序、App設計
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)