项目ITP(二) 二维码 拿起你的手机装一装,扫一扫 【每日一搏】

正文 

  上文,我们讲了 二维码生成 解码

  这次我们就用 android 来扫一下,实现android 扫二维码。

  

    下载扫一扫

包结构-介绍

  

  #com.zxing.xx   这是 zxing 库提供的

  #BarCodeActivity 

实战

  一个按钮,一个显示结果的界面

package sedion.jeffli.activity;

import sedion.jeffli.itp.R;

import com.zxing.activity.CaptureActivity;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class BarCodeActivity extends Activity
{

    private TextView resultTextView;            //返回显示结果(以后没有用的)
    private Button   scanBarCodeButton;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.barcode);

        resultTextView = (TextView) this.findViewById(R.id.tv_scan_result);
        scanBarCodeButton = (Button) this.findViewById(R.id.btn_scan_barcode);

        scanBarCodeButton.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                //打开扫描界面
                Intent openCameraIntent = new Intent(BarCodeActivity.this,CaptureActivity.class);
                startActivityForResult(openCameraIntent, 0);
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        super.onActivityResult(requestCode, resultCode, data);
        //判断处理结果,并显示
        if (resultCode == RESULT_OK)
        {
            Bundle bundle = data.getExtras();
            String scanResult = bundle.getString("result");
            //Toast.makeText(this, "result", Toast.LENGTH_LONG).show();
            resultTextView.setText(scanResult);
        }
    }
}

   #new Intent(BarCodeActivity.this,CaptureActivity.class);

     打开扫描界面 -> CaptureActivity (这个是进行扫描的activity)

   #resultCode == RESULT_OK

    判断是否成功,成功显示结果。

 

你会看到:

  

 

下面是扫描的界面:

  CaptureActivity(zxing库提供,nice)

package com.zxing.activity;

import java.io.IOException;
import java.util.Vector;

import sedion.jeffli.itp.R;
import android.app.Activity;
import android.content.Intent;
import android.content.res.AssetFileDescriptor;
import android.graphics.Bitmap;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;
import android.os.Handler;
import android.os.Vibrator;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.Result;
import com.zxing.camera.CameraManager;
import com.zxing.decoding.CaptureActivityHandler;
import com.zxing.decoding.InactivityTimer;
import com.zxing.view.ViewfinderView;
/**
 * Initial the camera
 * @author Ryan.Tang
 */
public class CaptureActivity extends Activity implements Callback {

