金山实习周记(4)——Google Cloud Print

      当发现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!!!

你可能感兴趣的:(Google)