Я использовал следующий код для отправки данных на принтер Bluetooth:
try {
BluetoothAdapter oBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
BluetoothDevice oDispositivo = oBluetoothAdapter.getRemoteDevice(cMAC);
Method oMethod = oDispositivo.getClass().getMethod("createRfcommSocket",new Class[] { int.class });
oSocket = (BluetoothSocket) oMethod.invoke(oDispositivo, Integer.valueOf(1));
oSocket.connect();
btoutputstream = new BufferedWriter(new OutputStreamWriter(oSocket.getOutputStream(),"ISO_8859_1"));
// Enviamos el mensaje
int off = 0;
while(off < nLength){
btoutputstream.write(msg,off,nBloque);
btoutputstream.flush();
Thread.sleep(nSleep);
off += nBloque;
if((off + nBloque) > nLength) nBloque = nLength - off;
}
btoutputstream.flush();
}catch(Exception e){
return cFail + " || Exception: " + e.toString();
}
finally{
try{
if(btoutputstream != null) btoutputstream.close();
if(oSocket != null) oSocket.close();
}catch(Exception e2){
return e2.toString();
}
}
Проблема в том, что этот код не работает на том же принтере с новым устройством Bluetooth. Он печатает первый блок кода и больше не печатает.
Так что я искал способ заставить его работать, и я в итоге использовал это:
public static String BluetoothPrint()
{
try{
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
mmDevice = mBluetoothAdapter.getRemoteDevice(cMac);
UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb");
mmSocket = mmDevice.createRfcommSocketToServiceRecord(uuid);
mmSocket.connect();
mmOutputStream = mmSocket.getOutputStream();
mmInputStream = mmSocket.getInputStream();
beginListenForData();
mmOutputStream.write(cText.getBytes());
} catch(Exception e) {
return "error: " + e.toString();
} finally {
// try{
// stopWorker = true;
// mmOutputStream.close();
// mmInputStream.close();
// mmSocket.close();
// } catch(Exception e) {
// return "error: " + e.toString()
// }
}
return "ok";
}
public static void beginListenForData(){
try {
final Handler handler = new Handler();
// This is the ASCII code for a newline character
final byte delimiter = 10;
stopWorker = false;
readBufferPosition = 0;
readBuffer = new byte[1024];
workerThread = new Thread(new Runnable() {
public void run() {
while (!Thread.currentThread().isInterrupted()
&& !stopWorker) {
try {
int bytesAvailable = mmInputStream.available();
if (bytesAvailable > 0) {
byte[] packetBytes = new byte[bytesAvailable];
mmInputStream.read(packetBytes);
for (int i = 0; i < bytesAvailable; i++) {
byte b = packetBytes[i];
if (b == delimiter) {
byte[] encodedBytes = new byte[readBufferPosition];
System.arraycopy(readBuffer, 0,
encodedBytes, 0,
encodedBytes.length);
final String data = new String(
encodedBytes, "US-ASCII");
readBufferPosition = 0;
handler.post(new Runnable() {
public void run() {
//myLabel.setText(data);
}
});
} else {
readBuffer[readBufferPosition++] = b;
}
}
}
} catch (Exception ex) {
stopWorker = true;
}
}
}
});
workerThread.start();
} catch (NullPointerException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
Этот код работает правильно, но моя главная проблема заключается в том, что печать идет очень медленно (до 1:30 мин, а до печати - 15-20 секунд). Я понял, что это идет медленно из-за пустых строк. Принтер работает медленно, печатая их, но проблем со строками, в которых есть текст, нет.
Поэтому я ищу способ ускорить этот код, но я застрял. Я пытался увеличить буфер чтения, но, похоже, ничего не сделал.