【问题标题】:How to connect a network printer over Android?如何通过 Android 连接网络打印机?
【发布时间】:2011-09-12 04:03:01
【问题描述】:

我想编写一个 Android 应用程序,该应用程序将连接到具有特定 IP 地址的网络打印机,然后进行打印。

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

如何连接网络打印机?

【问题讨论】:

  • 你找到解决方案了吗?

标签: android networking printing


【解决方案1】:

我的解决方案。我用的是 Epson 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" />

【讨论】:

    【解决方案2】:

    尝试使用 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); //
    }
    

    【讨论】:

      【解决方案3】:

      只需在 oncreate 方法后添加此代码

      if (android.os.Build.VERSION.SDK_INT > 9) {
          StrictMode.ThreadPolicy policy = 
              new StrictMode.ThreadPolicy.Builder().permitAll().build();
          StrictMode.setThreadPolicy(policy);
      }
      

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 如何获取端口?
        • 它对我有用,我想打印一个 pdf 文件,你能帮我吗
        • 我有一些不同的 Url,比如 Ip,Port,比如 192.168.100.101:9090/printer/print 如何使用这个 Url 进行打印?
        • @luis 你能告诉我你用的是哪台打印机吗?
        • @VishwajitPalankar 你用过哪款打印机?
        【解决方案5】:

        Star 有一个具有端口发现功能的 Android SDK。它会在您的网络上找到他们的任何 wifi 收据打印机。 http://starmicronics.com/support/SDKDocumentation.aspx

        【讨论】:

          【解决方案6】:

          好吧,您不能直接连接任何设备,因为您需要安装驱动程序。不过,有像Google Cloud print 这样的第三方应用程序可以与Android 无缝协作。

          【讨论】:

          • ,这是微软windows的方式。事实上,许多优质设备,如打印机、调制解调器、声卡等,都支持标准通信协议,因此您无需安装任何驱动程序即可连接。例如,请参阅接受的答案。
          【解决方案7】:

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

          【讨论】:

          • 测试打印机是EPSON TM-T88III(以太网)。我需要检查它是否支持 LPR/LDP。
          • www-304.ibm.com/support/… 表示打印机支持LPR。
          • 我再次查看了 lpdspooler,它看起来并不完全符合您的要求,但我看到您的打印机确实支持 LPR 和 RAW。我在一个项目的源代码中找到了this link,该项目通过java中的LPR将作业发送到打印机;我相信它会做你想要的。
          • 谢谢 Gregory,让我试试。我会通知你结果。现在至少我有一些事情要开始了。
          • 嗨,我尝试了 Gregory 提供的链接,它作为 java 应用程序运行没有任何问题。但是每当我在 Android 中尝试相同的想法和代码时,我都会在写入数据文件时出现 SocketTimeOut 错误。我尝试了唤醒锁并增加了超时时间,但它没有帮助,我将与 wireshark 一起检查看看有什么问题,仍在努力。现在说还为时过早,但我认为这可能是由于权限问题而发生的,目前我无法想到任何帮助。
          猜你喜欢
          • 2020-12-16
          • 1970-01-01
          • 2021-08-29
          • 1970-01-01
          • 2012-04-27
          • 1970-01-01
          • 1970-01-01
          • 2016-09-23
          • 1970-01-01
          相关资源
          最近更新 更多