如何在Android上连接网络打印机?

14

我想编写一个连接到指定IP地址的网络打印机并进行打印的Android应用程序。

为了进行打印,我知道需要针对特定文件类型编写自己的Postscript,并且通过WIFI连接到网络不是问题。

如何连接到网络打印机?


你找到解决方案了吗? - Kishore
7个回答

20

任何连接到网络的设备都将通过它们的IP和端口/套接字进行通信。通过telnet或socket连接并将数据写入其套接字缓冲区是最简单的方法。

try 
    {
    Socket sock = new Socket("192.168.1.222", 9100);
    PrintWriter oStream = new PrintWriter(sock.getOutputStream());
        oStream.println("HI,test from Android Device");
        oStream.println("\n\n\n");
        oStream.close();
        sock.close(); 
    }
    catch (UnknownHostException e) 
    {
        e.printStackTrace();
    } 
    catch (IOException e) 
    { 
        e.printStackTrace();
    } 

1
如何获取端口号? - Menna-Allah Sami
3
它对我有用,我想打印一个PDF文件,你能帮我吗? - Vishwajit Palankar
我有一些不同的URL,例如IP地址和端口号,如192.168.100.101:9090/printer/print。如何使用此URL进行打印? - Satyam Gondhale
@luis,你能告诉我你用的是哪个打印机吗? - user3219477
@VishwajitPalankar 你用的是哪种打印机? - user3219477
显示剩余2条评论

1

如果打印机支持LPR/LPD,您可能可以使用lpdspooler。如果您能提供有关环境(打印机等)的更多详细信息,我可能能够提供更多信息。


测试打印机是EPSON TM-T88III(以太网)。我需要检查它是否支持LPR / LDP。 - Fallenlight
它显示打印机支持 LPR。 - Fallenlight
1
我再次研究了lpdspooler,它似乎并不完全符合您的要求,但我看到您的打印机支持LPR和RAW。我找到了一个项目的源代码链接,该项目使用Java通过LPR将作业发送到打印机;我相信它会完全满足您的需求。链接如下:http://code.google.com/p/jprinterface/source/browse/trunk/src/sos/net/print/LPR.java?r=2 - AC2MO
谢谢Gregory,让我试试。我会告诉你结果的。现在至少我有了一个开始的东西。 - Fallenlight
1
嗨,我尝试了Gregory提供的链接,作为Java应用程序它没有任何问题。但是每当我在Android中尝试相同的想法和代码时,写入数据文件时就会出现SocketTimeOut错误。我尝试了wakelock并增加了超时时间,但这并没有帮助,我将使用wireshark检查出了什么问题,仍在努力解决。虽然现在还为时过早,但我认为这可能是由于权限问题造成的,目前我无法想到任何解决方法,任何帮助都将不胜感激。 - Fallenlight
显示剩余2条评论

1
在oncreate方法后添加以下代码。
if (android.os.Build.VERSION.SDK_INT > 9) {
    StrictMode.ThreadPolicy policy = 
        new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);
}

0

0
我的解决方案。我使用爱普生TM系列。我认为端口默认为9100。 在清单中添加:
<uses-permission android:name="android.permission.INTERNET"/>

在活动中使用线程,否则您可能会遇到android.os.NetworkOnMainThreadException错误。
Thread thread = new Thread(new Runnable() {

            @Override
            public void run() {
               try  {
                  Socket sock = new Socket("192.168.1.168", 9100);
                  PrintWriter oStream = new PrintWriter(sock.getOutputStream());
                  oStream.println("Hi, test from Android Device");
                  oStream.println("\n");
                  oStream.close();
                  sock.close();
                } catch (UnknownHostException e)
                  {
                   e.printStackTrace();
                  }
                  catch (IOException e)
                  {
                    e.printStackTrace();
                  }
                    }});

如果不足够,请在清单文件中添加以下内容:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

0
尝试使用PrintManager:https://developer.android.com/training/printing/custom-docs
  private void doPrint() {
    // Get a PrintManager instance
    PrintManager printManager = (PrintManager) getActivity()
            .getSystemService(Context.PRINT_SERVICE);

    // Set job name, which will be displayed in the print queue
    String jobName = getActivity().getString(R.string.app_name) + " Document";

    // Start a print job, passing in a PrintDocumentAdapter implementation
    // to handle the generation of a print document
    printManager.print(jobName, new MyPrintDocumentAdapter(getActivity()),
            null); //
}

-2

好的,您不能直接连接设备,因为您需要安装驱动程序。不过有第三方应用程序,例如Google Cloud打印,可以与Android无缝配合使用。


1
不,这是微软Windows的方式。实际上,许多高质量的设备,如打印机、调制解调器、声卡等,支持标准通信协议,因此您可以在没有安装任何驱动程序的情况下连接。请参见接受的答案作为示例。 - Vassilis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接