繁體中文
商米收銀 Demo
來源: | 作者:environment-380 | 發布時間: 2021-04-27 | 3154 次瀏覽 | 分享到:
商米提供一個簡易App來展示如何使用副屏,掃碼,打印,電子秤,人臉支付等功能。支持台式收銀系列(除T1,T1Mini),手持非金融系列,電子秤系列,K1

商米提供一個簡易App來展示如何使用副屏,掃碼,打印,電子秤,人臉支付等功能。支持台式收銀系列(除T1,T1Mini),手持非金融系列,電子秤系列,K1


SunmiCashierDemo_2.0.46


酒店自助發卡demo,包含身份證讀取,發卡,指示燈控制

SunmiHotel_1.0.6下載


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 {  // something }



獲得真實存在的副屏


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 SunmiPrinterServicewoyouService = null;//商米標準打印打印服務 //連接打印服務 private void connectPrintService(){    try{        InnerPrinterManager.getInstance().bindService(this, innerPrinterCallback);    } catch(InnerPrinterExceptione) {        e.printStackTrace();    } } private InnerPrinterCallbackinnerPrinterCallback = new InnerPrinterCallback() {    @Override    protected void onConnected(SunmiPrinterServiceservice){        woyouService=service;    }    @Override    protected void onDisconnected(){        woyouService=null;    } };


3.  支付(支持 掃碼支付,支付寶刷臉支付)



  • 推薦使用Sunmi收銀台聚合支付。

  • 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);    } }



支付寶刷臉支付QA


Q: 使用源碼編譯的apk無法刷臉?


A: 源碼中的AlipaySmileModel文件中填入你在螞蟻開放平臺申請開通的參數之後,根據支付寶相關規定進行數據調整才可以直接使用支付寶刷臉功能


Q: 如何使用支付寶刷臉支付功能?


A: 您可以使用商米收銀台調用刷臉功能。或直接在螞蟻開放平臺申請此功能,並且在商米開發者平臺申請調用支付寶刷臉服務的權限。


Q: 雙屏機器如何使用刷臉支付?


A: 直接使用商米收銀台,收銀台將同步支持最新版的支付寶刷臉功能。或者由第三方軟件自主控制是否顯示在副屏,需要調用zolozVerify方法時增加參數params.put("smile_mode", "1");


Q: 調用刷臉報1070錯誤?


A: 在設置-應用中找到simle軟件,開啟允許在其他應用上運行的權限。


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);

}





​新聞分類
熱門資訊