MC32N0斑马PDA读码机Android程式开发

写在前面的话

我们在给MC32N0斑马PDA读码机开发Android程序的时候,除了正常的android程序开发需要注意的事项外,还有一些重要的设定需要提前做好,不然程序是没办法在PDA上正常运行的。build.gradle的修改,Manifest类库的引用,基本命名空间的引用以及必须重载的一些方法。

重要设定

build.gradle(Module:app)

compileOnly ‘com.symbol:emdk:+’
在 dependencies 节点下添加上面的语句
切记,先增加这个,这样在用的Android Studio开发添加其他项目的时候至少会有代码提示,不然老是报错

Manifest
<uses-permission android:name="com.symbol.emdk.permission.EMDK" /> 

将 Permission权限添加到 manifest 根节点下>

<uses-library android:name="com.symbol.emdk" />

将Library类库添加到 application 节点下

添加引用

import com.symbol.emdk.EMDKManager;
import com.symbol.emdk.EMDKManager.EMDKListener;
import com.symbol.emdk.EMDKResults;
import com.symbol.emdk.barcode.BarcodeManager;
import com.symbol.emdk.barcode.ScanDataCollection;
import com.symbol.emdk.barcode.ScanDataCollection.ScanData;
import com.symbol.emdk.barcode.Scanner;
import com.symbol.emdk.barcode.Scanner.DataListener;
import com.symbol.emdk.barcode.Scanner.StatusListener;
import com.symbol.emdk.barcode.Scanner.TriggerType;
import com.symbol.emdk.barcode.ScannerConfig;
import com.symbol.emdk.barcode.ScannerException;
import com.symbol.emdk.barcode.ScannerResults;
import com.symbol.emdk.barcode.StatusData;
import com.symbol.emdk.barcode.StatusData.ScannerStates;

以上为代码读取所需基本引用命名空间,如需其他功能,需添加相应的命名空间

扩展 Activity

public class ScanTestActivity extends AppCompatActivity implements EMDKListener, StatusListener, DataListener {
 @Override
 protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_scan_test);
 }
 @Override
 public void onOpened(EMDKManager emdkManager){
 }
 @Override
 public void onClosed(){
 }
 @Override
 public void onStatus(StatusData statusData){
 }
 @Override
 public void onData(ScanDataCollection scanDataCollection){
 }
}

自定义 ScannerHelper

package com.minshing.mszxtest.helps;

import android.content.Context;

import com.minshing.mszxtest.base.BaseActivity;
import com.symbol.emdk.EMDKManager;
import com.symbol.emdk.EMDKResults;
import com.symbol.emdk.barcode.BarcodeManager;
import com.symbol.emdk.barcode.ScanDataCollection;
import com.symbol.emdk.barcode.Scanner;
import com.symbol.emdk.barcode.ScannerConfig;
import com.symbol.emdk.barcode.ScannerException;
import com.symbol.emdk.barcode.ScannerResults;
import com.symbol.emdk.barcode.StatusData;

import java.util.ArrayList;

//考虑到java不支持类的多继承,只能把自已写的BaseActivity先继承到这里了
public class ScannerHelper extends BaseActivity implements EMDKManager.EMDKListener, Scanner.StatusListener, Scanner.DataListener {

    private EMDKManager emdkManager = null;
    private BarcodeManager barcodeManager = null;
    private Scanner scanner = null;

    private String scanDataResult = "";
    private String statusDesc = "";

    @Override
    public void onOpened(EMDKManager emdkManager) {
        this.emdkManager = emdkManager;
        initBarcodeManager();
        initScanner();
    }

    private void initBarcodeManager() {
        barcodeManager = (BarcodeManager) emdkManager.getInstance(EMDKManager.FEATURE_TYPE.BARCODE);
        if (barcodeManager == null) {
            statusDesc = "Barcode scanning is not supported.";
        }
    }

