iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Android开发怎么实现模仿360二维码扫描功能
  • 413
分享到

Android开发怎么实现模仿360二维码扫描功能

android 2023-05-30 19:05:57 413人浏览 独家记忆
摘要

小编给大家分享一下Android开发怎么实现模仿360二维码扫描功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体如下:一、效果图:二、框架搭建首先,下载最新

小编给大家分享一下Android开发怎么实现模仿360二维码扫描功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

具体如下:

一、效果图:

Android开发怎么实现模仿360二维码扫描功能

Android开发怎么实现模仿360二维码扫描功能

二、框架搭建

首先,下载最新zxing开源项目。 下载地址:Http://code.Google.com/p/zxing/

或 点击此处本站下载

分析项目结构,明确扫描框架需求。在zxing中,有很多其他的功能,项目结构比较复杂;针对二维码QRCode扫描,我们需要几个包:

(1)com.google.zxing.client.android.Camera 基于Camera调用以及参数配置,核心包
(2)DecodeFORMatManager、DecodeThread、DecodeHandler 基于解码格式、解码线程、解码结果处理的解码类
(3)ViewfinderView、ViewfinderResultPointCallBack 基于取景框视图定义的View类
(4)CaptuReactivity、CaptureActivityHandler 基于扫描Activity以及扫描结果处理的Capture类
(5)InactivityTimer、BeepManager、FinishListener 基于休眠、声音、退出的辅助管理类
(6)Intents、IntentSource、PrefrencesActivity 基于常量存储的常量类

新建工程,添加如下权限permission:

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

添加core.jar文件,并BuildPath;将上述类或包加入工程后,会报一系列错误,原因有几点:

(1)资源文件缺乏,将zxing下需要的资源文件copy到新工程下
(2)版本兼容问题,zxing下很多技术都是使用4.0版本及以上,集成到低版本之后,须做相应改动,详情参照项目源码
(3)包结构引用问题,需要重新导入包引用

最后框架

Android开发怎么实现模仿360二维码扫描功能

三、具体实现

创建MainActivity用于跳转到扫描页面

public class MainActivity extends Activity {  private Button mBtnScan;  private Button mBtnBack;  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    mBtnBack = (Button) findViewById(R.id.btn_back);    mBtnBack.setVisibility(View.GONE);    mBtnScan = (Button) findViewById(R.id.btn_scan);    mBtnScan.setOnClickListener(new View.OnClickListener() {      @Override      public void onClick(View v) {        startActivity(new Intent(MainActivity.this, ScanActivity.class));      }    });  }}

布局文件

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  xmlns:tools="http://schemas.android.com/tools"  android:layout_width="match_parent"  android:layout_height="match_parent" >  <Button    android:id="@+id/btn_scan"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_centerInParent="true"    android:textColor="@color/white"    android:padding="20dp"    android:background="@drawable/btn_scan_result"    android:text="扫一扫" />  <include      android:layout_width="fill_parent"      android:layout_height="wrap_content"      android:layout_alignParentTop="true"      layout="@layout/activity_scan_title" /></RelativeLayout>

扫描页面

