|
1 | 1 | 13.打印内容 |
2 | 2 | === |
3 | 3 |
|
| 4 | +`Android`用户经常需要在设备上单独地阅览信息,但有时候也需要为了分享信息而不得不给其他人看自己设备的屏幕,这显然不是分享信息的好办法。如果我们可以通过`Android`应用把希望分享的信息打印出来,这将给用户提供一种从应用获取更多信息的好办法,更何况这么做还能将信息分享给其他那些不使用我们的应用的人。另外,打印服务还能创建信息的快照(生成`PDF`文件),而这一切不需要打印设备,无线网络连接,也不会消耗过多电量。 |
4 | 5 |
|
5 | | -简单的拍照 |
| 6 | +在`Android`4.4(`API Level`19)及更高版本的系统中,`Android`框架提供了直接从`Android`应用程序打印图片和文字的服务。 |
| 7 | + |
| 8 | +照片 |
| 9 | +--- |
| 10 | + |
| 11 | +拍摄并分享照片是移动设备最流行的用法之一。如果我们的应用拍摄了照片,并期望可以展示他们,或者允许用户共享照片,那么我们就应该考虑让应用可以打印出这些照片来。`Android Support Library`提供了一个方便的函数,通过这一函数,仅仅使用很少量的代码和一些简单的打印布局配置集,就能够进行照片打印。 |
| 12 | + |
| 13 | +下面将展示如何使用`support v4`包中的`PrintHelper`类打印一幅图片。 |
| 14 | + |
| 15 | +###打印照片 |
| 16 | + |
| 17 | +`Support`包中的`PrintHelper`类提供了一个简单的方式来打印图片。该类有一个单一的布局选项:`setScacleMode()`,能够用户使用下面两个选项中的一个来进行打印: |
| 18 | + |
| 19 | +- `SCALE_MODE_FIT`-该选项会调整图像的大小,这样整个图像就会在打印有效区域内全部显示出来 |
| 20 | +- `SCALE_MODE_FILL`-该选项同样会等比例地调整图像的大小使图像充满整个打印有效区域,即让图像充满整个纸张页面。这就意味着如果选择这个选项,那么图片的一部分(顶部和底部,或者左侧和右侧)将无法打印出来。如果不设置图像的打印布局选项,该模式将是默认的图像拉伸方式。 |
| 21 | + |
| 22 | +这两个`setScaleMode()`的图像布局选项都会保持图像原有的长宽比。下面的代码展示了如何创建一个`PrintHelper`类的实例,设置布局选项,并开始打印进程: |
| 23 | +```java |
| 24 | +private void doPhotoPrint() { |
| 25 | + PrintHelper photoPrinter = new PrintHelper(getActivity()); |
| 26 | + photoPrinter.setScaleMode(PrintHelper.SCALE_MODE_FIT); |
| 27 | + Bitmap bitmap = BitmapFactory.decodeResource(getResources(), |
| 28 | + R.drawable.droids); |
| 29 | + photoPrinter.printBitmap("droids.jpg - test print", bitmap); |
| 30 | +} |
| 31 | +``` |
| 32 | + |
| 33 | +该方法可以作为一个菜单项的`Action`来被调用。注意对于那些不一定被设备支持的菜单项(比如有些设备可能无法支持打印),应该放置在“更多菜单(`overflow menu`)”中。 |
| 34 | + |
| 35 | +在`printBitmap()`被调用之后,我们的应用就不再需要进行其他的操作了。之后`Android`打印界面就会出现,允许用户选择一个打印机和它的打印选项。用户可以打印图像或者取消这一次操作。如果用户选择了打印图像,那么一个打印任务将会被创建,同时在系统的通知栏中会显示一个打印提醒通知。 |
| 36 | + |
| 37 | +打印HTML文档 |
6 | 38 | --- |
7 | 39 |
|
8 | | -###请求照相机权限 |
| 40 | +这一块就不仔细介绍具体的场景了,简单的写一下重要的步骤。 |
| 41 | + |
| 42 | +`WebView`类在`Android`4.4(`API Level`19)中得到了更新,使得它可以打印`HTML`内容。该类允许我们加载一个本地`HTML`资源或者从网页下载一个页面,创建一个打印任务,并把它交给`Android`打印服务。 |
| 43 | + |
| 44 | +###加载HTML文档 |
| 45 | + |
| 46 | +1. 在`HTML`资源加载完毕后,创建一个`WebViewClient`用来启动一个打印任务。 |
| 47 | +2. 加载`HTML`资源至`WebView`对象中。 |
| 48 | + |
| 49 | +```java |
| 50 | +private WebView mWebView; |
| 51 | + |
| 52 | +private void doWebViewPrint() { |
| 53 | + // Create a WebView object specifically for printing |
| 54 | + WebView webView = new WebView(getActivity()); |
| 55 | + webView.setWebViewClient(new WebViewClient() { |
| 56 | + |
| 57 | + public boolean shouldOverrideUrlLoading(WebView view, String url) { |
| 58 | + return false; |
| 59 | + } |
| 60 | + |
| 61 | + @Override |
| 62 | + public void onPageFinished(WebView view, String url) { |
| 63 | + Log.i(TAG, "page finished loading " + url); |
| 64 | + createWebPrintJob(view); |
| 65 | + mWebView = null; |
| 66 | + } |
| 67 | + }); |
| 68 | + |
| 69 | + // Generate an HTML document on the fly: |
| 70 | + String htmlDocument = "<html><body><h1>Test Content</h1><p>Testing, " + |
| 71 | + "testing, testing...</p></body></html>"; |
| 72 | + webView.loadDataWithBaseURL(null, htmlDocument, "text/HTML", "UTF-8", null); |
| 73 | + |
| 74 | + // Keep a reference to WebView object until you pass the PrintDocumentAdapter |
| 75 | + // to the PrintManager |
| 76 | + mWebView = webView; |
| 77 | +} |
| 78 | +``` |
| 79 | +< **Note:**请确保在`WebViewClient`中的`onPageFinished()`方法内调用创建打印任务的方法。如果没有等到页面加载完毕就进行打印,打印的输出可能会不完整或空白,甚至可能会失败。 |
| 80 | +< **Note:**在上面的样例代码中,保留了一个`WebView`对象实例的引用,这样能够确保它不会在打印任务创建之前就被垃圾回收器所回收。在编写代码时请务必这样做,否则打印的进程可能会无法继续执行。 |
| 81 | + |
| 82 | +###创建打印任务 |
| 83 | + |
| 84 | +```java |
| 85 | +private void createWebPrintJob(WebView webView) { |
| 86 | + |
| 87 | + // Get a PrintManager instance |
| 88 | + PrintManager printManager = (PrintManager) getActivity() |
| 89 | + .getSystemService(Context.PRINT_SERVICE); |
9 | 90 |
|
| 91 | + // Get a print adapter instance |
| 92 | + PrintDocumentAdapter printAdapter = webView.createPrintDocumentAdapter(); |
10 | 93 |
|
| 94 | + // Create a print job with name and adapter instance |
| 95 | + String jobName = getString(R.string.app_name) + " Document"; |
| 96 | + PrintJob printJob = printManager.print(jobName, printAdapter, |
| 97 | + new PrintAttributes.Builder().build()); |
11 | 98 |
|
| 99 | + // Save the job object for later status checking |
| 100 | + mPrintJobs.add(printJob); |
| 101 | +} |
| 102 | +``` |
12 | 103 |
|
13 | | - |
14 | 104 |
|
15 | 105 | --- |
16 | 106 |
|
|
0 commit comments