1. 为什么必须用离线打包?云打包的“硬伤”在哪里
很多刚开始用uniapp对接芯烨xprinter打印机的朋友,可能都尝试过直接云打包,毕竟方便嘛,点几下按钮就能生成安装包。但很快你就会发现,这条路走不通,控制台会报错,或者打包成功了但打印机就是没反应。核心原因就一个:芯烨xprinter的安卓SDK依赖一个后台服务(Service),而uniapp的云打包服务无法让你配置这个Service。
你可以把云打包想象成一个“全自动厨房”,你只能提供食材(你的uniapp代码),但厨房内部怎么摆锅碗瓢盆、怎么开火,你是控制不了的。芯烨SDK需要的那个PosprinterService,就像是厨房里一个特定的灶台,你必须提前安装好它,云打包这个“厨房”不提供这个定制化安装服务。所以,你只能自己“装修厨房”,也就是采用离线打包的方式。
离线打包,简单说就是把你的uniapp项目源代码,导入到一个原生的Android Studio项目里,然后在这个原生环境里,手动添加芯烨SDK的jar包、配置Service、编写原生插件代码,最后再编译生成APK。这个过程听起来有点麻烦,但好处是你拥有了完全的控制权,可以搞定任何云打包搞不定的原生集成需求。我刚开始也觉得麻烦,但踩过两次坑、跑通一次之后,发现其实也就那么几步固定流程,掌握了之后反而更踏实,以后遇到其他需要原生能力的插件,你也能自己搞定了。
2. 前期准备:搭建你的离线打包“工作台”
磨刀不误砍柴工,动手写代码之前,得先把环境搭好。这里我列一个清单,你跟着检查一遍,确保工具都齐备。
第一,Android Studio(简称AS)。这是谷歌官方的安卓开发IDE,离线打包的核心战场。建议去官网下载最新稳定版。安装时,记得把Android SDK也勾选上,SDK版本建议选择API Level 24(Android 7.0)及以上,兼容性会比较好。
第二,HBuilderX。这是我们编写uniapp项目的主力工具,这个肯定有了。确保你的HBuilderX是最新正式版,避免一些已知的兼容性问题。
第三,关键的离线打包SDK。这个特别重要!你不能直接用HBuilderX云打包的产物。需要去DCloud官方插件市场,或者从uniapp的官方文档里,找到“App离线打包SDK”并下载。这个SDK包里包含了让uniapp代码能在原生安卓环境里运行的核心库。我一般会下载对应我HBuilderX版本的SDK,这样最稳妥。
第四,芯烨xprinter的安卓SDK。这个需要你去芯烨的官方网站,联系技术支持或者从开发者专区获取。通常他们会提供一个PosPrinterSDK.jar文件,有时候还会附带一些说明文档或示例代码。拿到这个jar包,就是我们成功的关键。
第五,一个用来测试的芯烨打印机。最好是USB连接的,因为USB调试起来最直接,网络和蓝牙的配置会多出一些变量。准备好一条USB数据线,以及一台安卓真机(用于调试和测试)。
把这些东西都准备好,放在你电脑上一个容易找到的目录里,我们的“工作台”就算搭好了。接下来,就是创建一个“样板间”项目。
3. 创建并配置Android Studio原生插件工程
DCloud官方为离线打包插件开发提供了一个非常好的模板项目,叫做 UniPlugin-Hello-AS。我们不需要从零创建一个安卓项目,直接用这个模板会省下大量配置时间。
第一步,获取模板工程。 你下载的“App离线打包SDK”里,通常就包含这个UniPlugin-Hello-AS项目。如果找不到,可以去DCloud的GitHub仓库或者官方文档里搜索一下,肯定能找到下载链接。
第二步,用Android Studio打开这个项目。 打开后,先别急着改代码,让它自动完成Gradle同步(Sync)。这个过程可能会下载一些依赖库,需要一点时间,也取决于你的网络环境。
第三步,引入芯烨SDK的jar包。 找到项目里的 app -> libs 目录(如果没有就自己新建一个)。把我们准备好的 PosPrinterSDK.jar 文件,直接复制粘贴到这个 libs 文件夹里。
光复制进去还不够,得告诉Gradle编译系统:“嘿,这里有个新库要用”。所以我们需要修改 app 模块下的 build.gradle 文件。在 dependencies 块里,添加一行依赖声明:
dependencies {
// ... 其他已有的依赖
implementation files('libs/PosPrinterSDK.jar') // 添加这行
}
添加完后,点击Android Studio右上角的“Sync Now”同步一下。如果没报错,就说明jar包引入成功了。
第四步,配置AndroidManifest.xml。 这是安卓应用的“配置清单”,所有组件(比如Activity、Service)都要在这里声明。芯烨SDK需要的后台服务PosprinterService,就必须在这里注册。
打开 app -> src -> main -> AndroidManifest.xml 文件,在 <application> 标签内部,添加下面这行Service声明:
<service android:name="net.posprinter.service.PosprinterService" />
这一步非常关键,漏了它,你的应用在运行时根本找不到这个服务,绑定服务(bindService)那一步就会失败。我当初就在这里卡了半天,一直报“Service not found”的错误,后来才发现是这里忘了配置。
4. 编写安卓原生插件模块:与打印机“对话”的桥梁
现在,我们来编写核心的Java代码,也就是原生插件模块。这个模块的作用,是在安卓原生层调用芯烨SDK的功能,然后通过uniapp的桥接机制,暴露给上层的JavaScript(也就是我们的Vue页面)来调用。
在 UniPlugin-Hello-AS 项目中,一般会有一个专门的目录存放自定义插件,比如 uniplugins -> components。我们在里面新建一个Java类,比如就叫 XPrinterModule.java。
下面我结合原始文章里的代码,给你详细拆解每一个关键方法,并补充一些容易踩坑的细节。
首先,是类的定义和初始化。 我们的类需要继承 UniModule,这样才符合uniapp原生插件的规范。
package com.yourcompany.xprinter; // 包名改成你自己的
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import com.taobao.weex.annotation.


134

被折叠的 条评论
为什么被折叠?



