Android NDK开发详解打印文件之照片

本文介绍了如何在Android应用中使用AndroidNDK支持库实现照片和HTML文档的打印功能,包括PrintHelper类的使用、创建打印任务和适配器,以及通过WebView打印HTML内容的详细步骤。
摘要由CSDN通过智能技术生成

Android NDK开发详解打印文件之照片

Android 用户经常只在他们的设备上查看内容,但有时将屏幕显示给某人看并不足以分享信息。借助从 Android 应用打印信息的功能,用户可以查看您的应用内容的更大版本,或与未使用您的应用的其他人分享内容。通过打印,用户还可以创建信息的快照,不受是否拥有设备、电池电量是否充足或是否具有无线网络连接的影响。

在 Android 4.4(API 级别 19)及更高版本中,Android 框架提供直接从 Android 应用打印图片和文档的服务。本次培训介绍了如何在应用中启用打印功能,包括打印图片、HTML 页面和创建要打印的自定义文档。

课程

打印照片
本课介绍如何打印图片。
打印 HTML 文档
本课介绍如何打印 HTML 文档。
打印自定义文档
本课介绍如何连接到 Android 打印管理器,创建打印适配器以及构建要打印的内容。

打印照片

拍摄和分享照片是移动设备最受欢迎的用途之一。如果您的应用可以拍照、显示照片或允许用户分享图片,您应该考虑支持在您的应用中打印这些图片。Android 支持库提供了一个便捷的功能,用于使用最少量的代码和简单的打印版式选项集合来支持图片打印。

本节课介绍如何使用 v4 支持库 PrintHelper 类打印图片。

打印图片

Android 支持库 PrintHelper 类提供了一种简单的图片打印方式。该类具有单个版式选项 setScaleMode(),可让您通过以下两个选项之一进行打印:

SCALE_MODE_FIT - 此选项用于调整图片大小,使整个图片显示在页面的可打印区域内。
SCALE_MODE_FILL - 此选项用于缩放图片,使其填充页面的整个可打印区域。选择此设置意味着图片上下或左右边缘的某些部分不会打印出来。如果您未设置缩放模式,则此选项为默认值。

setScaleMode() 的这两个缩放选项都能保持图片的现有宽高比不变。以下代码示例演示了如何创建 PrintHelper 类的实例、设置缩放选项以及开始打印过程:
Kotlin

    private fun doPhotoPrint() {
        activity?.also { context ->
            PrintHelper(context).apply {
                scaleMode = PrintHelper.SCALE_MODE_FIT
            }.also { printHelper ->
                val bitmap = BitmapFactory.decodeResource(resources, R.drawable.droids)
                printHelper.printBitmap("droids.jpg - test print", bitmap)
            }
        }
    }

Java

    private void doPhotoPrint() {
        PrintHelper photoPrinter = new PrintHelper(getActivity());
        photoPrinter.setScaleMode(PrintHelper.SCALE_MODE_FIT);
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
                R.drawable.droids);
        photoPrinter.printBitmap("droids.jpg - test print", bitmap);
    }

此方法可以作为菜单项的操作来调用。请注意,对于并非始终受支持的操作(如打印),相应的菜单项应放置在溢出菜单中。如需了解详情,请参阅操作栏设计指南。

调用 printBitmap() 方法后,不需要从您的应用中执行进一步操作。此时会显示 Android 打印界面,允许用户选择打印机和打印选项。然后,用户可以打印图片或取消操作。如果用户选择打印图片,则会创建打印任务并在系统栏中显示打印通知。

如果您想在打印输出中包含除图片以外的其他内容,则必须构建一个打印文档。有关创建打印文档的信息,请参阅打印 HTML 文档或打印自定义文档课程。

打印 HTML 文档

如需在 Android 上打印简单照片之外的内容,需要在打印文档中撰写文本和添加图形。在 Android 框架中,您可以使用 HTML 以最少的代码撰写文档并进行打印。

在 Android 4.4(API 级别 19)中,WebView 类已更新,可支持打印 HTML 内容。该类使您能够加载本地 HTML 资源或从网络上下载网页,创建打印作业并将其移交给 Android 的打印服务。

本节课介绍如何快速构建包含文本和图形的 HTML 文档,并使用 WebView 打印该文档。
加载 HTML 文档

要使用 WebView 打印 HTML 文档,需要加载 HTML 资源或以字符串形式构建 HTML 文档。本部分介绍如何构建 HTML 字符串并将其加载到 WebView 进行打印。

此视图对象通常用作 Activity 布局的一部分。但是,如果您的应用未使用 WebView,则可以专门为打印目的而创建该类的实例。创建此自定义打印视图的主要步骤如下:

创建在加载 HTML 资源后启动打印任务的 WebViewClient。
将 HTML 资源加载到 WebView 对象中。

