当发现javax.print调用sun.print.Win32PrintService时,就明白到这已经是平台相关问题,当再发现共享打印机大多是host-based打印机(即本身无处理能力,只能认识点模式)时,就宣告着移植javax.print的计划彻底破产。这样就只剩下最后一个方案——使用第三方库。 经过各种考虑,最后选用了Google Cloud Print(以下简称GCP)。
以下就来分享下学习云打印心得。
为什么要云打印?
所谓的云打印就是使得在任何设备上(台式,手提,手机)的应用程序都能通过云使用任一台自己有使用权的打印机,且该设备无需安装打印驱动。这样的特性使得云打印十分适合在手机上使用。
当前的云打印
GCP,于2011-1-25日推出,至今仍为Beta版。这是唯一一个提供云打印服务的厂商。不过使用条件有两个:一,要有Google账号;二,如果是非云打印机,则要在与打印机相连的PC上装chrome
HP cloud print,其实就是新推出的云打印机ePrint系列,其使用方法十分简单——直接对打印机发邮件。
MotoPrint,摩托罗拉推出的一款在Android手机上进行云打印的应用程序,至今没有发现正式版。
AirPrint,苹果公司推出的内置在ios 4.2系统中的打印服务,只允许在HP的ePrint系列上使用。目前已推出正式版。
在以上四种选择中,GCP是唯一的选择。
PS:在国内不翻GFW就使用GCP,有可能会出现url异常。。。成功概率30%左右
使用GCP
在客户端使用GCP只需三个步骤:一,获取授权码;二,查找可用打印机;三,提交到GCP服务器。由于GCP官网没给出JAVA版的例子,所以在此给个JAVA版的。
获取授权码
提交Google账号和密码给服务器就可以换取授权码
URL url=new URL("https://www.google.com/accounts/ClientLoginaccountType=HOSTED_OR_GOOGLE&Email="+
m_sName+"&Passwd="+m_sPw+"&service=cloudprint&source=lin");
HttpURLConnection connection=(HttpURLConnection)url.openConnection();
BufferedReader reader=new BufferedReader(new InputStreamReader(connection.getInputStream(),"US-ASCII"));
String line;
while( (line=reader.readLine())!=null ) {
String[] split=line.split("=");
if( split.length==2 && split[0].equals("Auth") ) {
m_sAuthCode=split[1]; //授权码就在这了
}
}
查找可用打印机
将得到的授权码传到指定的HTTP地址就行
URL url=new URL("http://www.google.com/cloudprint/search?output=json");
HttpURLConnection connection=(HttpURLConnection)url.openConnection();
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.addRequestProperty("Authorization", "GoogleLogin auth=" + m_sAuthCode);
BufferedReader reader=new BufferedReader(new InputStreamReader(connection.getInputStream(),"US-ASCII"));
String line;
while( (line=reader.readLine())!=null ) {
SavePrinters(line); //打印机的信息就存放在line里,写个函数保存吧>_<
}
提交到GCP服务器
将要使用的打印机的ID,打印文件类型,打印的内容与授权码一起POST到指定网址。
URL url=new URL("http://www.google.com/cloudprint/submit?output=json");
HttpURLConnection connection=(HttpURLConnection)url.openConnection();
connection.setDoOutput(true);
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.addRequestProperty("Authorization", "GoogleLogin auth=" + m_sAuthCode);
String postText="printerid=" + URLEncoder.encode(printerId) + //上一步得到的打印机ID
"&capabilities=" + URLEncoder.encode("") +
"&contentType=" + URLEncoder.encode("application/pdf") + //打印类型
"&title=" + URLEncoder.encode(title) +
"&content="+GetStringFromPath(path); //将打印的数据变为String
byte[] postBytes=postText.getBytes();
connection.getOutputStream().write(postBytes);
connection.getOutputStream().flush();
connection.getOutputStream().close();
至此,就完成作业的提交。而我的打印任务也结束了,YEAH!!!