public class ScanActivity extends Activity implements Callback {  private static final float BEEP_VOLUME = 0.10f;  protected static final String RESULT_TEXT = "result";  protected static final String RESULT_BITMAP = "bitmap";    private SurfaceView mSurfaceView;    private ViewfinderView mFindView;    private CaptureActivityHandler mHandler;    private boolean hasSurface;    private Vector<BarcodeFormat> mDecodeFormats;    private String characterSet;    private InactivityTimer inactivityTimer;    private MediaPlayer mediaPlayer;    private boolean playBeep;    private boolean vibrate;  @Override  public void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_scan);    init();  }    private void init() {    mSurfaceView = (SurfaceView) findViewById(R.id.preview_view);    mFindView = (ViewfinderView) findViewById(R.id.viewfinder_view);    CameraManager.init(getApplication());    hasSurface = false;    inactivityTimer = new InactivityTimer(this);  }    @SuppressWarnings("all")  @Override  protected void onResume() {    super.onResume();    // 先重新获得holder    SurfaceHolder surfaceHolder = mSurfaceView.getHolder();    if (hasSurface) {      initCamera(surfaceHolder);    } else {      surfaceHolder.addCallback(this);      surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);    }    mDecodeFormats = null;    characterSet = null;    playBeep = true;    AudioManager audiOService = (AudioManager) getSystemService(AUDIO_SERVICE);    // 如果当前是铃音模式,则继续准备下面的 蜂鸣提示音操作,如果是静音或者震动模式。就不要继续了。因为用户选择了无声的模式,我们就也不要出声了。    if (audioService.getRingerMode() != AudioManager.RINGER_MODE_NORMAL) {      playBeep = false;    }    // 初始化播放声音    initBeepSound();    //播放    vibrate = true;  }  @Override  protected void onPause() {    super.onPause();    if (mHandler != null) {      mHandler.quitSynchronously();      mHandler = null;    }    // 关闭摄像头信息    CameraManager.get().closeDriver();  }  @Override  protected void onDestroy() {    // 关闭定时器    inactivityTimer.shutdown();    super.onDestroy();  }    public void handleDecode(Result result, Bitmap barcode) {    // 添加定时器    inactivityTimer.onActivity();    // 响铃和震动    playBeepSoundAndVibrate();    String resultString = result.getText();    if (TextUtils.isEmpty(resultString)) {      ToastUtil.show(this, "扫描失败");      ScanActivity.this.finish();    } else {      //扫描完成后传递结果      Intent resultIntent = new Intent();      resultIntent.setClass(ScanActivity.this, ScanResultActivity.class);      resultIntent.putExtra(RESULT_TEXT, resultString);      ByteArrayOutputStream baos = new ByteArrayOutputStream();      barcode.compress(Bitmap.CompressFormat.PNG, 100, baos);      byte[] bitmapByte = baos.toByteArray();      resultIntent.putExtra(RESULT_BITMAP, bitmapByte);      startActivity(resultIntent);      overridePendingTransition(R.anim.activity_in_from_rigth, R.anim.activity_out_to_scale);      ScanActivity.this.finish();    }  }  private void initCamera(SurfaceHolder surfaceHolder) {    try {      CameraManager.get().openDriver(surfaceHolder);    } catch (IOException ioe) {      return;    } catch (RuntimeException e) {      return;    }    if (mHandler == null) {      mHandler = new CaptureActivityHandler(this, mDecodeFormats, 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 mFindView;  }  public Handler getHandler() {    return mHandler;  }  public void drawViewfinder() {    mFindView.drawViewfinder();  }    private void initBeepSound() {    // 如果要播放声音并且没有播放器时    if (playBeep && mediaPlayer == null) {      // 设置声道流格式为音乐      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);      // 第一个参数,指代一个震动的频率数组。每两个为一组,每组的第一个为等待时间,第二个为震动时间。      // 比如 [2000,500,100,400],会先等待2000毫秒,震动500,再等待100,震动400      // 第二个参数,repest指代从 第几个索引(第一个数组参数) 的位置开始循环震动。      // 会一直保持循环,我们需要用 vibrator.cancel()主动终止      // vibrator.vibrate(new long[]{300,500},0);    }  }    private final MediaPlayer.OnCompletionListener beepListener = new MediaPlayer.OnCompletionListener() {    public void onCompletion(MediaPlayer mediaPlayer) {      mediaPlayer.seekTo(0);    }  };}

布局文件

<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"  android:layout_width="match_parent"  android:layout_height="match_parent" >  <RelativeLayout    android:layout_width="match_parent"    android:layout_height="match_parent" >    <SurfaceView      android:id="@+id/preview_view"      android:layout_width="fill_parent"      android:layout_height="fill_parent"      android:layout_gravity="center" />    <com.android.scan.view.ViewfinderView      android:id="@+id/viewfinder_view"      android:layout_width="wrap_content"      android:layout_height="wrap_content" />    <include      android:layout_width="fill_parent"      android:layout_height="wrap_content"      android:layout_alignParentTop="true"      layout="@layout/activity_scan_title" />  </RelativeLayout></FrameLayout>

结果页面

public class ScanResultActivity extends Activity {  private EditText mEtScan;  private Button mBtnBack;  private Button mBtnCopy;  private ImageView mImageView;  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_scan_result);    initViews();    init();  }  private void init() {    final String result = getIntent().getStringExtra(ScanActivity.RESULT_TEXT);    mEtScan.setText(result);    final ClipboardManager cm = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);    mBtnBack.setOnClickListener(new View.OnClickListener() {      @Override      public void onClick(View v) {        ScanResultActivity.this.finish();      }    });    mBtnCopy.setOnClickListener(new OnClickListener() {      @Override      public void onClick(View v) {        if (result!=null) {          ClipData myClip = ClipData.newPlainText("text", result);          cm.setPrimaryClip(myClip);        }      }    });    //设置图片信息    byte[] imgByte = getIntent().getByteArrayExtra(ScanActivity.RESULT_BITMAP);    if (imgByte != null) {      Drawable drawable = BitmapUtil.byte2Drawable(imgByte);      if (drawable != null) {        mImageView.setImageDrawable(drawable);      }    }  }  // public void paste(View view){  // ClipData abc = myClipboard.getPrimaryClip();  // ClipData.Item item = abc.getItemAt(0);  // String text = item.getText().toString();  // pasteField.setText(text);  // Toast.makeText(getApplicationContext(), "Text Pasted",  // Toast.LENGTH_SHORT).show();  // }  private void initViews() {    mEtScan = (EditText) findViewById(R.id.et_scan_result);    mBtnBack = (Button) findViewById(R.id.btn_back);    mBtnCopy = (Button) findViewById(R.id.btn_copy);  }}

