您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
安卓如果調用usb設備?
发布时间:2022-03-26 14:51:03编辑:雪饮阅读()
最近有一個需求:
在一個安卓設備上面有内置一個打印設備,該安卓設備是加油站那邊好像自己定制的一個安卓7.1系統。
那個提供了一個android sdk(就是一個jar包)。
然後我們前端是基於uniapp開發的,那麽前端這邊直接使用這個jar包並調用usb設備去打印貌似就很困難了。
我的想法是用原生安卓調用這個sdk實現打印功能,然後咱們那個uniapp開發的apk就負責通過intent意圖參數來調用這個打印專用的安卓應用程序。這樣對於uniapp那邊就方便多了。
那麽這裏主要是原生實現調用usb設備去打印的功能。
那麽首先我是在app/build.gradle中加載了這個Android sdk上面提供的jar包:
plugins {
id 'com.android.application'
}
android {
compileSdk 32
defaultConfig {
applicationId "com.example.getusbdeviceforjava71"
minSdk 25
targetSdk 32
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
implementation 'androidx.appcompat:appcompat:1.3.0'
implementation 'com.google.android.material:material:1.4.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
implementation files('D:\\androidProject\\getUsbDeviceForJava7.1\\printersdkv5.6.jar')
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}
然後接下來是主程序邏輯:
MainActivity.java:
package com.example.getusbdeviceforjava71;
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.content.Context;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import com.printer.sdk.PrinterConstants;
import com.printer.sdk.PrinterInstance;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
public class MainActivity extends AppCompatActivity {
PrinterInstance myPrinter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
/*获取usb设备*/
HashMap<String, UsbDevice> deviceList = manager.getDeviceList();
Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();
List<UsbDevice> usbDevices = new ArrayList<>();
while (deviceIterator.hasNext()) {
UsbDevice device = deviceIterator.next();
usbDevices.add(device);
String ProductName=device.getProductName();
if("SPRT Printer".equals(ProductName)){
Log.i("usb设备", "可能是打印设备SPRT Printer");
//获取打印机实体类
myPrinter = PrinterInstance.getPrinterInstance(MainActivity.this, device, new Handler() {
@Override
public void handleMessage(Message msg) {
//msg.what
//Log.i("msg.what", Message.ty);
switch (msg.what) {
case PrinterConstants.Connect.SUCCESS:
Log.i("msg.what", "连接成功!");
// myPrinter.sendBytesData();
myPrinter.initPrinter();
//myPrinter.setPrinter();
if (myPrinter != null&&myPrinter.getCurrentStatus() == 0){
myPrinter.setPrinter(PrinterConstants.Command.ALIGN, PrinterConstants.Command.ALIGN_CENTER);
String content="";
for(int i=0;i<10;i++){
content+="printTest杜佳鹏!\r\n";
}
myPrinter.printText(content);
Log.i("打印指令", "打印指令已发出");
int printingStatus=myPrinter.getPrintingStatus(5000);
Log.i("打印机状态",String.valueOf(printingStatus));
}
else{
Log.i("打印机异常","打印机状态异常:通信异常,缺纸,开盖,纸将尽");
}
break;
case PrinterConstants.Connect.FAILED:
Log.i("msg.what", "连接失败!");
break;
case PrinterConstants.Connect.CLOSED:
Log.i("msg.what", "连接关闭!");
break;
case PrinterConstants.Connect.NODEVICE:
Log.i("msg.what", "NODEVICE!");
break;
default:
Log.i("msg.what", "其它未知情况");
break;
}
}
});
myPrinter.openConnection();
}
Log.i("获取的usb设备列表", "getDeviceList: " +ProductName);
}
//获取usb设备end
}
}
這裏紅色重點標記的地方就是獲取usb設備的核心代碼,不過該代碼是運行在安卓7.1的,并且這個安卓設備不是主流安卓設備,應該是加油站那邊自定義的,所以也僅限參考價值。
最後就是打印的效果了:
关键字词:usb,安卓,調用