Sunmi收银demo

 商米提供一个简易文档来展示如何使用副屏,扫码,打印,电子秤,人脸支付等功能。支持台式收银系列(除T1,T1Mini),手持非金融系列,电子秤系列,K1

SunmiDemo下载

酒店自助发卡demo,包含身份证读取,发卡,指示灯控制

SunmiHotel下载

2.0.0
增加支付开关,增加自动安装支付宝刷脸支付app,合并版本

由于使用了GreenDao,下载使用时需要build一下生成daomaster和daosession

Sunmi收银demo介绍

T1设备请参考开发者文档上T1目录下的内容,这里不做介绍

参考代码在s
和main目录下

使用支付宝刷脸支付时,需使用商米收银台实现刷脸功能,具体请联系商米客服。

功能介绍:

1.
双屏功能:

商米双屏设备分
15.6寸大屏和10寸小屏,其中15.6寸副屏支持触控。有且仅当副屏为Presentation显示时才能获取触控。

双屏使用的是Presentation类来实现双屏异显:

首先是权限

创建一个类继承
Presentation

public
class TextDisplay extends Presentation

获得真实存在的副屏

public
Display getPresentationDisplays() {

DisplayManager
mDisplayManager = (DisplayManager)
getSystemService(Context.DISPLAY_SERVICE);

displays
= mDisplayManager.getDisplays();

for
(int i = 0; i < displays.length; i++) {

Log.e(TAG,
“屏幕”
+ displays[i]);

if
((displays[i].getFlags() & Display.FLAG_SECURE) != 0

&&
(displays[i].getFlags() &
Display.FLAG_SUPPORTS_PROTECTED_BUFFERS) != 0

&&
(displays[i].getFlags() & Display.FLAG_PRESENTATION) != 0) {

Log.e(TAG,
“第一个真实存在的副屏屏幕”
+ displays[i]);

return
displays[i];

}

}

return
null;

}

显示副屏

textDisplay
= new TextDisplay(this, getPresentationDisplays());

textDisplay.show();

既可实现在副屏显示页面

2.打印服务

商米打印服务是使用AIDL自行研发

其中 k1系列的打印服务和台式的有些许不同,连接方式如下

自助系列

private
void connectKPrintService() {

Intent
intent = new Intent();

intent.setPackage(“com.sunmi.extprinterservice”);

intent.setAction(“com.sunmi.extprinterservice.PrinterService”);

bindService(intent,
connService, Context.BIND_AUTO_CREATE);

}

private
ServiceConnection connService = new ServiceConnection() {

@Override

public
void onServiceDisconnected(ComponentName name) {

extPrinterService
= null;

}

@Override

public
void onServiceConnected(ComponentName name, IBinder service) {

extPrinterService
= ExtPrinterService.Stub.asInterface(service);

}

};

台式与手持系列:

在gradle中

dependencies
{

implementation ‘com.sunmi:printerlibrary:1.0.5’

}

兼容以前的aidl方式

 private SunmiPrinterService woyouService = null;//商米标准打印 打印服务

    //连接打印服务

    private void connectPrintService() {

        try {

            InnerPrinterManager.getInstance().bindService(this,

                    innerPrinterCallback);

        } catch (InnerPrinterException e) {

            e.printStackTrace();

        }

    }

    private InnerPrinterCallback innerPrinterCallback = new InnerPrinterCallback() {

        @Override

        protected void onConnected(SunmiPrinterService service) {

            woyouService = service;

        }

        @Override

        protected void onDisconnected() {

            woyouService = null;

        }

    };

3.
支付(支持
扫码支付,支付宝刷脸支付)

 推荐使用Sunmi收银台聚合支付。

详细使用方式和情况请联系商米客服与
李龙涛 Phone:
18600976160

demo中只提供基础交易方式

初始化

PayMentPayPresenter
payMentPayPresenter = new PayMentPayPresenter(mContext);

注册监听

