全部
常见问题
产品动态
精选推荐
功能建议

分析中 已回复 待规划 {{opt.name}}
分析中 已回复 待规划
商米D3,双屏收银机(收银APP全面适配多门店4.0版本遇到的BUG)

管理 管理 编辑 删除


【产品名称】: 多门店系统

【产品版本】:v4.0.0

【部署方式】: linux宝塔面板

【部署环境】: 线上环境

【php版本】:8.0

【Mysql版本】:5.7

【使用终端】:商米收银台-D3-APP

遇到了很多坑,给大家参考一下。觉得有用的关注,不会弄的可以找我打包,请我喝杯蜜雪冰城就可以,但是需要在有空的时间。

1、收款界面布局问题导致键盘被遮挡

https://www.crmeb.com/ask/thread/75997

2、顾客屏幕不显示或者不同步数据

https://www.crmeb.com/ask/thread/75998

3、收钱后,收钱箱不弹开

原因:商米D3用的是新的PrinterX SDK,不是旧的 SunmiPrinterService,所以使用旧的驱动是无法打开的。

3.1

添加依赖

在 app/build.gradle 中:

dependencies {

   implementation 'com.sunmi:printerx:1.0.20'

}

3.2

修改 CrmebCollectActicity.java

package com.crmeb.crmebcollect;



import androidx.appcompat.app.AppCompatActivity;



import android.app.Presentation;

import android.content.Context;

import android.content.res.AssetManager;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.media.MediaRouter;

import android.os.Bundle;

import android.util.Log;

import android.view.Display;

import android.view.KeyEvent;

import android.view.View;

import android.webkit.JsResult;

import android.webkit.WebChromeClient;

import android.webkit.WebSettings;

import android.webkit.WebView;

import android.webkit.WebViewClient;

import android.widget.ImageView;

import android.widget.Toast;



import com.crmeb.jsbridge.IJsCallBack;

import com.crmeb.jsbridge.JsBridgeApi;

import com.crmeb.jsbridge.JsMessageBean;

import com.crmeb.jsbridge.JsonUtil;

import com.sunmi.printerx.Printer;

import com.sunmi.printerx.PrinterListen;

import com.sunmi.printerx.PrinterSdk;

import com.sunmi.printerx.style.ResultCallback;



import java.io.IOException;

import java.io.InputStream;

import java.util.List;



public class CrmebCollectActicity extends AppCompatActivity {



   // 主屏网页容器

   private WebView webView;



   // 副屏WebView和Presentation

   private WebView customerWebView;

   private Presentation customerPresentation;



   // js 和 Java 交互

   private JsBridgeApi mJsBridgeApi;



   // 商米打印机(新SDK)

   private Printer printer;



   @Override

   protected void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       AssetManager assetManager = this.getAssets();



       // web view

       webView = new WebView(this);

       setContentView(webView);



       // 初始化商米打印机(新SDK)

       initPrinter();



       WebSettings webSettings = webView.getSettings();

       webSettings.setAllowUniversalAccessFromFileURLs(true);

       webSettings.setJavaScriptEnabled(true);

       webSettings.setJavaScriptCanOpenWindowsAutomatically(true);

       webSettings.setAppCacheEnabled(true);

       webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);

       webSettings.setSupportZoom(true);

       webSettings.setUseWideViewPort(true);

       webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);

       webSettings.setDisplayZoomControls(true);

       webSettings.setDefaultFontSize(12);

       webSettings.setDomStorageEnabled(Boolean.TRUE);

       webSettings.setDatabaseEnabled(Boolean.TRUE);



       webView.setWebChromeClient(new WebChromeClient() {

           @Override

           public boolean onJsAlert(WebView view, String url, String message, JsResult result) {

               Toast.makeText(getApplicationContext(), "url:" + url + "| message:" + message, Toast.LENGTH_SHORT).show();

               return super.onJsAlert(view, url, message, result);

           }

       });

       webView.setWebViewClient(new WebViewClient());

       webView.loadUrl("file:///android_asset/pro_collect/cashier.html#/cashier/cashier/index");



       // 顾显声明 第一次显示Welcome图片

       MediaRouter mediaRouter = (MediaRouter) CrmebCollectActicity.this.getSystemService(Context.MEDIA_ROUTER_SERVICE);

       MediaRouter.RouteInfo route = mediaRouter.getDefaultRoute();

       if (route != null) {

           Display presentationDisplay = route.getPresentationDisplay();

           if (presentationDisplay != null) {

               customerPresentation = new MyPresentation(CrmebCollectActicity.this, presentationDisplay);

               ImageView iv = new ImageView(CrmebCollectActicity.this);

               try {

                   InputStream inputStream = assetManager.open("gx.jpeg");

                   Bitmap bitmap = BitmapFactory.decodeStream(inputStream);

                   iv.setImageBitmap(bitmap);

                   customerPresentation.setContentView(iv);

                   customerPresentation.show();

               } catch (IOException e) {

                   e.printStackTrace();

               }

           }

       }



       mJsBridgeApi = new JsBridgeApi(webView, new IJsCallBack() {

           @Override

           public void onJsCall(JsMessageBean jsMessageBean) {

               Log.v("onJsCall", JsonUtil.toJsonString(jsMessageBean));



               // 打开钱箱

               if (jsMessageBean.method.equals("openCacheBox")) {

                   Toast.makeText(getApplicationContext(), "收到打开钱箱指令", Toast.LENGTH_SHORT).show();

                   openCashBox();

               }



               // 收银员登录成功后打开顾显

               if (jsMessageBean.method.equals("collectLoginSuccess")) {

                   Display presentationDisplay = route.getPresentationDisplay();

                   dismissCustomerPresentation();

                   customerPresentation = new MyPresentation(CrmebCollectActicity.this, presentationDisplay);

                   customerWebView = new WebView(CrmebCollectActicity.this);

                   WebSettings webSettingsCus = customerWebView.getSettings();

                   webSettingsCus.setJavaScriptEnabled(true);

                   customerPresentation.setContentView(customerWebView);

                   webSettingsCus.setSupportZoom(true);

                   webSettingsCus.setUseWideViewPort(true);

                   webSettingsCus.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);

                   webSettingsCus.setDisplayZoomControls(true);

                   webSettingsCus.setDomStorageEnabled(Boolean.TRUE);

                   webSettingsCus.setDatabaseEnabled(Boolean.TRUE);

                   customerWebView.setWebChromeClient(new WebChromeClient());

                   customerWebView.setWebViewClient(new WebViewClient());

                   customerWebView.loadUrl("file:///android_asset/pro_collect/cashier.html#/cashier/auxScreen/index");

                   customerPresentation.show();

               }



               // 收银员注销后关闭顾显

               if (jsMessageBean.method.equals("collectLogout")) {

                   Display presentationDisplay = route.getPresentationDisplay();

                   dismissCustomerPresentation();

                   customerPresentation = new MyPresentation(CrmebCollectActicity.this, presentationDisplay);

                   ImageView iv = new ImageView(CrmebCollectActicity.this);

                   try {

                       InputStream inputStream = assetManager.open("gx.jpeg");

                       Bitmap bitmap = BitmapFactory.decodeStream(inputStream);

                       iv.setImageBitmap(bitmap);

                       customerPresentation.setContentView(iv);

                       customerPresentation.show();

                       customerWebView = null;

                   } catch (IOException e) {

                       e.printStackTrace();

                   }

               }



               // 同步购物车数据到副屏

               if (jsMessageBean.method.equals("syncCartToCustomer")) {

                   syncDataToCustomer(jsMessageBean.params);

               }



               mJsBridgeApi.notifyNativeTaskFinished("sf", jsMessageBean.id);

           }

       });

       mJsBridgeApi.openJsBridgeChannel(webView);

       WebView.setWebContentsDebuggingEnabled(true);

       webView.setOnKeyListener(new View.OnKeyListener() {

           @Override

           public boolean onKey(View view, int i, KeyEvent keyEvent) {

               if (webView.canGoBack()) {

                   webView.goBack();

                   return true;

               } else {

                   return false;

               }

           }

       });

   }



   // ========== 打印机初始化(新SDK) ==========



   private void initPrinter() {

       PrinterSdk.getInstance().getPrinter(this, new PrinterListen() {

           @Override

           public void onDefPrinter(Printer defPrinter) {

               printer = defPrinter;

               Log.d("Printer", "默认打印机已连接");

           }



           @Override

           public void onPrinters(List<Printer> printers) {

               if (printers != null && !printers.isEmpty()) {

                   printer = printers.get(0);

               }

           }

       });

   }



   // ========== 打开钱箱(新SDK) ==========



   public void openCashBox() {

       if (printer == null) {

           Toast.makeText(CrmebCollectActicity.this, "打印机未连接", Toast.LENGTH_SHORT).show();

           return;

       }

       printer.cashDrawerApi().open(new ResultCallback() {

           @Override

           public void onResult(int code, String message) {

               if (code == 0) {

                   Toast.makeText(CrmebCollectActicity.this, "钱箱已打开", Toast.LENGTH_SHORT).show();

               } else {

                   Toast.makeText(CrmebCollectActicity.this, "钱箱失败: " + message, Toast.LENGTH_SHORT).show();

               }

           }

       });

   }



   // ========== 副屏数据同步 ==========



   private void syncDataToCustomer(String data) {

       if (customerWebView != null) {

           customerWebView.post(new Runnable() {

               @Override

               public void run() {

                   String escapedData = data.replace("\\", "\\\\").replace("'", "\\'");

                   String js = "javascript:if(window.updateFromMain){" +

                           "window.updateFromMain('" + escapedData + "');" +

                           "}";

                   customerWebView.evaluateJavascript(js, null);

               }

           });

       }

   }



   private void dismissCustomerPresentation() {

       if (customerPresentation != null && customerPresentation.isShowing()) {

           customerPresentation.dismiss();

           customerPresentation = null;

       }

       customerWebView = null;

   }



   @Override

   protected void onDestroy() {

       super.onDestroy();

       dismissCustomerPresentation();

   }

}