    private void initScanner() {
        if (scanner == null) {
            scanner = barcodeManager.getDevice(BarcodeManager.DeviceIdentifier.DEFAULT);
            if (scanner != null) {
                scanner.addDataListener(this);
                scanner.addStatusListener(this);
                scanner.triggerType = Scanner.TriggerType.HARD;

                try {
                    scanner.enable();
                } catch (ScannerException e) {
                    statusDesc = e.getMessage();
                    deInitScanner();
                }
            } else {
                statusDesc = "Failed to initalize the scanner device.";
            }
        }
    }

    private void deInitScanner() {
        if (scanner != null) {
            try {
                scanner.release();
            } catch (Exception e) {
                statusDesc = e.getMessage();
            }
            scanner = null;
        }
    }

    @Override
    public void onClosed() {
        if (emdkManager != null) {
            emdkManager.release();
            emdkManager = null;
        }
    }

    @Override
    public void onData(ScanDataCollection scanDataCollection) {
        if ((scanDataCollection != null) && (scanDataCollection.getResult() == ScannerResults.SUCCESS)) {
            ArrayList<ScanDataCollection.ScanData> scanData = scanDataCollection.getScanData();
            for (ScanDataCollection.ScanData data : scanData) {
                String barcodeData = data.getData();
                //ScanDataCollection.LabelType labelType = data.getLabelType();
                //scanDataResult = barcodeData + " " + labelType;
                scanDataResult = barcodeData;
            }
        }
    }

    private void setConfig() {
        if (scanner != null) {
            try {
                ScannerConfig config = scanner.getConfig();
                if (config.isParamSupported("config.scanParams.decodeHaptiFeeback")) {
                    config.scanParams.decodeHapticFeedback = true;
                }
                scanner.setConfig(config);
            } catch (ScannerException e) {
                statusDesc = e.getMessage();
            }
        }
    }

    @Override
    public void onStatus(StatusData statusData) {
        StatusData.ScannerStates state = statusData.getState();
        switch (state) {
            case IDLE:
                statusDesc = statusData.getFriendlyName() + " is enabled and idle...";
                setConfig();
                try {
                    scanner.read();
                } catch (ScannerException e) {
                    statusDesc += e.getMessage();
                }
                break;
            case WAITING:
                statusDesc = "Scanner is waiting for trigger press...";
                break;
            case SCANNING:
                statusDesc = "Scanning...";
                break;
            case DISABLED:
                break;
            case ERROR:
                statusDesc = "An error has occurred.";
                break;
            default:
                break;
        }
    }

    public boolean openScanner(Context context) {
        EMDKResults results = EMDKManager.getEMDKManager(context, this);
        if (results.statusCode != EMDKResults.STATUS_CODE.SUCCESS) {
            statusDesc = "EMDKManager object request failed!";
            return false;
        } else {
            statusDesc = "EMDKManager object initialization is in progress...";
        }
        return true;
    }

    /**
     * 返回掃描到的條碼數據
     *
     * @return
     */
    public String getScanData() {
        return scanDataResult;
    }

    /**
     * 返回當前讀碼機的狀態描述
     *
     * @return
     */
    public String getStatus() {
        return statusDesc;
    }
}

实际项目调用

package com.minshing.mszxtest.kb;

import com.minshing.mszxtest.databinding.ActivityPdaKbBinding;
import com.minshing.mszxtest.helps.ScannerHelper;
import com.symbol.emdk.barcode.ScanDataCollection;

public class PdaKBActivity extends ScannerHelper {

    private ActivityPdaKbBinding viewBinding;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //切換舊的findviewbyid為ViewBinding模式
        //setContentView(R.layout.activity_pda_kb);
        viewBinding = ActivityPdaKbBinding.inflate(getLayoutInflater());
        setContentView(viewBinding.getRoot());

        //啟動讀碼機
        openScanner(getApplicationContext());
    }
        
    //重載onData方法實時獲取讀碼機讀取的數據
    @Override
    public void onData(ScanDataCollection scanDataCollection) {
        super.onData(scanDataCollection);
        //更新主線程UI畫面
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                String strResult = getScanData() + "\n" + viewBinding.tvPdakbData.getText().toString().trim();
                try {
                    strResult = strResult.substring(0, 50);
                }catch(Exception e){}
                viewBinding.tvPdakbData.setText(strResult);
            }
        });
    }
}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值