Android安卓连接打印机进行打印PDF 图片 文件等,代码粘贴就能用

两种打印方式使用系统自带的打印管理器和安装插件打印(看系统打印可以直接跳过插件打印代码部分)
打印前首先需要确认手机自带打印管理器是否支持打印各种格式的文件,如果不支持需要下载打印机相应的插件到手机上
在AndroidManifest.xml引入读取外部存储的权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

在build.grade文件引入依赖

 
dependencies {
'androidx.print:print:1.0.0'
}

 安装插件打印(我这个是用惠普的HP打印服务插件) 

MainActivity.Java文件下

package com.bzd.myapplication; // 定义包名

import android.Manifest; // 导入权限管理类
import android.app.Activity; // 导入Activity类
import android.content.Intent; // 导入Intent类,用于启动活动或服务
import android.content.pm.PackageManager; // 导入包管理器类,用于检查和请求权限
import android.net.Uri; // 导入Uri类,用于标识内容的统一资源标识符
import android.os.Bundle; // 导入Bundle类,用于保存activity的状态信息
import android.os.CancellationSignal; // 用于支持打印任务取消操作
import android.os.ParcelFileDescriptor; // 支持文件描述符的操作
import android.print.PageRange; // 打印页码范围的支持
import android.print.PrintAttributes; // 打印属性设置
import android.print.PrintDocumentAdapter; // 文档适配器,用于打印
import android.print.PrintDocumentInfo; // 文档信息封装
import android.print.PrintJob; // 打印作业管理
import android.print.PrintManager; // 打印管理器,负责与打印服务交互
import android.util.Log; // 提供日志功能
import android.view.View; // 视图处理相关
import android.widget.Button; // 按钮控件
import android.widget.Toast; // 显示简短消息

import androidx.annotation.NonNull; // 非空注解
import androidx.annotation.Nullable; // 可空注解
import androidx.appcompat.app.AppCompatActivity; // 基础Activity类,提供兼容性支持
import androidx.core.app.ActivityCompat; // 权限请求辅助类
import androidx.core.content.ContextCompat; // Context 兼容性包装

import java.io.FileInputStream; // 文件输入流
import java.io.FileOutputStream; // 文件输出流
import java.io.IOException; // 输入输出异常

// 主活动类
public class MainActivity extends AppCompatActivity {

    private static final int REQUEST_CODE_PICK_PDF = 1; // 请求代码,用于识别PDF选择
    private static final int REQUEST_CODE_PERMISSION = 2; // 请求代码,用于权限请求
    private Uri pdfUri; // 存储所选PDF文件的Uri

    @Override
    protected void onCreate(Bundle savedInstanceState) { // 当创建活动时调用
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main); // 设置活动布局

        Button pickPdfButton = findViewById(R.id.pick_pdf_button); // 获取选择PDF按钮
        pickPdfButton.setOnClickListener(new View.OnClickListener() { // 设置点击监听器
            @Override
            public void onClick(View v) {
                checkPermissionAndOpenFileChooser(); // 检查权限并打开文件选择器
            }
        });

