You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 13:17:22