    private CaptureActivityHandler handler;
    private ViewfinderView viewfinderView;
    private boolean hasSurface;
    private Vector<BarcodeFormat> decodeFormats;
    private String characterSet;
    private InactivityTimer inactivityTimer;
    private MediaPlayer mediaPlayer;
    private boolean playBeep;
    private static final float BEEP_VOLUME = 0.10f;
    private boolean vibrate;
    private Button cancelScanButton;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.camera);
        //ViewUtil.addTopView(getApplicationContext(), this, R.string.scan_card);
        CameraManager.init(getApplication());
        viewfinderView = (ViewfinderView) findViewById(R.id.viewfinder_view);
        cancelScanButton = (Button) this.findViewById(R.id.btn_cancel_scan);
        hasSurface = false;
        inactivityTimer = new InactivityTimer(this);
    }

    @Override
    protected void onResume() {
        super.onResume();
        SurfaceView surfaceView = (SurfaceView) findViewById(R.id.preview_view);
        SurfaceHolder surfaceHolder = surfaceView.getHolder();
        if (hasSurface) {
            initCamera(surfaceHolder);
        } else {
            surfaceHolder.addCallback(this);
            surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        }
        decodeFormats = null;
        characterSet = null;

        playBeep = true;
        AudioManager audioService = (AudioManager) getSystemService(AUDIO_SERVICE);
        if (audioService.getRingerMode() != AudioManager.RINGER_MODE_NORMAL) {
            playBeep = false;
        }
        initBeepSound();
        vibrate = true;

        //quit the scan view
        cancelScanButton.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                CaptureActivity.this.finish();
            }
        });
    }

    @Override
    protected void onPause() {
        super.onPause();
        if (handler != null) {
            handler.quitSynchronously();
            handler = null;
        }
        CameraManager.get().closeDriver();
    }

    @Override
    protected void onDestroy() {
        inactivityTimer.shutdown();
        super.onDestroy();
    }

    /**
     * Handler scan result
     * @param result
     * @param barcode
     */
    public void handleDecode(Result result, Bitmap barcode) {
        inactivityTimer.onActivity();
        playBeepSoundAndVibrate();
        String resultString = result.getText();
        //FIXME
        if (resultString.equals("")) {
            Toast.makeText(CaptureActivity.this, "Scan failed!", Toast.LENGTH_SHORT).show();
        }else {
//            System.out.println("Result:"+resultString);
            Intent resultIntent = new Intent();
            Bundle bundle = new Bundle();
            bundle.putString("result", resultString);
            resultIntent.putExtras(bundle);
            this.setResult(RESULT_OK, resultIntent);
        }
        CaptureActivity.this.finish();
    }

    private void initCamera(SurfaceHolder surfaceHolder) {
        try {
            CameraManager.get().openDriver(surfaceHolder);
        } catch (IOException ioe) {
            return;
        } catch (RuntimeException e) {
            return;
        }
        if (handler == null) {
            handler = new CaptureActivityHandler(this, decodeFormats,
                    characterSet);
        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {

    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        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();

    }

    private void initBeepSound() {
        if (playBeep && mediaPlayer == null) {
            // The volume on STREAM_SYSTEM is not adjustable, and users found it
            // too loud,
            // so we now play on the music stream.
            setVolumeControlStream(AudioManager.STREAM_MUSIC);
            mediaPlayer = new MediaPlayer();
            mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            mediaPlayer.setOnCompletionListener(beepListener);

            AssetFileDescriptor file = getResources().openRawResourceFd(
                    R.raw.beep);
            try {
                mediaPlayer.setDataSource(file.getFileDescriptor(),
                        file.getStartOffset(), file.getLength());
                file.close();
                mediaPlayer.setVolume(BEEP_VOLUME, BEEP_VOLUME);
                mediaPlayer.prepare();
            } catch (IOException e) {
                mediaPlayer = null;
            }
        }
    }

    private static final long VIBRATE_DURATION = 200L;

    private void playBeepSoundAndVibrate() {
        if (playBeep && mediaPlayer != null) {
            mediaPlayer.start();
        }
        if (vibrate) {
            Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
            vibrator.vibrate(VIBRATE_DURATION);
        }
    }

    /**
     * When the beep has finished playing, rewind to queue up another one.
     */
    private final OnCompletionListener beepListener = new OnCompletionListener() {
        public void onCompletion(MediaPlayer mediaPlayer) {
            mediaPlayer.seekTo(0);
        }
    };

}

 

 

你会看到:

  

总结

  android 二维码扫描

时间: 2024-12-08 08:24:03

项目ITP(二) 二维码 拿起你的手机装一装,扫一扫 【每日一搏】的相关文章

项目ITP(一) 二维码

正文  正文先有项目起步,项目中的需求很明确. 利用二维码扫描,然后实现签到功能. 自然和app挂钩. 没事,一步一步来. 二维码   二维码(QR(Quick Response)code),又称二维条码,它是用特定的几何图形按一定规律在平面(二维方向)上分布的黑白相间的图形,是所有信息数据的一把钥匙. 利用工具-zxing ZXing是一个开放源码的,用Java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的端口.Zxing可以实现使用手机的内置的摄像头完成条形码的扫描及解码

二维码-扫码枪触发问题,无需文本框的获取到扫码内容

问题描述 扫码枪触发问题,无需文本框的获取到扫码内容 我想让一个B/S的系统实现一个用户使用二维码登录的功能,想实现系统不需要登录窗口,直接扫码枪扫码就能提示登录,大神们有什么好的建议 (注意,是我们扫描用户卡上的二维码) 解决方案 总要有一个提示用户扫描的窗体吧,在此窗体中处理扫描事件,然后判断扫描的结果是否正确 解决方案二: 想想怎么在你的系统里接收到扫码事件,然后触发登录(同步或异步). 解决方案三: 别沉啊,大神们快来..... 解决方案四: 如果有谁知道扫码枪的触发事件或者获取的JS方

java-web 网站扫描二维码,JAVA开发的

问题描述 web 网站扫描二维码,JAVA开发的 网页怎么调用手机,PAD摄像头扫二维码(不是android,是JAVAweb项目) 解决方案 html5拍照上传http://bbs.9ria.com/thread-215588-1-1.htmlhttp://blog.163.com/very_apple/blog/static/277592362014429114744615/ 至于识别二维码,可以用zxing 解决方案二: 你的网站怎么扫别人的二维码,别人有吗,你能得到吗 解决方案三: 外网

巨头介入致二维码成高危行业:小公司纷纷出局

2013年1月8日,行人在"扫"光明楼公交车站广告牌上的二维码,作为移动互联网的关键入口,目前二维码在国内呈现出爆发式的增长.新京报记者 王贵彬 摄二维码已成移动互联网重要入口,巨头加入竞争,市场先驱者.小公司纷纷"出局"通过手机摄像头拍摄二维码,有一个新的名词加以定义:"扫一扫".这小小的动作,却是移动互联时代兵家之必争.随着移动互联网的爆发,二维码这个可以打通线下.线上,为网上购物.移动支付.电子票务.优惠券等提供了便捷入口的"小方

在IE浏览器中将当前网页网址生成二维码

  现在在我们的网络活动中随时可以见到二维码,二维码确实给我们带来很多方便,用手机一扫即可打开二维码中包含的信息. 当我们在使用浏览器访问网站的时候经常可能会遇到这么一种情况,想把当前浏览的网页放在手机中打开,网址比较短的话可能会选择输入,要是网址比较长这个时候输入是比较痛苦的. 小编就会选择在百度中输入二维码,然后用工具将这个网址生成二维码,但是也是比较麻烦的,有没有什么方法可以在IE浏览器中一键将当前网页网址生成二维码呢? 在百度中一搜索发现确实有一些IE二维码插件,只需安装该插件以后就可以

如何在IE浏览器中将当前网页网址生成二维码

  现在在我们的网络活动中随时可以见到二维码,二维码确实给我们带来很多方便,用手机一扫即可打开二维码中包含的信息. 当我们在使用浏览器访问网站的时候经常可能会遇到这么一种情况,想把当前浏览的网页放在手机中打开,网址比较短的话可能会选择输入,要是网址比较长这个时候输入是比较痛苦的. 小编就会选择在百度中输入二维码,然后用工具将这个网址生成二维码,但是也是比较麻烦的,有没有什么方法可以在IE浏览器中一键将当前网页网址生成二维码呢? 在百度中一搜索发现确实有一些IE二维码插件,只需安装该插件以后就可以

link环境下制作一款《订餐软件》,通过网页订餐的时候是否需要制作二维码?没有思路了,谢谢

问题描述 link环境下制作一款<订餐软件>,通过网页订餐的时候是否需要制作二维码?没有思路了,谢谢 link环境下制作一款<订餐软件>,通过网页订餐的时候是否需要制作二维码?没有思路了,谢谢 解决方案 问题是你是否需要生成二维码,生成的这个二维码是要干嘛的?方便移动端用户扫码登陆系统还是干嘛,如果是可以生成,参考这个:http://www.cnblogs.com/xusir/p/3473554.html 解决方案二: 二维码说店铺地址还是单品信息你都没确定

创建二维码-创建一个婚纱摄影店的二维码。

问题描述 创建一个婚纱摄影店的二维码. 我是一名婚纱摄影店的一名摄影师,我们老板最近想在微信上推广我们店子,所以想创建一个二维码,然后我们去发传单,别人用手机扫一扫,就可以加入我们的二维码,看到我们公司的信息?希望大家尽快告诉我,怎样创建? 解决方案 不知道你们店 是需要在二维码里 显示什么信息 单纯的文字 还是 指向你们店的网站 网上 有很多制作二维码的 在线工具

手机支付宝二维码该怎么解决?

问题描述 手机支付宝二维码该怎么解决? (企业账号)支付宝的二维码怎么固定金额,并且在二维码上带上标识,可以让每个人来扫? 举个栗子:一台自助洗车机器,在上面贴个金额固定的二维码,并且该二维码还能带上设备的标识,消费者扫码支付之后.可以驱动机器. 我现在就是二维码搞不定.当面付的demo里,也有生成二维码的,但是只能支付一次. 刚出来工作,第一次就弄支付宝. 现在没有后台,全是在手机端完成,之后再放后台 解决方案 企业码不带金额信息,用户扫的时候唤起收银台,填写金额后进行支付. 你的需求可以创建