{{voteData.voteSum}} 人已参与
支持
反对
请登录后查看

姜杰 最后编辑于2026-06-27 11:19:45

快捷回复
回复
回复
回复({{post_count}}) {{!is_user ? '我的回复' :'全部回复'}}
排序 默认正序 回复倒序 点赞倒序

{{item.user_info.nickname ? item.user_info.nickname : item.user_name}} LV.{{ item.user_info.bbs_level || item.bbs_level }}

作者 管理员 企业

{{item.floor}}# 同步到gitee 已同步到gitee {{item.is_suggest == 1? '取消推荐': '推荐'}}
{{item.is_suggest == 1? '取消推荐': '推荐'}} 【已收集】
{{item.floor}}# 沙发 板凳 地板 {{item.floor}}# 【已收集】
{{item.user_info.title || '暂无简介'}}
附件

{{itemf.name}}

{{item.created_at}}  {{item.ip_address}}
打赏
已打赏¥{{item.reward_price}}
{{item.like_count}}
分享
{{item.showReply ? '取消回复' : '回复'}}
删除
回复
回复

{{itemc.user_info.nickname}}

{{itemc.user_name}}

回复 {{itemc.comment_user_info.nickname}}

附件

{{itemf.name}}

{{itemc.created_at}}
打赏
已打赏¥{{itemc.reward_price}}
{{itemc.like_count}}
{{itemc.showReply ? '取消回复' : '回复'}}
删除
回复
回复
收起 展开更多
查看更多
打赏
已打赏¥{{reward_price}}
14
{{like_count}}
{{collect_count}}
添加回复 ({{post_count}})

相关推荐

快速安全登录

使用微信扫码登录
回复
回复
问题:
问题自动获取的帖子内容,不准确时需要手动修改. [获取答案]
答案:
提交
bug 需求 取 消 确 定
打赏金额
当前余额:¥{{rewardUserInfo.reward_price}}
{{item.price}}元
请输入 0.1-{{reward_max_price}} 范围内的数值
打赏成功
¥{{price}}
完成 确认打赏

微信登录/注册

切换手机号登录

{{ bind_phone ? '绑定手机' : '手机登录'}}

{{codeText}}
切换微信登录/注册
暂不绑定
CRMEB客服
CRMEB咨询热线 400-8888-794

扫码领取产品资料

功能清单
思维导图
安装教程
CRMEB开源商城下载 源码下载 CRMEB帮助文档 帮助文档
返回顶部 返回顶部
CRMEB客服