android扫描二维码源码
① Android 小黄车扫描二维码用的啥框架
这里简单介绍一下ZXing库。ZXing是一个开放源码的,用java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的端口。Zxing可以实现使用手机的内置的摄像头完成条形码的扫描及解码。该项目可实现的条形码编码和解码。目前支持以下格式:UPC-A,UPC-E、EAN-8,EAN-13、39码、93码。ZXing是个很经典的条码/二维码识别的开源类库,以前在功能机上,就有开发者使用J2ME运用ZXing了,不过要支持JSR-234规范(自动对焦)的手机才能发挥其威力。
下面是ZXing的demo运行,我这里创建了一个二维码,内容是我博客的网址,大伙可以用微信的扫一扫功能,试一下。就可以直接打开我博客。
② 如何使用android studio开发扫描二维码程序
我们项目的前提是你已经将基本的运行环境及sdk都已经安装好了,读者可自行网络环境配置相关内容,本文不再赘述。右键点击new-->Mole,Mole相当于新建了一个项目。如图所示
选择Android Application,点击next
将My Mole 和app改成自己项目相应的名字,同时选择支持的Android版本
这一步我们选择Blank Activity,自己手动编写登录界面,而不依赖系统内置的Login Activity,一直点击next,最后点击finish就完成了项目的创建
在project下我们可以看到出现了我们刚才创建的login项目
展开res/layout,点击打开activity_main.xml文件,在这个文件里我们将完成登录界面的编写
这是初始的主界面,还没有经过我们编写的界面,Android Studio有一个很强大的预览功能,相当给力
我们将activity_main.xml的代码替换成如下代码:
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center_vertical"
android:stretchColumns="0,3">
<TableRow>
<TextView />
<TextView
android:text="账 号:"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="24px"
/>
<EditText
android:id="@+id/account"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="24px"
android:minWidth="220px"/>
<TextView />
</TableRow>
<TableRow android:layout_marginTop="20px">
<TextView />
<TextView
android:text="密 码:"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<EditText
android:id="@+id/pwd"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:minWidth="220px"
android:textSize="24px"
android:inputType="textPassword"/>
<TextView />
</TableRow>
<TableRow android:layout_marginTop="20px">
<TextView />
<Button
android:id="@+id/login"
android:text="登录"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<Button
android:id="@+id/quit"
android:text="退出"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView />
</TableRow>
</TableLayout>
③ 扫描二维码的zing-2.3.0源码中,部分语句在Android-17中弃用了
//ctrl+1添加@SuppressWarnings("deprecation")在onResume
if(Build.VERSION.SDK_INT<Build.VERSION_CODES.HONEYCOMB){
surfaceHolder.setType(surfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
//Integer.parseInt(Build.VERSION.SDK)改为Build.VERSION.SDK_INT
//YCbCr_420_SP用ImageFormat.NV21代替
//YCbCr_422_SP用ImageFormat.NV16代替
//这些文档上都有,自己都可以解决的……
④ 在android中使用googlezxing实现二维码
先打开本地下载,复制文件,拷贝到他们的项目中即可。
首先我们打开google的zxing的地址,googledezxing地址(本地下载),打开之后我们会看到界面,将这个文件下载我们本地,下载好之后我们需要复制android文件下的几个类,根据这些类名称在android文件下找到这些类,拷贝到他们的项目中,拷贝之后会有报错,我们需要将android文件下的res中的文件也拷贝到我们的项目中。完成之后我们还要依赖zxing的核心类库,当我们的项目不报错的时候,就可以先实现扫描二维码和生成二维码。
⑤ android扫描二维码怎么实现链接源码
这有个zxing二维码开发demo的源代码,你看看吧
⑥ android开发 如何实现扫描本地二维码图片
开源的二维码扫描库主要有zxing和zbar,zbar在iPos平台上应用比较成熟,而在Android平台上主流还是用zxing库,因此这里主要讲述如何利用zxing进行二维码开发。
如何将zxing的Android源码导入工程。
在导入zxing的android源码之前,先去官方下载zxing的源码http://code.google.com/p/zxing/downloads/list。
这里以1.6版本为例,zxing 1.6源码结构如下:
<?xmlversion="1.0"encoding="utf-8"?>
<manifestxmlns:android="http://schemas.android.com/apk/res/android"
package="com.qrcode"
android:versionCode="1"
android:versionName="1.0">
<uses-sdkandroid:minSdkVersion="7"/>
<uses-permissionandroid:name="android.permission.VIBRATE"/><!--震动权限-->
<uses-permissionandroid:name="android.permission.CAMERA"/>
<uses-featureandroid:name="android.hardware.camera"/><!--使用照相机权限-->
<uses-featureandroid:name="android.hardware.camera.autofocus"/><!--自动聚焦权限-->
<applicationandroid:icon="@drawable/icon"android:label="@string/app_name">
<activityandroid:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<actionandroid:name="android.intent.action.MAIN"/>
<categoryandroid: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>这种情况大致就可以实现二维码扫描了,想细化的话,还可以多看看安卓二维码扫描开发相关的教程
⑦ androidapp二维码扫码下载,途牛网站的效果,怎么实现
Android 二维码扫描是很常用的工具,是不是很Cool,到底如何实现的呢,下面我们就来探讨一下Zxing的实现方法(底部附上下载链接):
首先
工程结构:
如何引用:(内容来自雪炭网SnowCoal.com)
一般来说,你就可以改改就用了,但如果你只想把它当成一个小小的子集加入项目,你需要将三个包Copy至你的项目中:(camera、decoding、view),然后引入相对应的资源进去,不要访记还有一个Jar包哦!(Zxing.jar)
关于布局:
com.example.qr_codescan包里面有一个MipcaActivityCapture,也是直接引入,这个Activity主要处理扫描界面的类,比如,扫描成功有声音和振动等等,主要关注里面的handleDecode(Result
result, Bitmap barcode)方法,扫描完成之后将扫描到的结果和二维码的bitmap当初参数传递到handleDecode(Result
result, Bitmap barcode)里面,我们只需要在里面写出相对应的处理代码即可,其他的地方都不用改得,这里处理扫描结果和扫描拍的照片.
* 处理扫描结果
* @param result
* @param barcode
*/
public void handleDecode(Result result, Bitmap barcode) {
inactivityTimer.onActivity();
playBeepSoundAndVibrate();
String resultString = result.getText();
if (resultString.equals( "" )) {
Toast.makeText(MipcaActivityCapture. 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);
}
MipcaActivityCapture. this .finish();
}
对MipcaActivityCapture界面的布局做了自己的改动,先看下效果图,主要是用到FrameLayout,里面嵌套RelativeLayout。
//xml
android:layout_width= "fill_parent"
android:layout_height= "fill_parent" >
android:layout_width= "fill_parent"
android:layout_height= "fill_parent" >
android:id= "@+id/preview_view"
android:layout_width= "fill_parent"
android:layout_height= "fill_parent"
android:layout_gravity= "center" />
android:id= "@+id/viewfinder_view"
android:layout_width= "wrap_content"
android:layout_height= "wrap_content" />
< include
android:id= "@+id/include1"
android:layout_width= "fill_parent"
android:layout_height= "wrap_content"
android:layout_alignParentTop= "true"
layout= "@layout/activity_title" />
实现:
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
public class MainActivity extends Activity {
private final static int SCANNIN_GREQUEST_CODE = 1 ;
/**
* 显示扫描结果
*/
private TextView mTextView ;
/**
* 显示扫描拍的图片
*/
private ImageView mImageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView) findViewById(R.id.result);
mImageView = (ImageView) findViewById(R.id.qrcode_bitmap);
//点击按钮跳转到二维码扫描界面,这里用的是startActivityForResult跳转
//扫描完了之后调到该界面
Button mButton = (Button) findViewById(R.id.button1);
mButton.setOnClickListener( new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setClass(MainActivity. this , MipcaActivityCapture. class );
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivityForResult(intent, SCANNIN_GREQUEST_CODE);
}
});
}
@Override
protected void onActivityResult( int requestCode, int resultCode, Intent
data) {
super .onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case SCANNIN_GREQUEST_CODE:
if (resultCode == RESULT_OK){
Bundle bundle = data.getExtras();
//显示扫描到的内容
mTextView.setText(bundle.getString( "result" ));
//显示
mImageView.setImageBitmap((Bitmap) data.getParcelableExtra( "bitmap"
));
}
break ;
}
}
}
⑧ Android 二维码扫描怎样实现第二次扫描
首先看一下扫描界面
CaptureCodeActivity.java代码:
packagecom.haier.qr.code;
importjava.io.IOException;
importjava.io.Serializable;
importjava.util.Map;
importjava.util.Vector;
importandroid.app.Activity;
importandroid.app.AlertDialog;
importandroid.content.DialogInterface;
importandroid.content.DialogInterface.OnCancelListener;
importandroid.content.DialogInterface.OnClickListener;
importandroid.content.Intent;
importandroid.graphics.Bitmap;
importandroid.os.Bundle;
importandroid.os.Handler;
importandroid.text.TextUtils;
importandroid.util.Log;
importandroid.view.SurfaceHolder;
importandroid.view.SurfaceHolder.Callback;
importandroid.view.SurfaceView;
importandroid.view.View;
importandroid.view.Window;
importandroid.view.WindowManager;
importandroid.widget.Toast;
importcom.google.zxing.BarcodeFormat;
importcom.google.zxing.DecodeHintType;
importcom.google.zxing.Result;
importcom.haier.cabinet.customer.R;
importcom.haier.cabinet.customer.activity.DeliveryBoxListActivity;
importcom.haier.common.util.AppToast;
importcom.haier.qr.code.zxing.camera.CameraManager;
importcom.haier.qr.code.zxing.decoding.CaptureActivityHandler;
importcom.haier.qr.code.zxing.decoding.FinishListener;
importcom.haier.qr.code.zxing.decoding.InactivityTimer;
importcom.haier.qr.code.zxing.view.ViewfinderView;
/**
*Initialthecamera
*
*@authorjdsjlzx
*/
,View.OnClickListener{
privatestaticfinalStringTAG=CaptureCodeActivity.class
.getSimpleName();
;
;
;
privatebooleanhasSurface;
privateMap<DecodeHintType,?>decodeHints;
privateVector<BarcodeFormat>decodeFormats;
privateStringcharacterSet;
;
;
/**
*声音震动管理器。如果扫描成功后可以播放一段音频,也可以震动提醒,可以通过配置来决定扫描成功后的行为。
*/
privateBeepManagerbeepManager;
/**
*闪光灯调节器。自动检测环境光线强弱并决定是否开启闪光灯
*/
;
(){
returncameraManager;
}
/**.*/
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
Windowwindow=getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
setContentView(R.layout.activity_capture);
hasSurface=false;
inactivityTimer=newInactivityTimer(this);
beepManager=newBeepManager(this);
ambientLightManager=newAmbientLightManager(this);
//按钮监听事件
findViewById(R.id.capture_flashlight).setOnClickListener(this);
}
@Override
protectedvoidonResume(){
super.onResume();
Log.d(TAG,"onResume");
cameraManager=newCameraManager(getApplication());
viewfinderView=(ViewfinderView)findViewById(R.id.viewfinder_view);
viewfinderView.setCameraManager(cameraManager);
viewfinderView.setVisibility(View.VISIBLE);
SurfaceViewsurfaceView=(SurfaceView)findViewById(R.id.preview_view);
SurfaceHoldersurfaceHolder=surfaceView.getHolder();
if(hasSurface){
initCamera(surfaceHolder);
}else{
//防止sdk8的设备初始化预览异常
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
//()toinitthe
//camera.
surfaceHolder.addCallback(this);
}
decodeFormats=null;
characterSet=null;
//加载声音配置,其实在BeemManager的构造器中也会调用该方法,即在onCreate的时候会调用一次
beepManager.updatePrefs();
//启动闪光灯调节器
ambientLightManager.start(cameraManager);
//恢复活动监控器
inactivityTimer.onResume();
}
@Override
protectedvoidonPause(){
Log.d(TAG,"onPause");
if(handler!=null){
handler.quitSynchronously();
handler=null;
}
inactivityTimer.onPause();
ambientLightManager.stop();
beepManager.close();
//关闭摄像头
cameraManager.closeDriver();
if(!hasSurface){
SurfaceViewsurfaceView=(SurfaceView)findViewById(R.id.preview_view);
SurfaceHoldersurfaceHolder=surfaceView.getHolder();
surfaceHolder.removeCallback(this);
}
super.onPause();
}
@Override
protectedvoidonDestroy(){
inactivityTimer.shutdown();
super.onDestroy();
}
/**
*Avalidbarcodehasbeenfound,
*theresults.
*
*@paramrawResult
*Thecontentsofthebarcode.
*@paramscaleFactor
*
*@parambarcode
*.
*/
publicvoidhandleDecode(ResultrawResult,Bitmapbarcode,floatscaleFactor){
Log.d(TAG,"handleDecode");
inactivityTimer.onActivity();
beepManager.playBeepSoundAndVibrate();
StringresultString=rawResult.getText();
if(TextUtils.isEmpty(resultString)){
Toast.makeText(CaptureCodeActivity.this,"Scanfailed!",
Toast.LENGTH_SHORT).show();
}else{
//扫码完成,处理结果(跳转到箱子列表)
/*IntentresultIntent=newIntent();
Bundlebundle=newBundle();
bundle.putString("result",resultString);
bundle.putParcelable("bitmap",barcode);
resultIntent.putExtras(bundle);
this.setResult(RESULT_OK,resultIntent);*/
StringterminalNo=getIntent().getStringExtra("terminal_no");
if(resultString.equals(terminalNo)){
AppToast.makeToast(this,"确认成功!");
Intentintent=newIntent(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();
}
}
}
privatevoidinitCamera(SurfaceHoldersurfaceHolder){
if(surfaceHolder==null){
thrownewIllegalStateException("NoSurfaceHolderprovided");
}
if(cameraManager.isOpen()){
Log.w(TAG,
"initCamera()whilealreadyopen--lateSurfaceViewcallback?");
return;
}
try{
cameraManager.openDriver(surfaceHolder);
//,whichcanalsothrowa
//RuntimeException.
if(handler==null){
handler=newCaptureActivityHandler(this,decodeFormats,
decodeHints,characterSet,cameraManager);
}
}catch(IOExceptionioe){
Log.w(TAG,ioe);
();
}catch(RuntimeExceptione){
//:
//java.?lang.?RuntimeException:Failtoconnecttocameraservice
Log.w(TAG,"",e);
();
}
}
privatevoid(){
AlertDialog.Builderbuilder=newAlertDialog.Builder(this);
builder.setTitle(getString(R.string.app_name));
builder.setMessage(getString(R.string.msg_camera_framework_bug));
builder.setPositiveButton(android.R.string.yes,newFinishListener(this));
builder.setOnCancelListener(newFinishListener(this));
builder.show();
}
@Override
publicvoidsurfaceChanged(SurfaceHolderholder,intformat,intwidth,
intheight){
}
@Override
publicvoidsurfaceCreated(SurfaceHolderholder){
if(holder==null){
Log.e(TAG,
"***WARNING***surfaceCreated()gaveusanullsurface!");
}
if(!hasSurface){
hasSurface=true;
initCamera(holder);
}
}
@Override
publicvoidsurfaceDestroyed(SurfaceHolderholder){
hasSurface=false;
}
(){
returnviewfinderView;
}
publicHandlergetHandler(){
returnhandler;
}
publicvoiddrawViewfinder(){
viewfinderView.drawViewfinder();
}
@Override
publicvoidonClick(Viewv){
switch(v.getId()){
caseR.id.capture_flashlight:
if(isFlashlightOpen){
cameraManager.setTorch(false);//关闭闪光灯
isFlashlightOpen=false;
}
else{
cameraManager.setTorch(true);//打开闪光灯
isFlashlightOpen=true;
}
break;
default:
break;
}
}
privatevoidshowErrorDialog(){
closeCamera();
viewfinderView.setVisibility(View.GONE);
AlertDialog.Builderbuilder=newAlertDialog.Builder(this);
builder.setTitle(getString(R.string.app_name));
builder.setMessage("扫描确认出错,请重新扫描二维码!");
builder.setPositiveButton(android.R.string.ok,newOnClickListener(){
@Override
publicvoidonClick(DialogInterfacedialog,intwhich){
restartCamera();
}
});
builder.setOnCancelListener(newOnCancelListener(){
@Override
publicvoidonCancel(DialogInterfacedialog){
CaptureCodeActivity.this.finish();
}
});
builder.show();
}
voidrestartCamera(){
Log.d(TAG,"hasSurface"+hasSurface);
viewfinderView.setVisibility(View.VISIBLE);
SurfaceViewsurfaceView=(SurfaceView)findViewById(R.id.preview_view);
SurfaceHoldersurfaceHolder=surfaceView.getHolder();
initCamera(surfaceHolder);
//恢复活动监控器
inactivityTimer.onResume();
}
voidcloseCamera(){
if(handler!=null){
handler.quitSynchronously();
handler=null;
}
inactivityTimer.onPause();
//关闭摄像头
cameraManager.closeDriver();
}
}
在扫描出现问题事弹出dialog,当用户点击确定按钮后重新开始扫描。
privatevoidshowErrorDialog(){
closeCamera();
viewfinderView.setVisibility(View.GONE);
AlertDialog.Builderbuilder=newAlertDialog.Builder(this);
builder.setTitle(getString(R.string.app_name));
builder.setMessage("扫描确认出错,请重新扫描柜子上的二维码!");
builder.setPositiveButton(android.R.string.ok,newOnClickListener(){
@Override
publicvoidonClick(DialogInterfacedialog,intwhich){
restartCamera();
}
});
builder.setOnCancelListener(newOnCancelListener(){
@Override
publicvoidonCancel(DialogInterfacedialog){
CaptureCodeActivity.this.finish();
}
});
builder.show();
}