您的位置:首页 > 移动开发 > Android开发

Android使用ZXing扫描二维码,并返回二维码结果

2017-11-10 15:25 471 查看
1.首先到https://github.com/zxing/zxing上下载zxing最新版本是3.3.1

2.解压zxing,我们主要使用下图所示的两个目录



3.把上图中的两个目录中的代码拷贝到你的Android项目中,下面是我的项目目录



4.把zxing中的layout目录中布局文件拷贝到你的项目对应目录中



5.下图是我的项目添加zxing后的结果



6.下图是从zxing中拷贝出来的布局文件



7.下来修改AndroidManifest.xml文件

加入一下代码开启权限

<uses-permission android:name="android.permission.CAMERA" />

<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-permission android:name="android.permission.READ_CONTACTS" />


8.以上都OK了,但是zxing中的代码还是会提示R不存在,这个时候需要手动加入 import com.example.suyulin.scanqrcodetoweb.R即可,所有相关的文件都要修改。



9.新建一个Activity 代码如下,里面我加入了一个WebView

重写onActivityResult取得扫描结果

重写onDestroy是为了在关闭Activity是,释放WebVIew

onClick是按钮点击事件,用于打开摄像头开始扫描二维码。

public void onActivityResult(int requestCode, int resultCode, Intent intent)

protected void onDestroy()

public void onClick(View view)


WebActivity.java文件

package com.example.suzyulin.scanqrcodetoweb;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.TextView;

import com.google.zxing.client.android.Intents;
import com.google.zxing.client.android.history.HistoryItem;

public class WebActivity extends Activity implements View.OnClickListener{
private static final int SCAN_CODE_REQUEST_CODE = 1;
//内嵌网页
WebView mWebview;
WebSettings mWebSettings;
TextView beginLoading,endLoading,loading,mtitle,QRCodeResult;
Button btnWeb;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_web);

QRCodeResult =(TextView)findViewById(R.id.text_QRCodeResult) ;//为了放置扫描后的结果

btnWeb =(Button)findViewById(R.id.action_web) ;
//内嵌网页
mWebview = (WebView) findViewById(R.id.webView1);
//beginLoading = (TextView) findViewById(R.id.text_beginLoading);
endLoading = (TextView) findViewById(R.id.text_endLoading);
//loading = (TextView) findViewById(R.id.text_Loading);
mtitle = (TextView) findViewById(R.id.title);

mWebSettings = mWebview.getSettings();

mWebview.loadUrl("http://www.baidu.com/");
//设置不用系统浏览器打开,直接显示在当前Webview
mWebview.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
});
//设置WebChromeClient类
mWebview.setWebChromeClient(new WebChromeClient() {
//获取网站标题
@Override
public void onReceivedTitle(WebView view, String title) {
System.out.println("标题在这里");
// mtitle.setText(title);
}

//获取加载进度
@Override
public void onProgressChanged(WebView view, int newProgress) {
if (newProgress < 100) {
String progress = newProgress + "%";
// loading.setText(progress);
} else if (newProgress == 100) {
String progress = newProgress + "%";
// loading.setText(progress);
}
}
});

//设置WebViewClient类
mWebview.setWebViewClient(new WebViewClient() {
//设置加载前的函数
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
System.out.println("开始加载了");
//beginLoading.setText("开始加载了");

}

//设置结束加载函数
@Override
public void onPageFinished(WebView view, String url) {
// endLoading.setText("结束加载了");

}
});
}

public void onClick(View view){
System.out.println("onClick按钮被点击*********************!");
Intent intent = null;
switch (view.getId()){
case R.id.ButtonScan:
System.out.println("按钮被点击!onClick");

intent = new Intent(this, com.google.zxing.client.android.CaptureActivity.class);
startActivityForResult(intent, SCAN_CODE_REQUEST_CODE);
break;
default:
break;
}
}

public void BtnWebClick(View view) {
System.out.print("BtnWebClick 按钮被点击*********************!");
switch (view.getId()){
case R.id.action_web:
System.out.print("按钮被点击!BtnWebClick");
break;
default:
break;
}
}
@Override
protected void onDestroy(){
//inactivityTimer.shutdown();

if (mWebview != null) {
mWebview.loadDataWithBaseURL(null, "", "text/html", "utf-8", null);
mWebview.clearHistory();

((ViewGroup) mWebview.getParent()).removeView(mWebview);
mWebview.destroy();
mWebview = null;
}
//super.onDestroy();

super.onDestroy();
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
if(requestCode == SCAN_CODE_REQUEST_CODE && resultCode == RESULT_OK) {
System.out.println("WebActivity onActivityResult begin");
String result = intent.getExtras().getString("ResultQRCode");//intent.getStringExtra("ResultQRCode");
System.out.println("WebActivity onActivityResult end" + result);
//处理
if (result==null){
System.out.println("result == null ");
}
else {
System.out.println("result !== null ");
QRCodeResult.setText(result);
}
if (result != null) {
// QRCodeResult.setText(result);
}
}

}
}

activity_web.xml文件内容

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<RelativeLayout
android:layout_width="match_parent"
android:layout_height="136dp">

<Button
android:id="@+id/ButtonScan"
android:layout_width="267dp"
android:layout_height="55dp"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:background="@color/colorFlex"
android:onClick="onClick"
android:text="@string/action_ScanQRCode" />

<TextView
android:id="@+id/text_QRCodeResult"
android:layout_width="match_parent"
android:layout_height="73dp"
android:layout_alignParentBottom="true"
android:layout_alignParentStart="true"
android:layout_gravity="bottom|center_horizontal"
android:background="@color/transparent"
android:text="aaaaaannnnnn" />
</RelativeLayout>

<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<!--显示网页区域-->
<WebView
android:id="@+id/webView1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_gravity="bottom" />
</RelativeLayout>

</LinearLayout>

10.现在开始修改CaptureActivity.java文件中handleDecode方法

public void handleDecode(Result rawResult, Bitmap barcode, float scaleFactor)

加入一下代码

Intent result = getIntent();
//Intent result = new Intent(CaptureActivity.this,WebActivity.class);
result.putExtra("ResultQRCode",rawResult.getText());
setResult(RESULT_OK,result);
finish();

加入CaptureActivity.java文件位置

if (fromLiveScan) {
historyManager.addHistoryItem(rawResult, resultHandler);
// Then not from history, so beep/vibrate and we have an image to draw on
beepManager.playBeepSoundAndVibrate();
drawResultPoints(barcode, scaleFactor, rawResult);

//这个是为了把扫描结果传输到调用界面,2017-11-10
Intent result = getIntent(); //Intent result = new Intent(CaptureActivity.this,WebActivity.class); result.putExtra("ResultQRCode",rawResult.getText()); setResult(RESULT_OK,result); finish();
}


以上都OK了,返回第9步在WebActivity.java中可以在onActivityResult中操作返回的扫描结果

public void onActivityResult(int requestCode, int resultCode, Intent intent)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: