Gprinter Android SDK V2.0 使用说明
Gprinter Android SDK旨在佳博用户更快速,更高效的在Android平台下开发和使用佳博打印机。如果您在使用SDK中碰到问题,或者发现BUG,请留言
一、下载GprinterSDKV2.0
GprinterSDKV2.0可打电话到0756-3866865,填写客户资料后,即可获得。
二、安装Gplink打印机驱动
在GprinterSDKV2.0文件夹中,可以看到Gplink.apk的软件,在手机或平板上安装此软件。Gplink提供打印服务。
三、导入Android例程
在eclipse,导入GprinterClient工程,以下对此例程进行说明,用户开发时可以先研究此例程,再进行开发
四、gprinter-v2.0.jar和commons-lang-2.6文件
可以看到在GprinterClient工程中可以开到libs文件夹中有两个文件gprinter-v2.0.jar和commons-lang-2.6,如图1
图1
gprinter-v2.0.jar,是用来提供打印时所需的API,API的详细说明可以查看手册
commons-lang-2.6.JAR,是用来处理base64的操作。
如果是用eclipse开发,新建工程,将gprinter-v2.0.jar和commons-lang-2.6拷贝到工程的libs文件夹下即可。
五、GpService.aidl文件
可以看到在scr中,com.gprinter.aidl包中有个GpService.aidl的文件,是用来和Gplink提供的服务进行交互的,如图2
图2
GpService.aidl文件说明,具体的方法说明请看 GprinterSDKV2.0文件夹中的GpService.aidl说明文档
package com.gprinter.aidl;
interface GpService{
void openPortConfigurationDialog(); //打开端口连接对话框
int printeTestPage(int PrinterId); // 打印测试页
int queryPrinterStatus(int PrinterId); //查询打印机状态
int getPrinterCommandType(int PrinterId); //查询打印机指令类型
int sendEscCommand(int PrinterId, String b64);//发送ESC指令
int sendTscCommand(int PrinterId, String b64); //发送TSC指令
}
如果是用eclipse开发,在工程的src中增加com.gprinter.aidl包,在包中加入GpService.aidl文件即可
六、绑定打印服务
可以看到,在MainAcitivty.java的onCreate方法中的对GpService进行了绑定
private GpService mGpService;
private static final String DEBUG_TAG = "MainActivity";
private PrinterServiceConnection conn = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e(DEBUG_TAG, "onCreate");
connection();
}
private void connection() {
conn = new PrinterServiceConnection();
Intent intent = new Intent("com.gprinter.aidl.GpPrintService");
bindService(intent, conn, Context.BIND_AUTO_CREATE); // 绑定服务
}
class PrinterServiceConnection implements ServiceConnection {
@Override
public void onServiceDisconnected(ComponentName name) {
Log.i("ServiceConnection", "onServiceDisconnected() called");
mGpService = null;
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mGpService =GpService.Stub.asInterface(service);
}
};
七、实现打印机的操作
1、在openPortDialogueClicked方法,可以打开端口连接对话框
public void openPortDialogueClicked(View view) {
try {
mGpService.openPortConfigurationDialog(); // 点击连接打印机时,需要打印机错误灯不闪烁的情况下才能连接
} catch (RemoteException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
打开对话框后,可以看到如下画面,如图3,此对话框可以对蓝牙、USB、网口打印机进行连接操作。
图3
打印机开机,选择正确的端口,如果是usb接口则需要otg的转接线连接usb打印机。再点击连接按钮,则可以连接到佳博打印机。
2、在printTestPageClicked实现打印测试页
public void printTestPageClicked(View view) {
try {
int rel = mGpService.printeTestPage(mPrinterIndex); //
Log.i("ServiceConnection", "rel " + rel);
GpCom.ERROR_CODE r=GpCom.ERROR_CODE.values()[rel];
if(r != GpCom.ERROR_CODE.SUCCESS){ //显示错误信息
Toast.makeText(getApplicationContext(),GpCom.getErrorText(r),
Toast.LENGTH_SHORT).show();
}
} catch (RemoteException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
如果连接的是票据打印机则测试页内容如图4:
图4
如果连接的是标签打印机则测试页内容如图5:
图5
3、在getPrinterStatusClicked中可以获取打印机当前状态。每次执行打印之前需获取打印机状态,打印机正常才能够再发送命令给打印机
public void getPrinterStatusClicked(View view) {
try {
int status = mGpService.queryPrinterStatus(mPrinterIndex);
String str = new String();
if (status == GpCom.STATE_NO_ERR) {
str = "打印机正常";
} else if ((byte) (status & GpCom.STATE_OFFLINE) > 0) {
str = "打印机脱机";
} else if ((byte) (status & GpCom.STATE_PAPER_ERR) > 0) {
str = "打印机缺纸";
} else if ((byte) (status & GpCom.STATE_COVER_OPEN) > 0) {
str = "打印机开盖";
} else if ((byte) (status & GpCom.STATE_ERR_OCCURS) > 0) {
str = "打印机出错";
}
Toast.makeText(getApplicationContext(),
"打印机:" + '0' + " 状态:" + str, Toast.LENGTH_SHORT).show();
} catch (RemoteException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
4、在getPrinterCommandTypeClicked中可以获取打印机的指令类型,票据打印机为ESC指令,标签打印机为TSC指令
public void getPrinterCommandTypeClicked(View view) {
try {
int type = mGpService.getPrinterCommandType(mPrinterIndex);
if (type == GpCom.ESC_COMMAND) {
Toast.makeText(getApplicationContext(), "打印机使用ESC命令",
Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getApplicationContext(), "打印机使用TSC命令",
Toast.LENGTH_SHORT).show();
}
} catch (RemoteException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
5、在printReceiptClicked发送票据,每次打印之前查询打印机状态
public void printReceiptClicked(View view) {
try {
int type = mGpService.getPrinterCommandType(mPrinterIndex);
if (type == GpCom.ESC_COMMAND) {
int status = mGpService.queryPrinterStatus(mPrinterIndex);
if (status == GpCom.STATE_NO_ERR) {
sendReceipt();
}
else{
Toast.makeText(getApplicationContext(),
"打印机错误!", Toast.LENGTH_SHORT).show();
}
}
}
catch (RemoteException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
票据的内容编辑,按照ESC指令编写,可以参考EscComand API说明文件
void sendReceipt(){
EscCommand esc = new EscCommand();
esc.addPrintAndFeedLines((byte)3);
esc.addSelectJustification(JUSTIFICATION.CENTER);//设置打印居中
esc.addSelectPrintModes(FONT.FONTA, ENABLE.OFF,ENABLE.ON, ENABLE.ON, ENABLE.OFF);//设置为倍高倍宽
esc.addText("Sample\n"); // 打印文字
esc.addPrintAndLineFeed(); /*打印文字*/
esc.addSelectPrintModes(FONT.FONTA, ENABLE.OFF,ENABLE.OFF, ENABLE.OFF, ENABLE.OFF);//取消倍高倍宽
esc.addSelectJustification(JUSTIFICATION.LEFT);//设置打印左对齐
esc.addText("Print text\n"); // 打印文字
esc.addText("Welcome to use Gprinter!\n"); // 打印文字
esc.addPrintAndLineFeed();
/*打印图片*/
esc.addText("Print bitmap!\n"); // 打印文字
Bitmap b = BitmapFactory.decodeResource(getResources(),
R.drawable.gprinter);
esc.addRastBitImage(b,b.getWidth(),0); //打印图片 /*打印一维条码*/
esc.addText("Print code128\n"); // 打印文字
esc.addSelectPrintingPositionForHRICharacters(HRI_POSITION.BELOW);//设置条码可识别字符位置在条码下方
esc.addSetBarcodeHeight((byte)60); //设置条码高度为60点
esc.addCODE128("Gprinter"); //打印Code128码
esc.addPrintAndLineFeed(); /*QRCode命令打印
此命令只在支持QRCode命令打印的机型才能使用。
在不支持二维码指令打印的机型上,则需要发送二维条码图片
*/
esc.addText("Print QRcode\n"); // 打印文字
esc.addSelectErrorCorrectionLevelForQRCode((byte)0x31); //设置纠错等级
esc.addSelectSizeOfModuleForQRCode((byte)3);//设置qrcode模块大小
esc.addStoreQRCodeData("www.gprinter.com.cn");//设置qrcode内容
esc.addPrintQRCode();//打印QRCode
esc.addPrintAndLineFeed(); /*打印文字*/
esc.addSelectJustification(JUSTIFICATION.CENTER);//设置打印左对齐
esc.addText("Completed!\r\n"); // 打印结束
esc.addPrintAndLineFeed(); Vector<Byte> datas = esc.getCommand(); //发送数据
Byte[] Bytes = datas.toArray(new Byte[datas.size()]);
byte[] bytes = ArrayUtils.toPrimitive(Bytes);
String str = Base64.encodeToString(bytes, Base64.DEFAULT);
int rel;
try {
rel = mGpService.sendEscCommand(mPrinterIndex, str);
GpCom.ERROR_CODE r=GpCom.ERROR_CODE.values()[rel];
if(r != GpCom.ERROR_CODE.SUCCESS){
Toast.makeText(getApplicationContext(),GpCom.getErrorText(r),
Toast.LENGTH_SHORT).show();
}
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
打印效果如图6
图6
6、在printLabelClicked发送标签,每次打印之前查询打印机状态
public void printLabelClicked(View view) {
try {
int type = mGpService.getPrinterCommandType(mPrinterIndex);
if (type == GpCom.TSC_COMMAND) {
int status = mGpService.queryPrinterStatus(mPrinterIndex);
if (status ==GpCom.STATE_NO_ERR) {
sendLabel();
}
else{
Toast.makeText(getApplicationContext(),
"打印机错误!", Toast.LENGTH_SHORT).show();
}
}
} catch (RemoteException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
标签的内容编辑,按照TSC指令发送,可以参考TscComand API说明文件
void sendLabel(){
TscCommand tsc = new TscCommand();
tsc.addSize(60, 60); //设置标签尺寸,按照实际尺寸设置
tsc.addGap(0); //设置标签间隙,按照实际尺寸设置,如果为无间隙纸则设置为0
tsc.addDirection(DIRECTION.BACKWARD,MIRROR.NORMAL);//设置打印方向
tsc.addReference(0, 0);//设置原点坐标
tsc.addTear(ENABLE.ON); //撕纸模式开启
tsc.addCls();// 清除打印缓冲区
//绘制简体中文
tsc.addText(20,20,FONTTYPE.SIMPLIFIED_CHINESE,ROTATION.ROTATION_0,FONTMUL.MUL_1,FONTMUL.MUL_1,"Welcome to use Gprinter!");
//绘制图片
Bitmap b = BitmapFactory.decodeResource(getResources(),
R.drawable.gprinter);
tsc.addBitmap(20,50, BITMAP_MODE.OVERWRITE, b.getWidth(),b);
//绘制二维条码,此命令只在部分机型上适用
tsc.addQRCode(250, 80, EEC.LEVEL_L,5,ROTATION.ROTATION_0, " www.gprinter.com.cn");
//绘制一维条码
tsc.add1DBarcode(20,250, BARCODETYPE.CODE128, 100, READABEL.EANBEL, ROTATION.ROTATION_0, "Gprinter");
tsc.addPrint(1,1); // 打印标签
tsc.addSound(2, 100); //打印标签后 蜂鸣器响 Vector<Byte> datas = tsc.getCommand(); //发送数据
Byte[] Bytes = datas.toArray(new Byte[datas.size()]);
byte[] bytes = ArrayUtils.toPrimitive(Bytes);
String str = Base64.encodeToString(bytes, Base64.DEFAULT);
int rel;
try {
rel = mGpService.sendEscCommand(mPrinterIndex, str);
GpCom.ERROR_CODE r=GpCom.ERROR_CODE.values()[rel];
if(r != GpCom.ERROR_CODE.SUCCESS){
Toast.makeText(getApplicationContext(),GpCom.getErrorText(r),
Toast.LENGTH_SHORT).show();
}
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
图7
Gprinter Android SDK V2.0 使用说明的更多相关文章
- Gprinter Android SDK V1.0 使用说明
佳博打印机代理商淘宝店https://shop107172033.taobao.com/index.htm?spm=2013.1.w5002-9520741823.2.Sqz8Pf 在此店购买的打印机 ...
- Gprinter Android SDK V2.1 使用说明
下载:http://download.csdn.net/download/abc564643122/8872249
- Gprinter Android SDK V2.1.4 使用说明
佳博打印机Android的SDK开发包,已更新到Gprinter Android SDK V2.1.4. IOS的SDK开发包更新为GprinterSDKandDemoforIOS_v1.0.8. 根 ...
- 原因是未找到“sgen.exe”,或未安装 .NET Framework SDK v2.0
visual studio编译出现错误:错误 2 任务失败,原因是未找到“sgen.exe”,或未安装 .NET Framework SDK v2.0.该任务正在注册表项 HKEY_LOCAL_MAC ...
- Android SDK 4.0.3 开发环境配置及运行
最近又装了一次最新版本的ADK环境 目前最新版是Android SDK 4.0.3 本文的插图和文本虽然是Android2.2的 步骤都是一样的,如果安装的过程中遇到什么问题,可以留言,我会尽快回复! ...
- Android SDK 5.0 这个语句带来折腾 - 生命在于折腾!
Android SDK 5.0 带来的这番折腾 - 生命在于折腾! 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一 ...
- Deepin15.8系统下安装QorIQ Linux SDK v2.0 yocto成功完美运行的随笔
2019.2.17日:最终安装成功,完美解决! 2019.2.16日:最终安装未成功,但是过程中排除 了几个bug,前进了几步,仅供参考. 写在最前面,yocto安装是有系统要求的,Deepin 15 ...
- Kinect for Windows SDK v2.0 开发笔记 (十五) 手势帧
(转载请注明出处) 使用SDK: Kinect for Windows SDK v2.0 public preview1409 同前面,由于SDK未完毕,不附上函数/方法/接口的超链接. 这次最 ...
- 安卓模拟器Android SDK 4.0.3 R2安装完整图文教程
在最新的Android 4.0.3 R2模拟器中,已经加入了GPU支持,可以支持OpenGL ES 2.0标准,让开发者可以借助模拟器来测试自己的OpenGL游戏.在去年新增了摄像头支持之后,现在的新 ...
随机推荐
- 计算字符串的最长回文子串 :Manacher算法介绍
转自: http://www.open-open.com/lib/view/open1419150233417.html Manacher算法 在介绍算法之前,首先介绍一下什么是回文串,所谓回文串,简 ...
- OpenWrt挂载USB储存设备实现Samba共享
没有USB接口的路由器不是好路由器,有了USB接口OpenWrt才有更多的玩法,比如挂载U盘.移动硬盘等USB储存设备实现Samba共享,打造小型家庭服务器. 1.安装与USB相关的软件包: opkg ...
- 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...
- 20140704笔试面试总结(java)
1.java数组定义 1.与其他高级语言不同,Java在数组声明时并不为数组分配存储空间,因此,在声明的[]中不能指出数组的长度 2.为数组分配空间的两种方法:数组初始化和使用new运算符 3.未分配 ...
- Linux学习笔记21——线程同步的两种方式
一 用信号量同步 1 信号量函数的名字都以sem_开头,线程中使用的基本信号量函数有4个 2 创建信号量 #include<semaphore.h> int sem_init(sem_t ...
- (转载)sinaeditor漏洞
SinaEditor简介 SinaEditor是基于新浪博客编辑器的开源编辑器.您可以用它来编辑富文本内容. 编辑器的核心是一个执行队列的调度系统,加入插件来实现功能,并通过事件来驱动编辑器的运行.我 ...
- MySQL Server类型之MySQL客户端工具的下载、安装和使用
本博文的主要内容有 .MySQL Server 5.5系列的下载 .MySQL Server 5.5系列的安装 .MySQL Server 5.5系列的使用 .MySQL Server 5.5系列的卸 ...
- DOM方法
DOM常用方法: 方法 描述 getElementById() 返回带有指定 ID 的元素. getElementsByTagName() 返回包含带有指定标签名称的所有元素的节点列表(集合/节点数组 ...
- firefox如何restart重启
1.开发者工具栏可以对firefox进行重启,不是关闭firefox又打开那种重启
- SQL profile纵览(10g)
第一篇:介绍 10g开始,查询优化器(Query optimizer)扩展成自动调整优化器(Automatic Tuning Optimizer).也就是扩展了功能.此时,我们就可以让 ...