天天看點

android無線内網列印機列印出圖檔

(1)列印機:首先要選擇一個連接配接内網的列印機,内網列印機就是和手機用的同一個網絡。

(2)手機:手機必須連接配接wifi才行。

一個按鈕,點選此按鈕進行列印操作:
button.setOnClickListener(new OnClickListener() {
                        @Override
                        public void onClick(View v) {
                             PrintUtil printUtil = new PrintUtil(context,path);  //context:上下文對象  path:需要列印的圖檔的路徑
                        }
                   });
           

PrintUtil:

public class PrintUtil {
     public static String IPADDRESS;
     public Socket socket;
     public static final int POS_OPEN_NETPORT = 9100;
     public static String IPADRESS;
     public int Net_ReceiveTimeout = 2500;
     Context context;
     String path;
     public PrintUtil(Context context,String path) {
          super();
          this.context = context;
          this.path = path;
          IPADDRESS = getIPAddress(context);
          RunThread run = new RunThread();
          run.start();
     }
     /*
      * 擷取目前手機所連wifi的ip位址
      */
     public static String getIPAddress(Context context) {
          NetworkInfo info = ((ConnectivityManager) context
                   .getSystemService(Context.CONNECTIVITY_SERVICE))
                   .getActiveNetworkInfo();
          if (info != null && info.isConnected()) {
              if (info.getType() == ConnectivityManager.TYPE_MOBILE) {// 目前使用2G/3G/4G網絡
                   try {
                        for (Enumeration<NetworkInterface> en = NetworkInterface
                                  .getNetworkInterfaces(); en.hasMoreElements();) {
                             NetworkInterface intf = en.nextElement();
                             for (Enumeration<InetAddress> enumIpAddr = intf
                                       .getInetAddresses(); enumIpAddr
                                       .hasMoreElements();) {
                                  InetAddress inetAddress = enumIpAddr.nextElement();
                                  if (!inetAddress.isLoopbackAddress()
                                           && inetAddress instanceof Inet4Address) {
                                      return inetAddress.getHostAddress();
                                  }
                             }
                        }
                   } catch (SocketException e) {
                        e.printStackTrace();
                   }
              } else if (info.getType() == ConnectivityManager.TYPE_WIFI) {// 目前使用無線網絡
                   WifiManager wifiManager = (WifiManager) context
                             .getSystemService(Context.WIFI_SERVICE);
                   WifiInfo wifiInfo = wifiManager.getConnectionInfo();
                   String ipAddress = intIP2StringIP(wifiInfo.getIpAddress());// 得到IPV4位址
                   return ipAddress;
              }
          } else {
              // 目前無網絡連接配接,請在設定中打開網絡
          }
          return null;
     }
     /**
      * 将得到的int類型的IP轉換為String類型,截取ip的前三段
      *
      * @param ip
      * @return
      */
     public static String intIP2StringIP(int ip) {
          return (ip & 0xFF) + "." + ((ip >> 8) & 0xFF) + "."
                   + ((ip >> 16) & 0xFF) + ".";
     }
     ScheduledExecutorService pool;
     boolean isFinish;      
     long lastFinishTime = 0;
     
