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

Android平台上二维码的生成与扫描

2016-07-09 07:47 429 查看
  二维码,在现实生活中有很多的应用,手机二维码功能更是最常见的了,今天我们就在Android平台上实现二维码的生成与扫描

一、准备

工具库下载:BarCodeTest         (可点击直接下载或者去以下链接下载适合自己的:https://github.com/zxing

二、开始编程

1、导入下载的BarCodeTest库,点击左上角的“File->import”进行导入下载好的库文件工程,如下图所示选择“Existing Project into Workspace”选项后继续点击“Next”



[align=left] [/align]

点击“Next”界面之后,出现如下图所示界面,进行文件的选择,然后单击Finish完成导入。



2、导入完成之后,我们看到在项目中含有错误提示,此时需要进行对BarCodeTest进行配置,具体步骤是右键点击项目,然后进入“属性”对话框,进行如下图所示配置,即给项目一个SDK版本和将其设置为库文件,最后点击“OK”完成:



3、配置完成之后,我们发现项目中仍有问题,我们需要定位到错误文件DecodeHandler.java类和CaptureActivityHandler类,分别对以上类进行如下代码修改(即将Switch条件判断语句更改为If else语句):
@Override
public void handleMessage(Message message) {
if (message.what==R.id.decode) {
//Log.d(TAG, "Got decode message");
decode((byte[]) message.obj, message.arg1, message.arg2);
} else if (message.what==R.id.quit){
Looper.myLooper().quit();
}
}

更改CaptureActivityHandler后的代码:
 
@Override
public void handleMessage(Message message) {
if (message.what==R.id.auto_focus) {
if (state == State.PREVIEW) {
CameraManager.get().requestAutoFocus(this, R.id.auto_focus);
}
} else if(message.what==R.id.restart_preview){
Log.d(TAG, "Got restart preview message");
restartPreviewAndDecode();
}
else if(message.what==R.id.decode_succeeded){
Log.d(TAG, "Got decode succeeded message");
state = State.SUCCESS;
Bundle bundle = message.getData();

/***********************************************************************/
Bitmap barcode = bundle == null ? null :
(Bitmap) bundle.getParcelable(DecodeThread.BARCODE_BITMAP);
activity.handleDecode((Result) message.obj, barcode);
/***********************************************************************/
}
else if(message.what==R.id.decode_failed){
// We're decoding as fast as possible, so when one decode fails, start another.
state = State.PREVIEW;
CameraManager.get().requestPreviewFrame(decodeThread.getHandler(), R.id.decode);
}
else if(message.what==R.id.return_scan_result){
Log.d(TAG, "Got return scan result message");
activity.setResult(Activity.RESULT_OK, (Intent) message.obj);
activity.finish();
}
else if(message.what==R.id.launch_product_query){
Log.d(TAG, "Got product query message");
String url = (String) message.obj;
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
activity.startActivity(intent);
}
}


4、在完成以上工作之后,我们的准备工作已经完成,接着我们开始新建一个项目,项目中,我们需要使用到刚才和创建的库,故我们进行导入,右键单击项目。然后进行点击“属性”,进入到如下界面,点击“Add”按钮进行项目库的添加,添加BarCodeTest项目即可



[align=left] [/align]

5、现在我们进行布局文件的设置,其中activity-main中代码如下所示:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.android_008_qrcodetest.MainActivity"
android:background="@drawable/bg" >

<Button
android:id="@+id/scan"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="27dp"
android:text="扫描二维码" />
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:editable="true"

android:text="show"
/>
<EditText
android:id="@+id/input"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="请输入要生成二维码的信息"
/>
<Button
android:id="@+id/gen"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="生成二维码"
/>
<ImageView
android:id="@+id/img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
/>
</LinearLayout>

界面结果为如下所示:



6、为了能够显示生成的二维码,我们需要新建一个布局文件,命名为qrcoderesult.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"
android:background="@drawable/bg">

<ImageView
android:id="@+id/img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
/>
</LinearLayout>

效果如下图所示:



7、在创建完布局文件之后,我们进行编写类代码,其中MainActivity代码如下所示:
package com.example.android_008_qrcodetest;

import com.zxing.activity.CaptureActivity;
import com.zxing.encoding.EncodingHandler;

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.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {
private Button scanButton;
private TextView text;
private EditText input;
private Button genButton;
private ImageView img;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

scanButton = (Button) findViewById(R.id.scan);
text = (TextView) findViewById(R.id.text);
scanButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "扫描", 1).show();
Intent startScan = new Intent(MainActivity.this,
CaptureActivity.class);
// startActivity(startScan);
// 用于打开意图,此意图能够得到返回值
startActivityForResult(startScan, 0);
}
});
input = (EditText) findViewById(R.id.input);
genButton = (Button) findViewById(R.id.gen);
// img=(ImageView) findViewById(R.id.img);
genButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
try {
// 生成与获取二维码
String in = input.getText().toString();
Bitmap qrcode = EncodingHandler.createQRCode(in, 800);
if (in.equals("")) {
Toast.makeText(MainActivity.this, "请添加内容然后生成二维码", 1)
.show();
} else {
// img.setImageBitmap(qrcode);
Intent intent = new Intent(MainActivity.this,
QrcodeResult.class);
intent.putExtra("inputqrcode", in);
startActivity(intent);
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

// 用来接收扫描的Activity传回的值
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
String result = data.getExtras().getString("result");
text.setText(result);
}
}
}


8、为了接受生成的二维码,我们创建一个新类QrcodeResult,用于接收MainActivity类中传来的字符串并进行二维码的生成与显示,代码如下所示:
package com.example.android_008_qrcodetest;

import com.zxing.activity.CaptureActivity;
import com.zxing.encoding.EncodingHandler;

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.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
public class QrcodeResult extends Activity {
private Button scanButton;
private TextView text;
private Button genButton;
private ImageView img;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.qrcoderesult);
img=(ImageView) findViewById(R.id.img);
String in =getIntent().getStringExtra("inputqrcode");
System.out.println(in);
try {
//生成与获取二维码
Bitmap qrcode=EncodingHandler.createQRCode(in,800);
if(in.equals(""))
{
Toast.makeText(QrcodeResult.this, "请添加内容然后生成二维码", 1).show();
}
else
{
img.setImageBitmap(qrcode);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}

9、在完成以上工作之后,我们就能够进行测试,点击运行,能够进行扫描二维码如下图所示:



也能够生成二维码



10、在上述案例中,我们完成了简单的而二维码生成与扫描的功能,但是实际使用中不会仅仅用于生成,因此我们需要在项目中灵活的使用。
 
以上就是Android平台上二维码的生成与扫码的实现

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