|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
由于封闭文档写的相当好在遇到新框架的时候弄明白框架的功能去文档里搜搜框架的ProgrammingGuide很有用要弄明白框架类的继承结构写iOS的程序不一定都是用OBJC你有无想过给你的Android使用增加打印的功效?
在Android4.4之前,Android上没有专门为打印供应的API,假如要完成打印的话,只能依附第三方的办理计划,大概本人完成SMB/CIFS如许的协定,用WIFI、蓝牙大概USB间接和打印机通讯。而我们尽年夜多半人也不会想往间接和打印机通讯,一样平常都是依托已存在的计划,这也是最好的选择了。实在,这就是Android新增的功效,可让打印功效加倍复杂和牢靠。
云打印手艺
GoogleCloudPrintService开始是在2010年4月对外公布的,GCP是一个基于web的打印机,也是一个能够供应打印功效的办理体系,它能让任何联网设备都可使用GCP服务来链接任何一台打印机。用户能够为GCP服务增加任何一台打印机,设置是很老式打印机、非云端毗连的打印机也是能够的,只必要包管打印机与毗连的电脑在web上是共享的,而且装有Google的Chrome。据作者所说,利用GCP是让Android4.4以下的体系撑持打印功效的最复杂体例。GCP也是我们最但愿在Android4.4以上设备上见到的新功效,以是能够入手下手进修了。点击这里检察材料。
KitKat之前的打印手艺
Google云打印手艺给开辟者供应了一系列API,只需开辟者具有Google认证账号就能够提交打印义务和吸收打印义务了。能够从这里下载Google云打印相干的开辟材料https://developers.google.com/cloud-print/。本文不会触及任何完成的细节,由于它有点长,并且匡助不年夜。另有一点是,用户必需准确设置GCP账号,并和打印机绑定,上面将要先容两种完成办法。
Google云打印APP
PauloFernandes是第一个在APP中利用云打印服务的人,它的CloudPrint使用是第一款利用GCPAPI来为Android设备供应打印服务的APP。两年后,也就是2013年六月的时分,Google加入了它本人的版本,叫做GoogleCloudPrint。我会用GoogleCloudPrint作为例子举行解说,由于它更盛行一些,不外我本人也以为年夜多半云打印类APP都差未几。起首,我们必要利用PackageManager这个类来包管Android设备上已运转了GoogleCloudPrint服务,可使用这个函数:
1
2
3
4
5
6
7
8
9
privatebooleanhasGoogleCloudPrint(){
PackageManagerpm=getPackageManager();
try{
pm.getPackageInfo(“com.google.Android.apps.cloudprint”,0);
returntrue;
}catch(PackageManager.NameNotFoundExceptione){
returnfalse;
}
}
假如设备上装了GoogleCloudPrint服务的话,我们就能够利用一个Intent来入手下手打印了:
1
2
3
4
5
6
7
8
9
privatevoidprintViaGoogleCloudPrintApp(Uricontent){
IntentprintIntent=newIntent(Intent.ACTION_SEND);
printIntent.setPackage(“com.google.Android.apps.cloudprint”);
printIntent.setType(“image/*”);
printIntent.putExtra(Intent.EXTRA_TITLE,“PrintTestTitle”);
printIntent.putExtra(Intent.EXTRA_STREAM,uri);
startActivity(printIntent);
}
大概,还可使用webview挪用GoogleCloudPrint的web接口,这里省略了这部分,这里有一个例子,感乐趣的能够看看完全示例.
在KitKat体系中举行打印
有了这个打印的API,Android上打印就变得更复杂、更牢靠了。这是它的API的更新列表,以包的情势构造:
Android.support.v4.print
- PrintHelper–bitmap打印行列工具类。
Android.print
- PrintDocumentAdapter–供应自界说打印文档的基本类。
- PrintManager–会见打印行列,并供应PrintDocumentAdapter类撑持。
Android.print.pdf
- PrintedPdfDocument–基于特定PrintAttributeshelper创立PDF。
Android.webkit
- WebView.createPrintDocumentAdapter–为WebView打印内容创立PrintDocumentAdapter。
Android.printservice
我们先来看看Android.printservice,这个包内里有与完成本人的打印服务相干的类,PrintService笼统出了与实在打印机(大概别的两头部件如GCP)之间的通讯,GoogleCloudPrintAPP就在KitKat上完成了这个服务,以是就能够在GCP上创立打印义务了。关于PrintService的详细完成超越了本文的局限,不外能够存眷一下PrintService,它仍是挺有用的,它是完成打印所必需的一个类,另有别的必要的相干类稍后就先容。(必要注重的是:年夜多半KitKat设备中预装了GoogleCloudPrint,Chrome,Drive,Gallery另有Quickoffice的,城市供应打印的服务)
接上去要说的是PrintHelper,它也在Android.support.v4.print包下,你大概会想,既然这个类放在Android的兼容包里,那末就能够在老版本的Android上利用打印的功效了。可是很不幸的是,现实不是如许的,PrintHelper这个类有一个静态办法systemSupportsPrint(),从自己举行的测试来看,这个办法只要在KitKat设备中才会前往true。假如在systemSupportPrint()这个办法前往false的设备上挪用printBitmap()办法的话,会间接被疏忽,不会产生任何事务。如今我们只必要懂得为何PrintHelper这个类会包括在Android的兼容包内里,仿佛也没有甚么用,最少今朝还没有甚么用途。
不论怎样,PrintHelper这个类在KitKat中举行打印操纵仍是很有用的,它供应了复杂,间接的体例来打印图片。
- 能够指定图片的缩放形式,FILT大概FIT形式,FILT形式会用给出的图片添补全部地区,并坚持全体比例稳定,大概会有裁剪。FIT形式会程度添补大概垂直添补,这取决于文档大概图片的尺寸,它也会坚持全体的比例,可是不会裁剪,以是大概会呈现空缺地区,除非图片的比例和要打印的文档的比例恰好符合。
- 能够指定色彩形式,COLOR大概MONOCHROME。
另有一个很有用的新增办法叫createPrintDocumentAdapter(),为webview筹办的。这个办法会和PrintManager一同利用,让打印webview的内容加倍复杂。
1
2
3
PrintDocumentAdapterprintDocumentAdapter=mWebView.createPrintDocumentAdapter();
PrintManagerprintManger=(PrintManager)getSystemService(Context.PRINT_SERVICE);
printManager.print(“TestPrintJob”,printDocumentAdapter,null);
在打印webview的内容时,还必要注重的是:
- 利用者不克不及指定打印的页面局限,以是只能打印全部文档。
- PrintDocumentAdapter在被Webview创立的时分,只能供应以后载进的内容,假如文档没加载终了,大概半途又加载了其余文档,那末大概会招致不成意料的了局,大概PrintDocumentAdapter会加载失利。
- 一个webview实例一次只能处置一个打印义务。
PrintManager这个类只要两个公然的办法:getPrintJobs()和print()办法。getPrintJobs()办法会前往一个PrintJob范例的列表,这些PrintJob对象由使用挪用。PrintJob对象在检测形态大概在作废大概重启打印义务的时分很有效。在打印的时分会创立一个PrintJob对象(带有题目,PrintDocumentAdapter和PrintAttributes),个中PrintAttributes可让你指定一种色彩形式,媒体尺寸,边距另有分辩率,另有要出格注重这些属性的操纵都是由PrintService操纵的,用户只是把义务提交罢了。并且很有大概良多属性与对应的服务是没有干系的,大概是会被间接疏忽失落的。一个复杂的例子就是在选择“saveasPDF”的时分,就会疏忽失落色彩形式这个属性。
最初要看的这个类叫PrintDocumentAdapter。这个类是一个基本类,承继它能够创立自界说的结构和内容。只管是能够用PrintHelper和Bitmap类来轻松对绘制的内容举行打印,可是PrintDocumentAdapter在结构和属性上加倍天真,在完成PrintDocumentAdapter的时分,有两个可选的办法和两个必需的办法,可选的办法是onStart()和onFinish(),在分派和开释资本的时分会必要这两个办法。起首要看的一个必需的办法叫onLayout(),在PrintAttribute改动的时分就会挪用这个办法,这个办法的次要目标就是为了创立PrintDocumentInfo对象,用于形貌所打印的内容,和挪用LayoutResultCallback对象里的一个办法(有三个办法)。这也是创立PrintedPdfDocument对象最好的中央,以是就能够往内里传送响应的打印属性。
<p>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
@Override
publicvoidonLayout(PrintAttributesoldAttributes,PrintAttributesnewAttributes,
CancellationSignalcancellationSignal,LayoutResultCallbackcallback,Bundleextras){
//IftheCancellationSignalindicatestheprintjobhasbeencancelledthencall
//onLayoutCancelledandreturnasthereisnothingelsetodo
if(cancellationSignal.isCanceled()){
callback.onLayoutCanceled();
return;
}
//IfyouareusingPrintedPdfDocumenthelperclassthisisagoodplacetoinstantiateit
mPdfDocument=newPrintedPdfDocument(getContext(),newAttributes);
//Nextyouwillwanttodeterminethenumberofpagesyourdocumentwillrequirebased
//onthespecifiedattributesandyourcontent,whateverthatmaybe
intpageCount=determinePageCount(newAttributes);
//FinallyyouwillneedtocreateaPrintDocumentInfoobjectwhichspecifiesthecontent
//typeandpagecount.ThecontenttypevaluecaneitherbyDOCUMENTorPHOTO
//andwillpotentiallybeusedbytheprintservicebutcouldalsobeignoreddependingon
//whatprintserviceisbeingused.TheAndroiddeveloperdocsmentionthattheprint
//servicemayusethedocumenttypetodeterminethepaperqualityand/orotherquality
//settingsthoughagain,itisentirelyuptotheprintservicehowthisvalueisused.
<p> |
|