写在前面的话
我们在给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);
}
});
}
}