payMentPayPresenter.init(callback);

开启刷脸支付

payMentPayPresenter.startFaceService(orderId,
phoneNumber,money);

开启扫码支付

payMentPayPresenter.startPayCode(orderId,
qrCode ,money);

关闭sunmi收银

payMentPayPresenter.destoryReceiver();

消息接收广播

public
class ResultReceiver extends BroadcastReceiver {

private
static final String TAG = “ResultReceiver”;

@Override

public
void onReceive(Context context, Intent intent) {

if
(“sunmi.payment.action.result”.equals(intent.getAction()))
{

String
responseStr = intent.getStringExtra(“response”);

Log.e(TAG,
“response = ” + responseStr);

final
PaymentResponse response = JSON.parseObject(responseStr,
PaymentResponse.class);

if
(“T00”.equals(response.resultCode)) {

aliResultCallback.onSuccess(response);

}
else {

aliResultCallback.onFail(response);

}

}

}

private
AliResultCallback aliResultCallback;

public
void setResultCallback(AliResultCallback callback) {

this.aliResultCallback
= callback;

}

public
interface AliResultCallback {

void
onSuccess(PaymentResponse response);

void
onFail(PaymentResponse response);

}

}

4.电子秤

S2系列电子秤直接使用封装好的jar包
scale-service-lib.jar

//连接电子秤服务

private
void connectScaleService() {

mScaleManager
= ScaleManager.getInstance(this);

mScaleManager.connectService(new
ScaleManager.ScaleServiceConnection() {

@Override

public
void onServiceConnected() {

getScaleData();

}

@Override

public
void onServiceDisconnect() {

}

});

}

//实时获取电子秤数据

private
void getScaleData() {

try
{

mScaleManager.getData(new
ScaleCallback.Stub() {

@Override

public
void getData(final int i, int i1, final int i2) throws
RemoteException {

net
= i;

//
i = 净重量 单位 克 ,i1
= 皮重量 单位 克 ,i2
= 稳定状态 1
为稳定。具体其他状态请参考商米开发者文档

}

});

}
catch (RemoteException e) {

e.printStackTrace();

}

}

5.扫码枪

扫码枪其实就是一个外接键盘,事件在dispatchKeyEvent中获取,二维码和条形码每一位都会触发一次该方法,有些扫码枪在输入完成后会主动多调用一次enter按键。

demo中提供一个简易的扫码监听方式:

private
StringBuilder sb = new StringBuilder();

private
Handler myHandler = new Handler();

@Override

public
boolean dispatchKeyEvent(KeyEvent event) {

int
action = event.getAction();

switch
(action) {

case
KeyEvent.ACTION_DOWN:

int
unicodeChar = event.getUnicodeChar();

sb.append((char)
unicodeChar);

Log.e(TAG,
“扫码===”
+ event.getKeyCode() + ” ” + sb.toString());

if
(event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_UP) {

return
super.dispatchKeyEvent(event);

}

if
(event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_DOWN) {

return
super.dispatchKeyEvent(event);

}

if
(event.getKeyCode() == KeyEvent.KEYCODE_BACK) {

return
super.dispatchKeyEvent(event);

}

if
(event.getKeyCode() == KeyEvent.KEYCODE_MENU) {

return
super.dispatchKeyEvent(event);

}

if
(event.getKeyCode() == KeyEvent.KEYCODE_HOME) {

return
super.dispatchKeyEvent(event);

}

if
(event.getKeyCode() == KeyEvent.KEYCODE_POWER) {

return
super.dispatchKeyEvent(event);

}

final
int len = sb.length();

myHandler.postDelayed(new
Runnable() {

@Override

public
void run() {

if
(len != sb.length()) return;

Log.e(TAG,
“isQRcode”);

if
(sb.length() > 0) {

//Do
something

sb.setLength(0);

}

}

},
200);

return
true;

default:

break;

}

return
super.dispatchKeyEvent(event);

}