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

一、准备

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

二、开始编程

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

android stuido使用codeium android code generator_ide

 

 

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

android stuido使用codeium android code generator_android平台_02

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

android stuido使用codeium android code generator_android_03

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项目即可

android stuido使用codeium android code generator_android平台_04

 

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>

界面结果为如下所示:

android stuido使用codeium android code generator_二维码_05

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>

效果如下图所示:

android stuido使用codeium android code generator_android平台_06

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、在完成以上工作之后,我们就能够进行测试,点击运行,能够进行扫描二维码如下图所示:

android stuido使用codeium android code generator_android平台_07

也能够生成二维码

android stuido使用codeium android code generator_android_08

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

 

以上就是Android平台上二维码的生成与扫码的实现