        Button printButton = findViewById(R.id.print_button); // 获取打印按钮
        printButton.setOnClickListener(new View.OnClickListener() { // 设置点击监听器
            @Override
            public void onClick(View v) {
                if (pdfUri != null) { // 如果有选中的PDF文件
                    sendToHPPrinter(pdfUri); // 发送到HP打印机
                } else {
                    Toast.makeText(MainActivity.this, "No PDF file selected", Toast.LENGTH_SHORT).show(); // 提示未选择PDF文件
                }
            }
        });
    }

    private void checkPermissionAndOpenFileChooser() { // 检查权限并打开文件选择器
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_CODE_PERMISSION); // 请求读取外部存储权限
        } else {
            openFileChooser(); // 打开文件选择器
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { // 处理权限请求结果
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == REQUEST_CODE_PERMISSION) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                openFileChooser(); // 如果权限被授予,则打开文件选择器
            } else {
                Toast.makeText(this, "Permission denied to read external storage", Toast.LENGTH_SHORT).show(); // 如果权限被拒绝,则显示提示
            }
        }
    }

    private void openFileChooser() { // 打开文件选择器
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.setType("application/pdf");
        startActivityForResult(intent, REQUEST_CODE_PICK_PDF); // 启动活动以获取PDF文件
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { // 处理活动结果
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_CODE_PICK_PDF && resultCode == Activity.RESULT_OK) {
            if (data != null) {
                pdfUri = data.getData(); // 获取选择的PDF文件的Uri
                Log.d("MainActivity", "Selected PDF URI: " + pdfUri.toString()); // 日志记录选择的PDF文件Uri
            }
        }
    }

    private void sendToHPPrinter(Uri pdfUri) { // 发送PDF到HP打印机
        try {
            Intent printIntent = new Intent(Intent.ACTION_SEND);
            printIntent.setType("application/pdf");
            printIntent.putExtra(Intent.EXTRA_STREAM, pdfUri); // 添加PDF文件Uri作为额外数据
            printIntent.setPackage("com.hp.android.printservice"); // 设置HP打印服务的应用程序包名

            if (printIntent.resolveActivity(getPackageManager()) != null) {
                startActivity(printIntent); // 如果存在可处理此意图的活动,则启动之
            } else {
                Toast.makeText(this, "HP Print Service not installed", Toast.LENGTH_SHORT).show(); // 如果未安装HP打印服务,则提示用户
            }
        } catch (Exception e) {
            e.printStackTrace();
            Toast.makeText(this, "Error sending PDF to HP Printer", Toast.LENGTH_SHORT).show(); // 发生错误时提示用户
        }
    }
}

MainActivity.xml文件下 第一个按键是上传第二个是打印

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/pick_pdf_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Pick PDF"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="50dp"/>

    <Button
        android:id="@+id/print_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Send to HP Printer"
        android:layout_below="@id/pick_pdf_button"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="20dp"/>
</RelativeLayout>

使用系统自带的打印管理器的代码

MainActivity.Java 文件下 xml文件和上面的一样

import android.Manifest; // 导入权限管理类
import android.app.Activity; // 导入Activity类
import android.content.Intent; // 导入Intent类,用于启动其他组件
import android.content.pm.PackageManager; // 导入包管理器类,用于检查和请求权限
import android.net.Uri; // 导入Uri类,用于标识内容的统一资源标识符
import android.os.Bundle; // 导入Bundle类,用于存储活动的状态信息
import android.os.CancellationSignal; // 导入取消信号类,用于取消打印操作
import android.os.ParcelFileDescriptor; // 导入文件描述符类,用于访问文件
import android.print.PageRange; // 导入页面范围类,用于指定要打印的页面
import android.print.PrintAttributes; // 导入打印属性类,用于定义打印文档的属性
import android.print.PrintDocumentAdapter; // 导入打印文档适配器类,用于创建自定义打印逻辑
import android.print.PrintJob; // 导入打印作业类,表示一个打印任务
import android.print.PrintManager; // 导入打印管理器类,用于管理打印作业
import android.util.Log; // 导入日志记录工具类
import android.view.View; // 导入视图类
import android.widget.Button; // 导入按钮控件
import android.widget.Toast; // 导入吐司消息提示框
import androidx.annotation.NonNull; // 导入非空注解
import androidx.annotation.Nullable; // 导入可空注解
import androidx.appcompat.app.AppCompatActivity; // 导入AppCompatActivity类,作为主活动的基础
import androidx.core.app.ActivityCompat; // 导入ActivityCompat类,用于兼容性请求权限
import androidx.core.content.ContextCompat; // 导入ContextCompat类,用于兼容性获取应用权限状态

import java.io.FileInputStream; // 导入文件输入流类,用于读取文件
import java.io.FileOutputStream; // 导入文件输出流类,用于写入文件
import java.io.IOException; // 导入IO异常类

