如何在Android Studio中发送ZPL代码至打印机?Eclipse代码无法复用
Android Studio中Socket发送ZPL代码无法打印,Eclipse环境正常
我在Android Studio中开发了一款通过Socket向打印机发送ZPL代码打印标签的Java应用,但无法正常工作。相同逻辑的代码在Eclipse中却能正常运行并生成标签。我用Socket和DataOutputStream实现功能,也尝试了多种在线代码,均无效。以下是Eclipse中可正常运行的代码:
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.DataOutputStream; import java.io.IOException; import java.net.Socket; import java.net.UnknownHostException; import javax.swing.*; public class Cliente { public static void main(String[] args) { MarcoCliente mimarco=new MarcoCliente(); mimarco.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } class MarcoCliente extends JFrame{ public MarcoCliente(){ setBounds(600,300,280,350); LaminaMarcoCliente milamina=new LaminaMarcoCliente(); add(milamina); setVisible(true); } } class LaminaMarcoCliente extends JPanel{ public LaminaMarcoCliente(){ JLabel texto=new JLabel("CLIENTE"); add(texto); campo1=new JTextField(20); add(campo1); miboton=new JButton("Enviar"); EnviaTexto mievento = new EnviaTexto(); miboton.addActionListener(mievento); add(miboton); } private class EnviaTexto implements ActionListener{ @Override public void actionPerformed(ActionEvent e) { System.out.println("Hola Funciona"); try { Socket misocket = new Socket("192.168.14.140", 9100); DataOutputStream flujo_salida = new DataOutputStream(misocket.getOutputStream()); flujo_salida.writeUTF("zpl = \"\"\"\r\n" + "^XA\r\n" + "^CI28\r\n" + "^MMT\r\n" + "^PW406\r\n" + "^LL406\r\n" + "^LS0\r\n" + "^FT5,60^A0N,50,40^FDHELLO LABEL^FS\r\n" + "^FO1,70^BY3^BCN,130,Y,N,N^FD1234567890^FS\r\n" + "^PQ1,0,1,Y^XZ\r\n" + "\"\"\""); } catch (UnknownHostException e1) { e1.printStackTrace(); } catch (IOException e1) { System.out.println(e1.getMessage()); } } } private JTextField campo1; private JButton miboton; }
解决方案
添加Android网络权限
Android 9及以上默认禁止明文网络连接,需在AndroidManifest.xml中配置:<uses-permission android:name="android.permission.INTERNET" /> <application ... android:usesCleartextTraffic="true"> ... </application>避免主线程网络操作
Android不允许在主线程执行网络请求,必须将Socket操作放到子线程中:miboton.setOnClickListener(v -> { new Thread(() -> { try { Socket misocket = new Socket("192.168.14.140", 9100); DataOutputStream flujo_salida = new DataOutputStream(misocket.getOutputStream()); // 移除ZPL代码前后的冗余包裹字符串 String zplCode = "^XA\r\n" + "^CI28\r\n" + "^MMT\r\n" + "^PW406\r\n" + "^LL406\r\n" + "^LS0\r\n" + "^FT5,60^A0N,50,40^FDHELLO LABEL^FS\r\n" + "^FO1,70^BY3^BCN,130,Y,N,N^FD1234567890^FS\r\n" + "^PQ1,0,1,Y^XZ\r\n"; flujo_salida.write(zplCode.getBytes("UTF-8")); flujo_salida.flush(); flujo_salida.close(); misocket.close(); } catch (Exception e) { e.printStackTrace(); } }).start(); });修正ZPL代码格式
原代码中用zpl = """和"""包裹ZPL内容,这是Python风格的写法,打印机无法识别,需直接发送纯ZPL指令。确保流操作完整
写完ZPL代码后调用flush()刷新输出流,再关闭流和Socket,避免数据滞留。验证网络连通性
确认Android设备与打印机处于同一局域网,能正常ping通打印机IP,且打印机9100端口处于开放状态。
内容的提问来源于stack exchange,提问作者Claudio Lopez Lagos
相关产品推荐
相关产品推荐