以上是“Android开发怎么实现模仿360二维码扫描功能”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: Android开发怎么实现模仿360二维码扫描功能

本文链接: https://www.lsjlt.com/news/220708.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android开发怎么实现模仿360二维码扫描功能
    小编给大家分享一下Android开发怎么实现模仿360二维码扫描功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体如下:一、效果图:二、框架搭建首先,下载最新...
    99+
    2023-05-30
    android
  • Android中怎么实现二维码扫描功能
    这期内容当中小编将会给大家带来有关Android中怎么实现二维码扫描功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1 开发准备1.1 android studio 安装&emsp;&e...
    99+
    2023-06-04
  • 基于barcodescanner实现Android二维码扫描功能
    二维码扫描现在成为一种非常常见的APP基础功能,附录1是我曾经用过的二维码/条形码扫描开源项目,但是附录1的项目集成和二次定制比较繁琐和麻烦,因此可以发现不少人基于ZXing做了二次的开发,并贡献出这些项目,发到github上,其中barc...
    99+
    2023-05-30
    android 二维码 barcodescanner
  • jQuery如何实现二维码扫描功能
    这篇文章主要介绍了jQuery如何实现二维码扫描功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。二维码:利用图形模拟二进制0、1的概念,达...
    99+
    2024-04-02
  • Android studio 实现生成二维码和扫描二维码
    效果图 build.gradle(:app)添加依赖 dependencies { implementation 'com.google.zxing:core:3.3.3' imple...
    99+
    2023-09-30
    android studio android ide
  • 如何使用HTML5实现二维码扫描功能
    本篇内容介绍了“如何使用HTML5实现二维码扫描功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!   ...
    99+
    2024-04-02
  • flutter开发实战-flutter二维码条形码扫一扫功能实现
    flutter开发实战-flutter二维码条形码扫一扫功能实现 flutter开发实战-flutter二维码扫一扫功能实现,要使用到摄像头的原生的功能,使用的是插件:scan 效果图如下 一、扫一...
    99+
    2023-09-02
    flutter 扫一扫 二维码 条形码
  • Flutter实现扫二维码功能
    本文实例为大家分享了Flutter实现扫二维码功能的具体代码,供大家参考,具体内容如下 首先在pubspec.yaml中添加: dependencies:   qrscan: ^0....
    99+
    2024-04-02
  • Java能否实现高效二维码扫描?
    二维码是一种二维条形码,它可以被扫描和解码,以提供有关商品和服务的信息。二维码在现代社会中得到了广泛的应用,例如在商业、支付、社交媒体等领域。Java作为一种流行的编程语言,能否实现高效二维码扫描呢?本文将对此进行探讨。 二维码扫描的基...
    99+
    2023-10-23
    numy 二维码 并发
  • 使用微信小程序实现二维码扫描功能
    使用微信小程序实现二维码扫描功能随着移动互联网的快速发展,二维码已经成为了一种非常方便的信息交互方式。微信小程序作为一种新的应用形式,也提供了二维码扫描功能。本文将介绍如何使用微信小程序实现二维码扫描,并提供具体的代码示例。一、准备工作在开...
    99+
    2023-11-21
    二维码 微信小程序 扫描
  • 如何使用Java对象实现二维码扫描功能?
    在现代社会中,二维码已经成为了一种非常重要的信息传递方式。二维码的使用范围非常广泛,包括支付、物流、广告等多个领域。因此,如何使用Java对象实现二维码扫描功能是非常重要的。本文将介绍如何使用Java对象实现二维码扫描功能,并附带演示代码。...
    99+
    2023-09-18
    二维码 开发技术 对象
  • Android中google Zxing实现二维码与条形码扫描
    Android中google Zxing实现二维码与条形码扫描了解二维码这个东西还是从微信中,当时微信推出二维码扫描功能,自己感觉挺新颖的,从一张图片中扫一下竟然能直接加好友,不可思议啊,那时候还不了解二维码,呵呵,然后做项目的时候,老板说...
    99+
    2023-05-31
    android zxing 二维码
  • java微信扫描公众号二维码实现登陆功能
    本文实例为大家分享了java微信扫描公众号二维码实现登陆的具体代码,供大家参考,具体内容如下前提条件: 微信公众平台为服务号, 2.服务号实现了账号绑定功能,即将open_id 与业务系统中的用户名有对应关系具体实现原理: 用户访问业务系统...
    99+
    2023-05-31
    java 二维码
  • 微信开发者工具模拟扫描二维码调试
    本文主要介绍如何在微信开发者工具中,模拟微信扫描二维码打开小程序的场景,进行调试。(小程序码不太一样) 小程序码调试可以看这篇文章:获取微信小程序码传递的参数 / 微信开发者工具模拟扫描小程序码调试 ...
    99+
    2023-09-18
    小程序 微信小程序
  • Flutter如何实现扫二维码功能
    这篇文章主要为大家展示了“Flutter如何实现扫二维码功能”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Flutter如何实现扫二维码功能”这篇文章吧。具体内容如下首先在pubspec.yam...
    99+
    2023-06-29
  • GO语言开发二维码扫描器:如何快速实现?
    二维码是一种很方便的信息传递方式,它可以把大量的信息编码到一个小小的二维码中,我们可以通过扫描二维码来获取信息。在我们的日常生活中,二维码扫描器已经成为了一个很重要的工具。那么,如何使用GO语言来快速实现一个二维码扫描器呢?本文将会详细介...
    99+
    2023-07-19
    二维码 开发技术 load
  • 怎么在HTML5中使用MUI框架实现一个二维码扫描功能
    怎么在HTML5中使用MUI框架实现一个二维码扫描功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。<!doctype html>&nbs...
    99+
    2023-06-09
  • PHP教程:如何在容器中实现二维码扫描功能?
    二维码扫描功能已经成为现代社会中非常常见的一种功能,它的应用场景也越来越广泛。而在开发中,我们经常需要在应用程序中加入二维码扫描功能。本文将介绍如何在容器中实现二维码扫描功能。 一、准备工作 在开始之前,我们需要准备一些东西: 安装 D...
    99+
    2023-07-09
    教程 二维码 容器
  • Android扫描WIFI权限功能怎么实现
    这篇文章主要介绍“Android扫描WIFI权限功能怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Android扫描WIFI权限功能怎么实现”文章能帮助大家解决问题。权限根据官方文档描述,扫...
    99+
    2023-07-05
  • vue实现二维码扫码功能(带样式)
    需求: 利用vue实现二维码扫描; 插件: QRCodeReader; 插件下载 npm install --save vue-qrcode-reader 注意: 需要在https协...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作