Android標籤印表機連線與列印位置調動方法總結
一、獲取連線的標籤列印裝置
private static List<UsbDevice> deviceList;
private static String deviceArrayLisr;
private static UsbDevice mUSBDevice;
public static PrinterInstance myPrinter;
public static String devicesName = "未知裝置";
private static String devicesAddress;
private static final String ACTION_USB_PERMISSION= "com.android.usb.USB_PERMISSION";
public static boolean isConnected = false;
public static void getDevice() { if (myPrinter == null) { /** * 檢測所有的列印裝置 */ UsbManager manager = (UsbManager) mContext.getSystemService(Context.USB_SERVICE);//獲取usb許可權 HashMap<String, UsbDevice> devices = manager.getDeviceList();deviceList = new ArrayList<>(); for (UsbDevice device : devices.values()) { /** * 判斷是都是列印裝置。目前支援 (1155 != vendorId || 22304 != productId) && (1659 != vendorId || 8965 != productId) 兩種 */ if (USBPort.isUsbPrinter(device)) { if (device.getVendorId() == 1155&& device.getProductId() == 22304) { deviceArrayLisr = device.getDeviceName() + "\nvid: " + device.getVendorId() + " pid: " + device.getProductId(); deviceList.add(device); } } } if (deviceList.isEmpty()) { ToastUtil.shortShow(mContext.getResources().getString(R.string.no_connected)); return; } mUSBDevice = deviceList.get(0); if (mUSBDevice == null) { mHandler.obtainMessage(PrinterConstants.Connect.FAILED).sendToTarget(); return; } myPrinter = PrinterInstance.getPrinterInstance(mContext, mUSBDevice, mHandler); devicesName = mUSBDevice.getDeviceName(); devicesAddress = "vid: " + mUSBDevice.getVendorId() + " pid: " + mUSBDevice.getProductId(); UsbManager mUsbManager = (UsbManager) mContext.getSystemService(Context.USB_SERVICE); if (mUsbManager.hasPermission(mUSBDevice)) { myPrinter.openConnection(); } else { // 沒有許可權詢問使用者是否授予許可權 PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 0, new Intent(ACTION_USB_PERMISSION), 0); IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION); filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED); filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED); mContext.registerReceiver(mUsbReceiver, filter); mUsbManager.requestPermission(mUSBDevice, pendingIntent); // 該程式碼執行後,系統彈出一個對話方塊 } } }
二、handle
// 用於接受連線狀態訊息的 Handler @SuppressLint("HandlerLeak") public static Handler mHandler = new Handler() { @SuppressLint("ShowToast") @Override public void handleMessage(Message msg) { switch (msg.what) { case PrinterConstants.Connect.SUCCESS: ToastUtil.shortShow("連線成功"); isConnected = true; Constants.ISCONNECTED = isConnected; Constants.DEVICE_NAME = devicesName; break; case PrinterConstants.Connect.FAILED: isConnected = false; ToastUtil.shortShow(mContext.getResources().getString(R.string.conn_failed)); Log.i(TAG, "連線失敗!"); break; case PrinterConstants.Connect.CLOSED: isConnected = false; Constants.ISCONNECTED = isConnected; Constants.DEVICE_NAME = devicesName; Log.i(TAG, "連線關閉!"); break; case PrinterConstants.Connect.NODEVICE: isConnected = false; ToastUtil.shortShow(mContext.getResources().getString(R.string.conn_no)); break; case 0: ToastUtil.shortShow("列印通訊正常"); break; case -1: ToastUtil.shortShow("印表機通訊異常,請檢查藍芽連線"); vibrator(); break; case -2: ToastUtil.shortShow("列印缺紙"); vibrator(); break; case -3: ToastUtil.shortShow("印表機開蓋"); vibrator(); break; default: break; } updateButtonState(isConnected);//此方法用於更新ui,更新印表機的連線狀態 } };
三、receiver
private static final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() { @Override @SuppressLint("NewApi") public void onReceive(Context context, Intent intent) { String action = intent.getAction(); Log.w(TAG, "receiver action: " + action); if (ACTION_USB_PERMISSION.equals(action)) { synchronized (this) { mContext.unregisterReceiver(mUsbReceiver); UsbDevice device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false) && mUSBDevice.equals(device)) { myPrinter.openConnection(); } else { mHandler.obtainMessage(PrinterConstants.Connect.FAILED).sendToTarget(); Log.e(TAG, "permission denied for device " + device); } } } } };
四、使用了廣播要在onDestroy方法中關閉
public void onDestroy() { XLog.e(TAG, "yxz at SettingActivity.java onDestroy() progressdialog"); super.onDestroy(); if (hasRegDisconnectReceiver) { mContext.unregisterReceiver(mUsbReceiver); hasRegDisconnectReceiver = false; // Log.i(TAG, "關閉了廣播!"); } }
五、斷開連線
/** * 斷開連線 */ public static void breakPrinter() { if (myPrinter != null) { /** * 斷開列印裝置的連線 */ myPrinter.closeConnection(); myPrinter = null;//清空列印物件 XLog.i(TAG, "yxz at SettingActivity.java onClick() mPrinter:" + myPrinter); } if (isConnected) { tv_device_name.setText("裝置名稱: " + "思普瑞特價籤機"); label_print_state.setText(mContext.getResources().getString(R.string.on_line)); } else { tv_device_name.setText("裝置名稱:未連線"); label_print_state.setText(mContext.getResources().getString(R.string.off_line)); } // label_print_state.setText(mContext.getResources().getString(R.string.off_line)); ToastUtil.shortShow("已斷開連線"); }
六、列印方法
import android.content.Context; import com.printer.sdk.PrinterConstants; import com.printer.sdk.PrinterConstants.PAlign; import com.printer.sdk.PrinterConstants.PBarcodeType; import com.printer.sdk.PrinterInstance; import com.printer.sdk.exception.ParameterErrorException; import com.printer.sdk.exception.PrinterPortNullException; import com.printer.sdk.exception.WriteException; import org.apache.http.util.TextUtils; import java.util.List; public class PrintLabelGaomi { //多個列印 public void doPrintTSPL(final PrinterInstance iPrinter, final Context mContext, final List<ProductLabelBean> productLabelBeanList) { final boolean printer_direction = (boolean) ACache.get(mContext.getApplicationContext()).getAsObject(Constants.PRINT_DIRECTION); android.util.Log.d("cai", "是否列印" + printer_direction); new Thread() { @Override public void run() { for (ProductLabelBean p : productLabelBeanList) { int left = com.android.hboxs.gaomicashier.common.hardware.label.PrefUtils.getInt(mContext, "leftmargin", 0); int top = com.android.hboxs.gaomicashier.common.hardware.label.PrefUtils.getInt(mContext, "topmargin", 0); int numbers = com.android.hboxs.gaomicashier.common.hardware.label.PrefUtils.getInt(mContext, "printnumbers", 1); int isBeep = com.android.hboxs.gaomicashier.common.hardware.label.PrefUtils.getInt(mContext, "isBeep", 0); try { // 設定標籤紙大小 型號SIZE_58mm 尺寸56 * 8:45 * 8 //45 iPrinter.pageSetupTSPL(PrinterConstants.SIZE_80mm, 80 * 8, 50 * 8); // 清除快取區內容 iPrinter.printText("CLS\r\n"); // 設定標籤的參考座標原點 if (left == 0 || top == 0) { // 不做設定,預設 } else { iPrinter.sendStrToPrinterTSPL("REFERENCE " + left * 8 + "," + top * 8 + "\r\n"); } /** * x 是代表橫的位置 ;y是行數,從0開始 * 前4 表明開始的位置 xy,開始和結束的位置 * 56 表明放置的位置 * 7 表明是簡體中文 * 89 表明是xy的倍數:表明字型的大小 * 10 表明是是否旋轉 * 11 表明是需要列印的字型 * */ /** * 初始版 */ if (printer_direction) { /** * 以下為最終版 * 旋轉180度 */ //名稱 if (TextUtils.isEmpty(p.getName())){ iPrinter.drawTextTSPL(50 * 8, 40 * 8 + 10, 80 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 2, PrinterConstants.PRotate.Rotate_180, " "); }else { iPrinter.drawTextTSPL(50 * 8, 40 * 8 + 10, 80 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 2, PrinterConstants.PRotate.Rotate_180, p.getName()); } // 橫線上方區域右側的文字 if (TextUtils.isEmpty(p.getPrice())){ iPrinter.drawTextTSPL(33 * 8, 28 * 8, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 2, 2, PrinterConstants.PRotate.Rotate_180, " "); }else { iPrinter.drawTextTSPL(33 * 8, 28 * 8, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 2, 2, PrinterConstants.PRotate.Rotate_180, p.getPrice()); } // 橫線上方區域右側的文字 ,空格間隔 // // iPrinter.drawTextTSPL(25 * 8, 11 * 8, 40 * 8, 7 * 8, PAlign.CENTER, PAlign.START, true, 1, 2, PrinterConstants.PRotate.Rotate_180, p.getCashAndEPrice()); //會員價 TODO 已取消 // iPrinter.drawTextTSPL(33 * 8, 14 * 8 + 2, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 2, PrinterConstants.PRotate.Rotate_180, p.getCash()); // 最大資料個數限制為5位 例如:99.99 if (TextUtils.isEmpty(p.getEprice())){ iPrinter.drawTextTSPL(17 * 8, 14 * 8 + 2, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 2, PrinterConstants.PRotate.Rotate_180, " "); }else { iPrinter.drawTextTSPL(17 * 8, 14 * 8 + 2, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 2, PrinterConstants.PRotate.Rotate_180, p.getEprice()); } //計量單位 if (TextUtils.isEmpty(p.getUnit())){ iPrinter.drawTextTSPL(60 * 8, 20 * 8, 80 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, PrinterConstants.PRotate.Rotate_180, " "); }else { iPrinter.drawTextTSPL(60 * 8, 20 * 8, 80 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, PrinterConstants.PRotate.Rotate_180, p.getUnit()); } // 二維碼下方的一維條碼 13位 // 14,15,16,17,18 no 12 //sn if (TextUtils.isEmpty(p.getSn())){ iPrinter.drawTextTSPL(60 * 8, 14 * 8 + 2, 80 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, PrinterConstants.PRotate.Rotate_180, " "); }else { iPrinter.drawTextTSPL(60 * 8, 14 * 8 + 2, 80 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, PrinterConstants.PRotate.Rotate_180, p.getSn()); } //int start_x, int start_y, PBarcodeType type, int height, boolean isReadable, PRotate rotate, int narrowWidth, int wideWidth, String content // iPrinter.drawBarCodeTSPL(75 * 8, 10 * 8 + 4, PBarcodeType.JAN3_EAN13, 5 * 8, false, null, 1, 1, p.getSn()); iPrinter.drawBarCodeTSPL(75*8, 10 * 8 + 4, PBarcodeType.JAN3_EAN13, 5 * 8, false, PrinterConstants.PRotate.Rotate_180, 1, 1, p.getSn()); //以下三條資料是不列印的,只是列印空格 //規格 if (TextUtils.isEmpty(p.getSpecification())){ iPrinter.drawTextTSPL(60 * 8, 30 * 8 + 4, 70 * 8, 7 * 8, PAlign.CENTER, PAlign.START, true, 1, 1, PrinterConstants.PRotate.Rotate_180, " "); }else { iPrinter.drawTextTSPL(60 * 8, 30 * 8 + 4, 70 * 8, 7 * 8, PAlign.CENTER, PAlign.START, true, 1, 1, PrinterConstants.PRotate.Rotate_180, p.getSpecification()); } // 橫線上方區域左下方的文字 ((0,0)(40*8,7*8)) if (TextUtils.isEmpty(p.getProducer())){ iPrinter.drawTextTSPL(65 * 8, 25 * 8, 75 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, PrinterConstants.PRotate.Rotate_180, " "); }else { iPrinter.drawTextTSPL(65 * 8, 25 * 8, 75 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, PrinterConstants.PRotate.Rotate_180, p.getProducer()); } if (TextUtils.isEmpty(p.getRank())){ iPrinter.drawTextTSPL(48 * 8, 25 * 8, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, PrinterConstants.PRotate.Rotate_180, " "); }else { iPrinter.drawTextTSPL(48 * 8, 25 * 8, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, PrinterConstants.PRotate.Rotate_180, p.getRank()); } if (TextUtils.isEmpty(p.getSupervisor())){ iPrinter.drawTextTSPL(14 * 8, 5 * 8, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, PrinterConstants.PRotate.Rotate_180, " "); }else { iPrinter.drawTextTSPL(14 * 8, 5 * 8, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, PrinterConstants.PRotate.Rotate_180, p.getSupervisor()); } } else { if (TextUtils.isEmpty(p.getName())){ iPrinter.drawTextTSPL(30 * 8, 11 * 8, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 2, null, " "); }else { iPrinter.drawTextTSPL(30 * 8, 11 * 8, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 2, null, p.getName()); } // 橫線上方區域右側的文字 if (TextUtils.isEmpty(p.getPrice())){ iPrinter.drawTextTSPL(48 * 8, 23 * 8, 80 * 8, 7 * 8, PAlign.START, PAlign.START, true, 2, 2, null, " "); }else { iPrinter.drawTextTSPL(48 * 8, 23 * 8, 80 * 8, 7 * 8, PAlign.START, PAlign.START, true, 2, 2, null, p.getPrice()); } // 橫線上方區域右側的文字 價格和E幣,空格間隔 // iPrinter.drawTextTSPL(49 * 8, 38 * 8, 70 * 8, 7 * 8, PAlign.CENTER, PAlign.START, true, 1, 2, null, p.getCashAndEPrice()); // iPrinter.drawTextTSPL(47 * 8, 38 * 8, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 2, null, p.getCash()); if (TextUtils.isEmpty(p.getEprice())){ iPrinter.drawTextTSPL(63 * 8, 38 * 8, 80 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 2, null, " "); }else { iPrinter.drawTextTSPL(63 * 8, 38 * 8, 80 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 2, null, p.getEprice()); } if (TextUtils.isEmpty(p.getUnit())){ iPrinter.drawTextTSPL(18 * 8, 32 * 8, 40 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, null, " "); }else { iPrinter.drawTextTSPL(18 * 8, 32 * 8, 40 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, null, p.getUnit()); } // 二維碼下方的一維條碼 13位 // 14,15,16,17,18 no 12 if (TextUtils.isEmpty(p.getSn())){ iPrinter.drawTextTSPL(12 * 8, 37 * 8 + 2, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, null, " "); }else { iPrinter.drawTextTSPL(12 * 8, 37 * 8 + 2, 70 * 8, 7 * 8, PAlign.START, PAlign.START, true, 1, 1, null, p.getSn()); } //int start_x, int start_y, PBarcodeType type, int height, boolean isReadable, PRotate rotate, int narrowWidth, int wideWidth, String content iPrinter.drawBarCodeTSPL(40, 40 * 8 + 4, PBarcodeType.JAN3_EAN13, 5 * 8, false, null, 1, 1, p.getSn()); if (TextUtils.isEmpty(p.getSupervisor())){ iPrinter.drawTextTSPL(65 * 8, 47 * 8, 80 * 8, 7 * 8相關推薦
Android標籤印表機連線與列印位置調動方法總結
一、獲取連線的標籤列印裝置private static List<UsbDevice> deviceList;private static String deviceArrayLisr;private static UsbDevice mUSBDevice;pub
Android小票印表機連線 (已封裝好,可直接使用)
一、新建MyUsbPrinterUtil工具類,程式碼如下:import android.annotation.SuppressLint; import android.app.PendingIntent; import android.content.BroadcastRe
更改Android AVD模擬器創建路徑位置的方法
popu 目錄 設備 data- andro pos 環境 class 系統 Android AVD模擬器默認路徑為c:\user\username\.android\avd。欲將其移植到d盤下。方法為: 1、 建立目錄 在D盤下建立Android_sdk_ho
android防記憶體洩漏與記憶體優化的方法整理
記憶體洩漏 一、單利洩漏 存在記憶體洩露問題的一些程式碼片段像下面這樣: public class Util { private Context mContext;  
一種動態跟蹤TCP連線與程序相關性的方法
描述 TCP連線跟蹤是網路流控和防火牆中的一項重要的基礎技術,當運用於主機時,連線必與程序相關聯,要麼是主動發出的,要麼是被動接受的,當後代程序被動態建立時,由於檔案描述符的繼承,一個連線就會被這個程序樹中的所有程序共享;當一個程序發出或接受多個連線時,就擁有了多個連線。本方法可用於網路安
Android Studio中連線真機測試的方法
剛開始學Android Studio,如果用模擬器執行的話,電腦配置不高的話會比較卡,於是可以連線安卓手機進行真機測試。廢話不多說,來看看步驟吧 (1)開啟app下的Edit (2)選擇 USB Device (3)點選OK就行了! 然後就是手機上的配置了 (1)開啟
[Android多媒體技術] 播放Raw/Assets音視訊方法總結
前言 本文介紹如何通過系統MediaPlayer,IjkPlayer,ExoPlayer分別播放安卓專案下的Raw或Assets資料夾中的音視訊檔案。 在某些情況下,我們會把一些音視訊檔案,如Mp3,Mp4等,直接放在安裝包中的Raw或者Assets資料夾裡,這些音視訊檔案可能作為特定場景的提示音,或者視
python類與物件各個魔法方法總結
1、python類與物件各個魔法方法總結: 2、各個魔法方法應用舉例: 3、例項訓練: (1)我們都知道在 Python 中,兩個字串相加會自動拼接字串,但遺憾的是兩個字串相減卻丟擲異常。因此,現在我們要求定義一個 Nstr 類,支援字串的相減操作:A – B,從
TCP連線擁塞控制四種方法總結(詳細簡單,穩的一批)
擁塞控制的一般原理 在某段時間,若對網路中某一資源的需求超過了該資源所能提供的可用部分,網路的效能就要變換,叫做擁塞 擁塞控制和流量控制的區別: 擁塞控制往往是一種全域性的,防止過多的資料注入到網路之中,而TCP連線的端點只要不能收到對方的確認資訊,猜想在網路中發生了擁塞,但並不知道發生
關於Android平臺顯示隱藏軟鍵盤輸入法的方法總結
前言 在android開發中經常使用InputMethodManager來操作軟鍵盤的顯示隱藏,我們可以通過此類來控制顯示/隱藏軟鍵盤。 使用場景 在具有EditText的介面中,一般進入介面後,EditText控制元件會自動獲取焦點,並彈出輸入框,另
Android截圖截圖的幾種方法總結
Android截圖 Android截圖的原理:獲取具體需要截圖的區域的Bitmap,然後繪製在畫布上,儲存為圖片後進行分享或者其它用途 一、Activity截圖 1、截Activity介面(包含空白的狀態列) ? 1 2 3 4
Android開發根據Json直接生成Java Bean方法總結
在開發過程中拿到從伺服器請求的json字串需要解析成Bean物件方便我們使用,自己寫bean又太麻煩 經過這麼長時間的Android開發,我收集了三種比較常用的通過json自動生成Bean物件的方法:
Android中使用程式碼截圖的各種方法總結
1,基於Android SDK的截圖方法 (1)主要就是利用SDK提供的View.getDrawingCache()方法。網上已經有很多的例項了。首先建立一個android project,然後進行Layout,畫一個按鍵(res/layout/main.xml
android 網路是否可用與連線的網路是否能上網
網路狀態獲取 上傳與下載都需要先檢視當前手機的網路狀態,需要獲取ConnectionManager /** * 判斷當前是否有網路連線,但是如果該連線的網路無法上網,也會返回true * @param mContext * @return */ publi
北洋標籤印表機BTP-2100E使用USB轉並口線連線的安裝教程
首先要正確安裝USB轉並口裝置的驅動程式(在USB轉並口裝置的隨機光碟中),首次安裝成功後會出現USB001埠 在BYLabel軟體的同一目錄下(預設為C:\Program Files\BYLabel)有一driver 資料夾,開啟後點擊setup.exe進行安裝,選中USB00
android學習軌跡之二:Android許可權標籤uses-permission的書寫位置
場景 想獲取手機內所有聯絡人。並且AndroidManifest.xml中也添加了 <uses-permission android:name="android.permission.READ_CONTACTS" /> 許可權程式碼。 可是一樣出現 Permission denail. .
VC印表機程式設計之兩篇有用的文章獲取印表機與列印作業的狀態和設定印表機模式並預覽列印
VC印表機程式設計之兩篇有用的文章 vc設定印表機模式並預覽列印 呼叫列印屬性對話方塊: if(::OpenPrinter("Adobe PDF", &hPrint, NULL)) {::PrinterProperties(m_hWnd, hPrint);::
Android AMS(六) Activity與WMS的連線過程之AppWindowToken
概述 Activity元件在WindowManagerService服務和ActivityManagerService服務之間的連線是通過一個AppWindowToken物件來描述的 每一個Activity元件在啟動的時候,ActivityManagerService服務都會內部為該A
VC獲取印表機與列印作業的狀態
VC 獲取印表機與列印作業的狀態#pragma comment(lib, "winspool.lib")#include "stdafx.h"#include <winspool.h>#ifndef _MAX_PATH#define _MAX_PATH 260#
Android 通過註冊廣播,實時監聽網路連線與斷開狀態的變化
很多時候我們都需要實時監聽網路狀態,當網路狀態發生變化之後立即通知程式進行不同的操作。 監聽廣播的兩種方式: (1)在AndroidManifest.xml配置檔案中宣告 <receiver android:name=".NetworkConn