以下代码示例演示了如何创建简单的 WebViewClient 并加载即时创建的 HTML 文档:
Kotlin

    private var mWebView: WebView? = null

    private fun doWebViewPrint() {
        // Create a WebView object specifically for printing
        val webView = WebView(activity)
        webView.webViewClient = object : WebViewClient() {

            override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest) = false

            override fun onPageFinished(view: WebView, url: String) {
                Log.i(TAG, "page finished loading $url")
                createWebPrintJob(view)
                mWebView = null
            }
        }

        // Generate an HTML document on the fly:
        val htmlDocument =
                "<html><body><h1>Test Content</h1><p>Testing, testing, testing...</p></body></html>"
        webView.loadDataWithBaseURL(null, htmlDocument, "text/HTML", "UTF-8", null)

        // Keep a reference to WebView object until you pass the PrintDocumentAdapter
        // to the PrintManager
        mWebView = webView
    }
    

Java

 private WebView mWebView;

    private void doWebViewPrint() {
        // Create a WebView object specifically for printing
        WebView webView = new WebView(getActivity());
        webView.setWebViewClient(new WebViewClient() {

                public boolean shouldOverrideUrlLoading(WebView view, String url) {
                    return false;
                }

                @Override
                public void onPageFinished(WebView view, String url) {
                    Log.i(TAG, "page finished loading " + url);
                    createWebPrintJob(view);
                    mWebView = null;
                }
        });

        // Generate an HTML document on the fly:
        String htmlDocument = "<html><body><h1>Test Content</h1><p>Testing, " +
                "testing, testing...</p></body></html>";
        webView.loadDataWithBaseURL(null, htmlDocument, "text/HTML", "UTF-8", null);

        // Keep a reference to WebView object until you pass the PrintDocumentAdapter
        // to the PrintManager
        mWebView = webView;
    }
    

注意:请确保用于生成打印任务的调用发生在上一部分中创建的 WebViewClient 的 onPageFinished() 方法中。如果您没有等到页面加载完成,则打印输出可能不完整或空白,也可能完全失败。

注意:以上示例代码保存了 WebView 对象的实例,以便在创建打印作业之前不会对其进行垃圾回收。请确保您在自己的实现中也这样做,否则打印过程可能会失败。

如需在页面中添加图形,请将图形文件放在项目的 assets/ 目录中,并在 loadDataWithBaseURL() 方法的第一个参数中指定基准网址,如以下代码示例所示:
Kotlin

    webView.loadDataWithBaseURL(
            "file:///android_asset/images/",
            htmlBody,
            "text/HTML",
            "UTF-8",
            null
    )

Java

  webView.loadDataWithBaseURL("file:///android_asset/images/", htmlBody,
            "text/HTML", "UTF-8", null);
    

您还可以将 loadDataWithBaseURL() 方法替换为 loadUrl(),以加载要打印的网页,如下所示。
Kotlin

    webView.loadUrl("https://developer.android.com/about/index.html")

Java

   // Print an existing web page (remember to request INTERNET permission!):
    webView.loadUrl("https://developer.android.com/about/index.html");

使用 WebView 创建打印文档时,应注意以下限制:

您不能向文档中添加页眉或页脚,包括页码。
HTML 文档的打印选项不包括打印特定范围的页面,例如:不支持打印一个 10 页 HTML 文档中的第 2 到 4 页。
WebView 的实例一次只能处理一个打印作业。
不支持包含 CSS 打印属性(例如横向属性)的 HTML 文档。
您不能在 HTML 文档中使用 JavaScript 触发打印作业。

注意:布局中包括的 WebView 对象的内容在其加载文档后也可以打印。

如果您希望创建自定义程度更高的打印输出并完全控制打印页上的内容绘制,请转到下一课:打印自定义文档。

创建打印作业

创建 WebView 并加载 HTML 内容之后,您的应用即将完成它那部分的打印流程。接下来的步骤是访问 PrintManager,创建打印适配器,最后创建打印作业。以下示例说明了如何执行这些步骤:
Kotlin

 private fun createWebPrintJob(webView: WebView) {

        // Get a PrintManager instance
        (activity?.getSystemService(Context.PRINT_SERVICE) as? PrintManager)?.let { printManager ->

            val jobName = "${getString(R.string.app_name)} Document"

            // Get a print adapter instance
            val printAdapter = webView.createPrintDocumentAdapter(jobName)

            // Create a print job with name and adapter instance
            printManager.print(
                    jobName,
                    printAdapter,
                    PrintAttributes.Builder().build()
            ).also { printJob ->

                // Save the job object for later status checking
                printJobs += printJob
            }
        }
    }

Java

    private fun createWebPrintJob(webView: WebView) {

        // Get a PrintManager instance
        (activity?.getSystemService(Context.PRINT_SERVICE) as? PrintManager)?.let { printManager ->

            val jobName = "${getString(R.string.app_name)} Document"

            // Get a print adapter instance
            val printAdapter = webView.createPrintDocumentAdapter(jobName)

            // Create a print job with name and adapter instance
            printManager.print(
                    jobName,
                    printAdapter,
                    PrintAttributes.Builder().build()
            ).also { printJob ->

                // Save the job object for later status checking
                printJobs += printJob
            }
        }
    }

此示例保存了 PrintJob 对象的实例供应用使用,这不是必需的。您的应用可能会使用此对象跟踪正在处理的打印作业的进度。当您希望监控应用中打印作业的状态(完成、失败或用户取消)时,此方法很有用。不需要创建应用内通知,因为打印框架会自动为打印任务创建系统通知。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五一编程

程序之路有我与你同行

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值