客户需求手机通过蓝牙连接打印机打印标签
效果图
打印方式选择界面
@Override
public void init() {
String connectSet=sharedPreferencesUtil.getString("0","connect-set");
if (connectSet.equals("0"))
{
rbBlue.setChecked(true);
etConncetType.setText("当前连接方式:蓝牙");
String info="名称:"+sharedPreferencesUtil.getString("",SharedPreferencesUtil.blueName);
info=info+" 地址:"+sharedPreferencesUtil.getString("",SharedPreferencesUtil.address);
etInfo.setText(info);
}
else
{
rbWifi.setChecked(true);
etConncetType.setText("当前连接方式:无线");
etInfo.setText("");
String info="ip:"+sharedPreferencesUtil.getString("",SharedPreferencesUtil.ip);
info=info+" 端口:"+sharedPreferencesUtil.getString("",SharedPreferencesUtil.port);
etInfo.setText(info);
}
if (threadPool==null)
{
threadPool = ThreadPool.getInstantiation();
}
threadPool.addSerialTask(new Runnable() {
@Override
public void run() {
if (DeviceConnFactoryManager.getDeviceConnFactoryManagers()[id] == null ||
!DeviceConnFactoryManager.getDeviceConnFactoryManagers()[id].getConnState()) {
// etState.setText("连接失败");
Message message = new Message();
message.what=1;
message.obj = "连接失败";
handler.sendMessage(message);
return;
}
if (DeviceConnFactoryManager.getDeviceConnFactoryManagers()[id].getCurrentPrinterCommand() == PrinterCommand.TSC) {
// etState.setText("连接状态:成功");
Message message = new Message();
message.what=1;
message.obj = "连接状态:成功";
handler.sendMessage(message);
} else {
Message message = new Message();
message.what=1;
message.obj = "连接状态:失败";
handler.sendMessage(message);
// etState.setText("连接状态:失败");
}
}
});
}
package com.qizi.app.ui;
import android.Manifest;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.TextView;
import com.qizi.app.R;
import com.qizi.app.ui.bt.Constant;
import com.qizi.app.ui.bt.DeviceConnFactoryManager;
import com.qizi.app.ui.bt.PrintContent;
import com.qizi.app.ui.bt.PrinterCommand;
import com.qizi.app.ui.bt.ThreadFactoryBuilder;
import com.qizi.app.ui.bt.ThreadPool;
import com.qizi.app.ui.bt.Utils;
import com.qizi.app.util.SharedPreferencesUtil;
import java.util.ArrayList;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import static android.hardware.usb.UsbManager.ACTION_USB_DEVICE_ATTACHED;
import static android.hardware.usb.UsbManager.ACTION_USB_DEVICE_DETACHED;
import static com.qizi.app.ui.bt.Constant.ACTION_USB_PERMISSION;
import static com.qizi.app.ui.bt.Constant.MESSAGE_UPDATE_PARAMETER;
import static com.qizi.app.ui.bt.DeviceConnFactoryManager.ACTION_QUERY_PRINTER_STATE;
import static com.qizi.app.ui.bt.DeviceConnFactoryManager.CONN_STATE_FAILED;
public class BlueConfigSearchActivity extends AppCompatActivity
implements
AdapterView.OnItemClickListener,
View.OnClickListener
{
//返回
private View backView;
private ListView lv_searchblt;
private SharedPreferencesUtil sharedPreferencesUtil;
private Button btnPrint,btnSearch;
TextView tv_bluename;
int PERMISSION_REQUEST_COARSE_LOCATION=2;
private static final String TAG = BlueConfigSearchActivity.class.getSimpleName();
ArrayList<String> per = new ArrayList<>();
private UsbManager usbManager;
private int counts;
private static final int REQUEST_CODE = 0x004;
/**
* 连接状态断开
*/
private static final int CONN_STATE_DISCONN = 0x007;
/**
* 使用打印机指令错误
*/
private static final int PRINTER_COMMAND_ERROR = 0x008;
/**
* ESC查询打印机实时状态指令
*/
private byte[] esc = {0x10, 0x04, 0x02};
/**
* CPCL查询打印机实时状态指令
*/
private byte[] cpcl={0x1b,0x68};
/**
* TSC查询打印机状态指令
*/
private byte[] tsc = {0x1b, '!', '?'};
private static final int CONN_MOST_DEVICES = 0x11;
private static final int CONN_PRINTER = 0x12;
private PendingIntent mPermissionIntent;
private String[] permissions = {
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.BLUETOOTH
};
private String usbName;
private TextView tvConnState;
private ThreadPool threadPool;
/**
* 判断打印机所使用指令是否是ESC指令
*/
private int id = 0;
private EditText etPrintCounts;
private Spinner mode_sp;
private int printcount=0;
private boolean continuityprint=false;
// private CheckWifiConnThread checkWifiConnThread;//wifi连接线程监听
@Override
public void onCreate(Bundle savedInstanceState ) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_blueconfig_search);
lv_searchblt = (ListView) findViewById(R.id.lv_searchblt);
tvConnState = (TextView) findViewById(R.id.tv_title);
// tv_summary = (TextView) findViewById(R.id.tv_summary);
checkPermission();
requestPermission();
tv_bluename =findViewById(R.id.tv_bluename);
btnPrint=findViewById(R.id.btn_print);
btnSearch=findViewById(R.id.btn_search);
backView=findViewById(R.id.back);
lv_searchblt.setOnItemClickListener(this);
//tv_title.setOnClickListener(this);
// tv_summary.setOnClickListener(this);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, PERMISSION_REQUEST_COARSE_LOCATION);
}
btnSearch.setOnClickListener(this);
backView.setOnClickListener(this);
btnPrint.setOnClickListener(this);
String connStr=getConnDeviceInfo();
if (!connStr.isEmpty())
{
tv_bluename.setText("当前蓝牙信息" + "\n" + connStr);
}
sharedPreferencesUtil = SharedPreferencesUtil.getInstantiation(getApplicationContext());
initBroadcast();
}
private void checkPermission() {
for (String permission : permissions) {
if (PackageManager.PERMISSION_GRANTED != ContextCompat.checkSelfPermission(this, permission)) {
per.add(permission);
}
}
}
private void requestPermission() {
if (per.size() > 0) {
String[] p = new String[per.size()];
ActivityCompat.requestPermissions(this, per.toArray(p), REQUEST_CODE);
}
}
/**
*注册广播
* Registration broadcast
*/
private void initBroadcast() {
IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);//USB访问权限广播
filter.addAction(ACTION_USB_DEVICE_DETACHED);//USB线拔出
filter.addAction(ACTION_QUERY_PRINTER_STATE);//查询打印机缓冲区状态广播,用于一票一控
filter.addAction(DeviceConnFactoryManager.ACTION_CONN_STATE);//与打印机连接状态
filter.addAction(ACTION_USB_DEVICE_ATTACHED);//USB线插入
registerReceiver(receiver, filter);
}
private BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
switch (action) {
//USB请求访问权限
case ACTION_USB_PERMISSION:
synchronized (this) {
UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
if (device != null) {//用户点击授权
//usbConn(device);
}
} else {//用户点击不授权,则无权限访问USB
Log.e(TAG,"No access to USB");
}
}
break;
//Usb连接断开广播
case ACTION_USB_DEVICE_DETACHED:
UsbDevice usbDevice = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
if (usbDevice.equals( DeviceConnFactoryManager.getDeviceConnFactoryManagers()[id].usbDevice())){
mHandler.obtainMessage(CONN_STATE_DISCONN).sendToTarget();
}
break;
//连接状态
case DeviceConnFactoryManager.ACTION_CONN_STATE:
int state = intent.getIntExtra(DeviceConnFactoryManager.STATE, -1);
int deviceId = intent.getIntExtra(DeviceConnFactoryManager.DEVICE_ID, -1);
switch (state) {
case DeviceConnFactoryManager.CONN_STATE_DISCONNECT:
if (id == deviceId) {
Log.e(TAG,"connection is lost");
tvConnState.setText(getString(R.string.str_conn_state_disconnect));
}
break;
case DeviceConnFactoryManager.CONN_STATE_CONNECTING:
tvConnState.setText(getString(R.string.str_conn_state_connecting));
break;
case DeviceConnFactoryManager.CONN_STATE_CONNECTED:
tvConnState.setText(getString(R.string.str_conn_state_connected) + "\n" + getConnDeviceInfo());
break;
case CONN_STATE_FAILED:
Utils.toast(BlueConfigSearchActivity.this, getString(R.string.str_conn_fail));
//wificonn=false;
tvConnState.setText(getString(R.string.str_conn_state_disconnect));
break;
default:
break;
}
break;
//连续打印,一票一控,防止打印机乱码
case ACTION_QUERY_PRINTER_STATE:
if (counts >=0) {
if(continuityprint) {
printcount++;
Utils.toast(BlueConfigSearchActivity.this, getString(R.string.str_continuityprinter) + " " + printcount);
}
if(counts!=0) {
sendContinuityPrint();
}else {
continuityprint=false;
}
}
break;
default:
break;
}
}
};
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case CONN_STATE_DISCONN://断开连接
DeviceConnFactoryManager deviceConnFactoryManager=DeviceConnFactoryManager.getDeviceConnFactoryManagers()[id];
if (deviceConnFactoryManager!= null&&deviceConnFactoryManager.getConnState()) {
DeviceConnFactoryManager.getDeviceConnFactoryManagers()[id].closePort(id);
Utils.toast(BlueConfigSearchActivity.this,getString(R.string.str_disconnect_success));
}
break;
case PRINTER_COMMAND_ERROR://打印机指令错误
Utils.toast(BlueConfigSearchActivity.this, getString(R.string.str_choice_printer_command));
break;
case CONN_PRINTER://未连接打印机
Utils.toast(BlueConfigSearchActivity.this, getString(R.string.str_cann_printer));
break;
case MESSAGE_UPDATE_PARAMETER:
String strIp = msg.getData().getString("Ip");
String strPort = msg.getData().getString("Port");
//初始化端口信息
new DeviceConnFactoryManager.Build()
//设置端口连接方式
.setConnMethod(DeviceConnFactoryManager.CONN_METHOD.WIFI)
//设置端口IP地址
.setIp(strIp)
//设置端口ID(主要用于连接多设备)
.setId(id)
//设置连接的热点端口号
.setPort(Integer.parseInt(strPort))
.build();
threadPool = ThreadPool.getInstantiation();
threadPool.addSerialTask(new Runnable() {
@Override
public void run() {
DeviceConnFactoryManager.getDeviceConnFactoryManagers()[id].openPort();
}
});
break;
case Constant.tip:
String str=(String) msg.obj;
Utils.toast(BlueConfigSearchActivity.this,str);
break;
default:
new DeviceConnFactoryManager.Build()
//设置端口连接方式
.setConnMethod(DeviceConnFactoryManager.CONN_METHOD.WIFI)
//设置端口IP地址
.setIp("192.168.2.227")
//设置端口ID(主要用于连接多设备)
.setId(id)
//设置连接的热点端口号
.setPort(9100)
.build();
threadPool.addSerialTask(new Runnable() {
@Override
public void run() {
DeviceConnFactoryManager.getDeviceConnFactoryManagers()[id].openPort();
}
});
break;
}
}
};
/**
* 获取当前连接设备信息
* @return
*/
private String getConnDeviceInfo() {
String str = "";
DeviceConnFactoryManager deviceConnFactoryManager = DeviceConnFactoryManager.getDeviceConnFactoryManagers()[id];
if (deviceConnFactoryManager != null
&& deviceConnFactoryManager.getConnState()) {
if ("USB".equals(deviceConnFactoryManager.getConnMethod().toString())) {
str += "USB\n";
str += "USB Name: " + deviceConnFactoryManager.usbDevice().getDeviceName();
} else if ("WIFI".equals(deviceConnFactoryManager.getConnMethod().toString())) {
str += "WIFI\n";
str += "IP: " + deviceConnFactoryManager.getIp() + "\t";
str += "Port: " + deviceConnFactoryManager.getPort();
} else if ("BLUETOOTH".equals(deviceConnFactoryManager.getConnMethod().toString())) {
str += "蓝牙:已连接\n";
str += "地址: " + deviceConnFactoryManager.getMacAddress();
} else if ("SERIAL_PORT".equals(deviceConnFactoryManager.getConnMethod().toString())) {
str += "SERIAL_PORT\n";
str += "Path: " + deviceConnFactoryManager.getSerialPortPath() + "\t";
str += "Baudrate: " + deviceConnFactoryManager.getBaudrate();
}
}
return str;
}
private void sendContinuityPrint() {
ThreadPool.getInstantiation().addSerialTask(new Runnable() {
@Override
public void run() {
if (DeviceConnFactoryManager.getDeviceConnFactoryManagers()[id] != null
&& DeviceConnFactoryManager.getDeviceConnFactoryManagers()[id].getConnState()) {
ThreadFactoryBuilder threadFactoryBuilder = new ThreadFactoryBuilder("MainActivity_sendContinuity_Timer");
ScheduledExecutorService scheduledExecutorService = new ScheduledThreadPoolExecutor(1, threadFactoryBuilder);
scheduledExecutorService.schedule(threadFactoryBuilder.newThread(new Runnable() {
@Override
public void run() {
counts--;
if (DeviceConnFactoryManager.getDeviceConnFactoryManagers()[id].getCurrentPrinterCommand() == PrinterCommand.ESC) {
DeviceConnFactoryManager.getDeviceConnFactoryManagers()[id].sendDataImmediately(PrintContent.getReceipt());
} else if(DeviceConnFactoryManager.getDeviceConnFactoryManagers()[id].getCurrentPrinterCommand() == PrinterCommand.TSC) {
DeviceConnFactoryManager.getDeviceConnFactoryManagers()[id].sendDataImmediately(PrintContent.getLabel());
}else {
DeviceConnFactoryManager.getDeviceConnFactoryManagers()[id].sendDataImmediately(PrintContent.getCPCL());
}
}
}), 1000, TimeUnit.MILLISECONDS);
}
}
});
}
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
switch (requestCode) {
/*蓝牙连接*/
case Constant.BLUETOOTH_REQUEST_CODE: {
closeport();
/*获取蓝牙mac地址*/
String macAddress = data.getStringExtra(BluetoothDeviceList.EXTRA_DEVICE_ADDRESS);
//初始化话DeviceConnFactoryManager
new DeviceConnFactoryManager.Build()
.setId(id)
//设置连接方式
.setConnMethod(DeviceConnFactoryManager.CONN_METHOD.BLUETOOTH)
//设置连接的蓝牙mac地址
.setMacAddress(macAddress)
.build();
tv_bluename.setText("当前蓝牙:"+macAddress);
//打开端口
threadPool = ThreadPool.getInstantiation();
threadPool.addSerialTask(new Runnable() {
@Override
public void run() {
DeviceConnFactoryManager.getDeviceConnFactoryManagers()[id].openPort();
}
});
break;
}
/*USB连接*/
case Constant.USB_REQUEST_CODE: {
closeport();
break;
}
/*串口连接*/
case Constant.SERIALPORT_REQUEST_CODE:
closeport();
//获取波特率
int baudrate = data.getIntExtra(Constant.SERIALPORTBAUDRATE, 0);
//获取串口号
String path = data.getStringExtra(Constant.SERIALPORTPATH);
if (baudrate != 0 && !TextUtils.isEmpty(path)) {
//初始化DeviceConnFactoryManager
new DeviceConnFactoryManager.Build()
//设置连接方式
.setConnMethod(DeviceConnFactoryManager.CONN_METHOD.SERIAL_PORT)
.setId(id)
//设置波特率
.setBaudrate(baudrate)
//设置串口号
.setSerialPort(path)
.build();
//打开端口
//打开端口
threadPool = ThreadPool.getInstantiation();
threadPool.addSerialTask(new Runnable() {
@Override
public void run() {
DeviceConnFactoryManager.getDeviceConnFactoryManagers()[id].openPort();
}
});
}
break;
/*多设备*/
case CONN_MOST_DEVICES:
initBroadcast();//注册广播监听
id = data.getIntExtra("id", -1);
if (DeviceConnFactoryManager.getDeviceConnFactoryManagers()[id] != null &&
DeviceConnFactoryManager.getDeviceConnFactoryManagers()[id].getConnState()) {
tvConnState.setText(getString(R.string.str_conn_state_connected) + "\n" + getConnDeviceInfo());
} else {
tvConnState.setText(getString(R.string.str_conn_state_disconnect));
}
break;
default:
break;
}
}
}
/**
* 重新连接回收上次连接的对象,避免内存泄漏
*/
private void closeport(){
if(DeviceConnFactoryManager.getDeviceConnFactoryManagers()[id]!=null&&DeviceConnFactoryManager.getDeviceConnFactoryManagers()[id].mPort!=null) {
//DeviceConnFactoryManager.getDeviceConnFactoryManagers()[id].reader.cancel();
DeviceConnFactoryManager.getDeviceConnFactoryManagers()[id].mPort.closePort();
DeviceConnFactoryManager.getDeviceConnFactoryManagers()[id].mPort=null;
}
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.back:
finish();
break;
case R.id.btn_print:
printTest();
break;
case R.id.btn_search:
startActivityForResult(new Intent(this, BluetoothDeviceList.class), Constant.BLUETOOTH_REQUEST_CODE);
break;
}
}
private void printTest()
{
threadPool = ThreadPool.getInstantiation();
threadPool.addSerialTask(new Runnable() {
@Override
public void run() {
if (DeviceConnFactoryManager.getDeviceConnFactoryManagers()[id] == null ||
!DeviceConnFactoryManager.getDeviceConnFactoryManagers()[id].getConnState()) {
mHandler.obtainMessage(CONN_PRINTER).sendToTarget();
return;
}
if (DeviceConnFactoryManager.getDeviceConnFactoryManagers()[id].getCurrentPrinterCommand() == PrinterCommand.TSC) {
DeviceConnFactoryManager.getDeviceConnFactoryManagers()[id].sendDataImmediately(PrintContent.getSuitTestLabel());
} else {
mHandler.obtainMessage(PRINTER_COMMAND_ERROR).sendToTarget();
}
}
});
}
}