扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
二维码是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的,在代码编制上巧妙地利用构成计算机内部逻辑基础的0、1比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设备自动识读以实现信息自动处理: 二维条码 / 二维码能够在横向和纵向两个方位同时表达信息,因此能在很小的面积内表达大量的信息,那么二维码如何使用?。我们常见的 Android 应用使用二维码下载时,前提是你的 Android 手机上要装有可扫描(或识别)二维码的软件,在Android平台上,常见的手机码工具有快拍(Quick拍)或条码扫描器(Barcode Scanner),我们就以快拍为例,安装好快拍二维码扫描工具之后,就可以打开该软件:打开快拍二维码扫描工具后,对准网站上的二维码:稍等片刻,快拍会自动识别并扫描下该 二维码的地址:扫描完整后,快拍会显示该二维码的信息,1处为二维码信息,2号为二维码的扫描结果,也就是 apk 文件的地址,然后点击3号的地方进行下载:至此,快拍已经完成了它的使命(怎么使用二维码):识别二维码并下载,地址栏正是上一步的 apk 文件地址,下载完成后安装即可。
创新互联建站是一家成都网站制作、做网站、外贸营销网站建设,提供网页设计,网站设计,网站制作,建网站,按需开发,网站开发公司,于2013年开始是互联行业建设者,服务者。以提升客户品牌价值为核心业务,全程参与项目的网站策划设计制作,前端开发,后台程序制作以及后期项目运营并提出专业建议和思路。
在苹果手机自带的应用里,包括相机,是没有扫描二维码这个功能的。但是可以采取其他手段如下:
1、QQ、微信、微博这一类软件,它们就有扫描二维码的功能,支持用手机上的相机直接扫描二维码,也支持扫描你保存到手机相册中的二维码。
2、这里以微信为例,打开以后点击屏幕右上角的 + 按钮,如图所示
3、接下来打开微信里的“扫一扫”功能,如图所示
4、随后将手机相机对准二维码,让它显示在屏幕的框内,即可扫描了。
开源的二维码扫描库主要有zxing和zbar,zbar在iPos平台上应用比较成熟,而在Android平台上主流还是用zxing库,因此这里主要讲述如何利用zxing进行二维码开发。
如何将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之后工程还是会有下面的错误,出现这种错误可能是由于字符错误导致的,只需要把所有的%s 和%f改成 %1s和f 即可
修改完之后重新清理项目,此时已经没有错误了
将zxing代码嵌入自己的工程
在自己的工程中嵌入简化的zxing代码即可实现二维码生成和识别功能
嵌入方法:
将上述简化的代码拖到自己工程目录下;
将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
这种情况大致就可以实现二维码扫描了,想细化的话,还可以多看看安卓二维码扫描开发相关的教程
首先看一下扫描界面
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;
/**
* 闪光灯调节器。自动检测环境光线强弱并决定是否开启闪光灯
*/
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);
//按钮监听事件
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();
// 启动闪光灯调节器
ambientLightManager.start(cameraManager);
// 恢复活动监控器
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);
// 恢复活动监控器
inactivityTimer.onResume();
}
void closeCamera(){
if (handler != null) {
handler.quitSynchronously();
handler = null;
}
inactivityTimer.onPause();
// 关闭摄像头
cameraManager.closeDriver();
}
}
在扫描出现问题事弹出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();
}
二维码用某种特定几何图形按定规律平面(二维向)布黑白相间图形记录数据符号信息代码编制巧妙利用构计算机内部逻辑基础0、1比特流概念使用若干与二进制相应几何形体表示文字数值信息通图象输入设备或光电扫描设备自识读实现信息自处理:
二维条码
/
二维码能够横向纵向两位同表达信息能面积内表达量信息二维码何使用我见
Android
应用使用二维码载前提
Android
手机要装扫描(或识别)二维码软件Android平台见手机码工具快拍(Quick拍)或条码扫描器(Barcode
Scanner)我快拍例安装快拍二维码扫描工具打该软件:打快拍二维码扫描工具准网站二维码:稍等片刻快拍自识别并扫描该
二维码址:扫描完整快拍显示该二维码信息1处二维码信息2号二维码扫描结
apk
文件址点击3号进行载:至快拍已经完使命(使用二维码):识别二维码并载址栏步
apk
文件址载完安装即
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流