linhaimi 发表于 2013-8-22 17:25:59

最便宜的条码枪,支持二维码

本帖最后由 linhaimi 于 2013-8-23 19:53 编辑

有的时候我们需要扫描一些条码(或许是一个淘宝小卖家,或者其它什么物流、个人库管什么的),一个条码枪不便宜,二维码枪就更贵了。

在这里提供一个将任何一个有摄像头(最好可以变焦)、支持WiFi的Android设备变为一个“专业”的条码枪的方法。
不释放APK文件,需要的自行编译。

这里是工程文件:

关键代码:

package com.amobbs.codeinput;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

import com.google.zxing.integration.android.IntentIntegrator;
import com.google.zxing.integration.android.IntentResult;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends Activity {

        public IntentIntegrator II = null;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                II = new IntentIntegrator(this);
        }

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
                // Inflate the menu; this adds items to the action bar if it is present.
                getMenuInflater().inflate(R.menu.main, menu);
                return true;
        }

        public void Scan(View v) {
                II.initiateScan(IntentIntegrator.ALL_CODE_TYPES);
        }

        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
                final IntentResult result = IntentIntegrator.parseActivityResult(
                                requestCode, resultCode, data);
                if (result != null) {
                        String contents = result.getContents();
                        if (contents != null) {
                                Thread THREAD = new Thread(new Runnable() {
                                        @Override
                                        public void run() {
                                                try {
                                                        TextView v_IP = (TextView) findViewById(R.id.editText_IP);
                                                        TextView v_PORT = (TextView) findViewById(R.id.editText_PORT);
                                                        String IP = v_IP.getText().toString();
                                                        Integer PORT = Integer.parseInt(v_PORT.getText()
                                                                        .toString());
                                                        byte[] DATA = result.getContents().getBytes();
                                                        DatagramPacket packet = new DatagramPacket(DATA,
                                                                        DATA.length, InetAddress.getByName(IP),
                                                                        PORT);
                                                        DatagramSocket socket = new DatagramSocket(10010);
                                                        socket.send(packet);
                                                        socket.close();
                                                } catch (Exception e) {
                                                }
                                        }
                                });
                                THREAD.start();
                        }
                }
                super.onActivityResult(requestCode, resultCode, data);
        }
}

这里是Windows脚本(PowerShell):

#在 PowerShell ISE 的命令行中输入 .Assembly.Location 可以获得 System.Windows.Forms.dll 的路径信息
Add-Type -Path C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Windows.Forms\v4.0_4.0.0.0__b77a5c561934e089\System.Windows.Forms.dll
$Device = New-Object System.Net.Sockets.UdpClient(10086)
$ip = New-Object System.Net.IPEndPoint(::Any, 0)
while($true)
{
    $msg = $Device.Receive($ip)
    $msg = ::UTF8.GetString($msg)
    ::SendWait($msg)
    ::SendWait('~') #附加一个回车符
}

首先启动 PowerShell 脚本(启动后可以最小化什么的,反正就不管了……),然后 Android 设备通过调用ZXing实现条码的扫描,然后将结果以UDP协议从10010端口发送出去,电脑的脚本在10086端口接收到数据以后,通过模拟按键的方式输出,可以用于Excel或其他需要输入条码信息的地方。

如果你觉得这篇文章对你有用,可以捐赠一点 BTC 给我玩玩,帐号是 1E5Y3yDywdanJtEwEHZYv3igGwnsZSp58r


补充一下:
1.程序需要“条码扫描器”的支持,也就是 zxing-2.2\android 这个文件夹里面的项目(即Google官方的开源条码扫描器),在使用这个程序之前建议手动编译下载安装 zxing-2.2\android ,非 Google Play 下载安装的条码扫描器感觉权限要得太过分了。
2.如果你没有安装“条码扫描器”,第一次使用的时候会联网通过某些应用商店安装,但是应用商店里面的“条码扫描器”可能版本什么的问题(例如图片放大或者不能对焦什么的……),建议自己编译安装。
3. PowerShell 尤其是 PowerShell ISE 智能感知灰常强大,编写小工具基本不开VisualStudio了,而且属于系统自带。

jsntzxh 发表于 2013-8-22 21:42:04

好东东,学习

STM32_Study 发表于 2013-8-22 22:05:46

支持楼主~~~

好东西~~~

aureole 发表于 2013-8-22 22:13:29

呵呵,谁会给你 BTC 啊,都没有。。。

csx163 发表于 2013-8-22 23:53:28

zxing感觉有些慢,不知道有木有更快的

soosqt 发表于 2013-8-23 09:30:57

不错,收藏,以后可能有用

linhaimi 发表于 2013-8-23 13:55:20

有一个想法:

(扫描可见{:lol:})

wkman 发表于 2013-8-23 14:13:34

{:victory:}{:lol:}啥都不懂。看看

vmalloc 发表于 2017-9-18 12:30:55

关注,标记一下
页: [1]
查看完整版本: 最便宜的条码枪,支持二维码