public class MainActivity extends AppCompatActivity { // 定义主活动类

    private static final int REQUEST_CODE_PICK_PDF = 1; // 请求选择PDF文件的代码
    private static final int REQUEST_CODE_PERMISSION = 2; // 请求外部存储读取权限的代码
    private Uri pdfUri; // 存储选中的PDF文件的URI

    @Override
    protected void onCreate(Bundle savedInstanceState) { // 当活动第一次被创建时调用
        super.onCreate(savedInstanceState); // 调用父类的方法
        setContentView(R.layout.activity_main); // 设置活动的布局

        Button pickPdfButton = findViewById(R.id.pick_pdf_button); // 获取选择PDF按钮
        pickPdfButton.setOnClickListener(new View.OnClickListener() { // 设置按钮点击事件监听器
            @Override
            public void onClick(View v) {
                checkPermissionAndOpenFileChooser(); // 检查权限并打开文件选择器
            }
        });

        Button printButton = findViewById(R.id.print_button); // 获取打印按钮
        printButton.setOnClickListener(new View.OnClickListener() { // 设置按钮点击事件监听器
            @Override
            public void onClick(View v) {
                if (pdfUri != null) { // 如果已选择PDF文件
                    printPdf(pdfUri); // 打印PDF文件
                } else {
                    Toast.makeText(MainActivity.this, "No PDF file selected", Toast.LENGTH_SHORT).show(); // 提示未选择PDF文件
                }
            }
        });
    }

    private void checkPermissionAndOpenFileChooser() { // 检查权限并打开文件选择器
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { // 检查是否已授予读取外部存储的权限
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_CODE_PERMISSION); // 请求权限
        } else {
            openFileChooser(); // 打开文件选择器
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { // 当用户响应权限请求时调用
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == REQUEST_CODE_PERMISSION) { // 如果是读取外部存储权限请求的结果
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 如果权限被授予
                openFileChooser(); // 打开文件选择器
            } else {
                Toast.makeText(this, "Permission denied to read external storage", Toast.LENGTH_SHORT).show(); // 提示权限被拒绝
            }
        }
    }

    private void openFileChooser() { // 打开文件选择器
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT); // 创建意图以获取内容
        intent.setType("application/pdf"); // 设置类型为PDF
        startActivityForResult(intent, REQUEST_CODE_PICK_PDF); // 启动活动以获取结果
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { // 当子活动返回结果时调用
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_CODE_PICK_PDF && resultCode == Activity.RESULT_OK) { // 如果是选择PDF文件的结果并且成功
            if (data != null) {
                pdfUri = data.getData(); // 获取所选PDF文件的URI
                Log.d("MainActivity", "Selected PDF URI: " + pdfUri.toString()); // 记录所选PDF文件的URI
            }
        }
    }

    private void printPdf(Uri pdfUri) { // 打印PDF文件
        PrintManager printManager = (PrintManager) getSystemService(PRINT_SERVICE); // 获取打印服务
        String jobName = getString(R.string.app_name) + " Document"; // 设置打印任务名称

        try {
            ParcelFileDescriptor pfd = getContentResolver().openFileDescriptor(pdfUri, "r"); // 打开PDF文件的文件描述符
            if (pfd != null) {
                PrintDocumentAdapter printAdapter = new PrintDocumentAdapter() { // 创建打印文档适配器
                    // 下面是实现打印文档适配器的具体方法
                    ...
                };

                PrintJob printJob = printManager.print(jobName, printAdapter, new PrintAttributes.Builder().build()); // 开始打印任务
                // 可以在这里跟踪打印任务的状态
            }
        } catch (IOException e) {
            e.printStackTrace();
            Toast.makeText(this, "Error opening PDF file", Toast.LENGTH_SHORT).show(); // 处理错误:打开PDF文件失败
        }
    }chaunchaun

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值