(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();
}
}
}
以上代碼就能輕松實作圖檔的列印,這裡我考慮的僅僅隻是一台列印機的情況,我這裡也隻有一台,哈哈。
有什麼不足之處請大家指教一下。