     boolean isHave = false;
     private class RunThread extends Thread{
        public RunThread(){
        }
        @Override
        public void run() {
            if(pool==null){
                pool = Executors.newScheduledThreadPool(100);
            }
          
            for (int i = 2; i < 255; ++i) {     //0~255循環找到列印機ip
                final int index = i;
                pool.execute(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            String ipaddress = IPADDRESS + index;
                            NetPrinter printer = new NetPrinter();
                            printer.Open(ipaddress, NetPrinter.POS_OPEN_NETPORT);
                            if (printer.IFOpen) {   //找到列印機
                             isHave = true;
                                pos(ipaddress);
                                handler.sendEmptyMessage(0);
                                return;
                            } else{
                             if(index == 254 && isHave == false){
                                   handler.sendEmptyMessage(1);
                             }
                            }
                        } catch (Exception e) {
                             e.printStackTrace();
                        }
                    }     
                });    
            }
        }
     }
     
     private Handler handler = new Handler(){
          public void handleMessage(Message msg) {
              switch (msg.what) {
              case 0:
                   Toast.makeText(context, "列印完成!", Toast.LENGTH_SHORT).show();
                   break;
              case 1:
                   Toast.makeText(context, "未找到列印機,請确認列印機在同一區域網路内,謝謝!", Toast.LENGTH_SHORT).show();
                   break;
              default:
                   break;
              }
          };
     };
     
     private void pos(final String ip) {
          // 開啟一個子線程
          new Thread() {
              public void run() {
                   try { // 列印機網口IP 列印機端口号 編碼方式
                        printImage(ip);
                   } catch (UnknownHostException e) {
                        e.printStackTrace();
                        Log.d("tag", "錯誤資訊1:" + e.toString());
                   } catch (IOException e) {
                        e.printStackTrace();
                        Log.d("tag", "錯誤資訊2:" + e.toString());
                   }
              }
          }.start();
     }
    //根據IP位址使用列印機列印圖檔
     public void printImage(String ip) throws IOException {
          DataOutputStream outToServer = null;
          Socket clientSocket;
          FileInputStream fileInputStream;
          try {
              fileInputStream = new FileInputStream(path);
              InputStream is = fileInputStream;
              clientSocket = new Socket(ip, 9100);
              outToServer = new DataOutputStream(clientSocket.getOutputStream());
              byte[] buffer = new byte[3000];
              while (is.read(buffer) != -1) {
                   outToServer.write(buffer);        
              }
              outToServer.flush();
          } catch (ConnectException connectException) {  
              Log.e("msg", connectException.toString(), connectException);
          } catch (UnknownHostException e1) {
              Log.e("msg", e1.toString(), e1);
          } catch (IOException e1) {
              Log.e("msg", e1.toString(), e1);
          } finally {
              outToServer.close();  
          }
     }
     
     public void deleteAll(File file) {
        if (file.isFile() || file.list().length == 0) {
            file.delete();
        } else {
            for (File f : file.listFiles()) {
                deleteAll(f); // 遞歸删除每一個檔案
            }
            file.delete(); // 删除檔案夾
        }
    }
}
           

NetPrinter:

public class NetPrinter {
    public Socket socket;
    private static final String DEBUG_TAG="NetPrinter";
    public static final int POS_OPEN_NETPORT = 9100;
    public boolean IFOpen = false;
    public int Net_ReceiveTimeout = 2500;
    //網絡列印機 打開網絡列印機
    public boolean Open(String ipaddress, int netport) {
        if (socket == null) {
            try {
                SocketAddress ipe = new InetSocketAddress(Inet4Address.getByName(ipaddress) ,netport);
                Log.e(DEBUG_TAG, Inet4Address.getByName(ipaddress)+"|"+netport);
                socket = new Socket();
                socket.connect(ipe, Net_ReceiveTimeout);  //2500ms連接配接時間,連接配接不上傳回false
                IFOpen = true;
            } catch(Exception e) {
                IFOpen = false;
            }
        } else {
            try {
                socket.close();
                SocketAddress ipe = new InetSocketAddress(Inet4Address.getByName(ipaddress),netport);
                Log.e(DEBUG_TAG, Inet4Address.getByName(ipaddress)+"|"+netport);
                socket = new Socket();
                socket.connect(ipe,Net_ReceiveTimeout);
                IFOpen = true;
            } catch(Exception e) {
                IFOpen = false;
            }
        }
        if(IFOpen){
            Close();
        }
        return IFOpen;
    }
    //網絡列印機 關閉
    public void Close() {
        try {
            socket.close();
            socket = null;
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}
           

以上代碼就能輕松實作圖檔的列印,這裡我考慮的僅僅隻是一台列印機的情況,我這裡也隻有一台,哈哈。

有什麼不足之處請大家指教一下。