Android 仅从蓝牙打印一次
Android Print from bluetooth only once
我们有一个本机 android 应用程序,您可以通过蓝牙从中打印发票和运单。我使用默认的蓝牙适配器。当我从应用程序中点击打印按钮时,蓝牙打印机可以毫无问题地打印我发送的内容,但是当我再次打印时,打印文本已损坏。在文档打印机的一半,只需停止并倒回纸张并打印我发送的文本的左侧。那时我关闭打印机并再次打开。然后我从应用程序按打印。同样,打印机在第一次打印时工作正常。但是当我打印第二份副本时,打印机再次出现故障。我不明白发生了什么事。如果我使用的代码或适配器有问题,我无法打印任何文本消息,但只有第二份有问题。
这是我的代码:
public BluetoothDevice FindPrinter() {
BluetoothDevice currentDevice = null;
try {
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (mBluetoothAdapter == null) {
throw new Exception("Bluetooth adaptorü bulunamadı");
}
if (!mBluetoothAdapter.isEnabled()) {
Intent enableBluetooth = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
Activity a = new Activity();
a.startActivityForResult(enableBluetooth, 0);
}
Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();
if (pairedDevices.size() > 0) {
for (BluetoothDevice device : pairedDevices) {
if(device.getName().equals(SharedPreferenceSettings.getPrinterPort(context))) {
currentDevice = device;
}
}
}
} catch (Exception e) {
Toast.makeText(context, e.getMessage(), Toast.LENGTH_SHORT).show();
}
return currentDevice;
}
public void Print()
{
try {
int current = 0;
FormatData();
int line = 0;
Method m = mmDevice.getClass().getMethod("createRfcommSocket", new Class[] {int.class});
mmSocket = (BluetoothSocket) m.invoke(mmDevice, 1);
mmSocket.connect();
while (current < Data.length) {
mmOutputStream = mmSocket.getOutputStream();
int len = 256;
if (current + 256 > Data.length) {
len = Data.length - current;
}
byte[] temp = new byte[len];
System.arraycopy(Data, current, temp, 0, len);
int currentLine = CountLines(temp);
line = line + currentLine;
mmOutputStream.write(temp);
current += len;
Thread.sleep(1700);
}
mmOutputStream.close();
if(mmSocket.isConnected())
mmSocket.close();
} catch (Exception e) {
Log.e("Print ERROR", e.getMessage());
}
}
编辑:
我注意到了一些事情。如果我 运行 我的应用程序带有调试和断点,它可以完美运行,但如果我 运行 它正常,有时打印机会跳过前 256 个字节然后打印。仍然不明白为什么打印机有时会跳过前 256 个字节。
我找到了解决问题的办法。这是一种解决方法,但它仍然有效。我添加一个 Thread.sleep(100);在 mmOutputStream = mmSocket.getOutputStream() 之后;线。之后它工作正常。我不知道为什么,但现在可以用了。
我们有一个本机 android 应用程序,您可以通过蓝牙从中打印发票和运单。我使用默认的蓝牙适配器。当我从应用程序中点击打印按钮时,蓝牙打印机可以毫无问题地打印我发送的内容,但是当我再次打印时,打印文本已损坏。在文档打印机的一半,只需停止并倒回纸张并打印我发送的文本的左侧。那时我关闭打印机并再次打开。然后我从应用程序按打印。同样,打印机在第一次打印时工作正常。但是当我打印第二份副本时,打印机再次出现故障。我不明白发生了什么事。如果我使用的代码或适配器有问题,我无法打印任何文本消息,但只有第二份有问题。
这是我的代码:
public BluetoothDevice FindPrinter() {
BluetoothDevice currentDevice = null;
try {
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (mBluetoothAdapter == null) {
throw new Exception("Bluetooth adaptorü bulunamadı");
}
if (!mBluetoothAdapter.isEnabled()) {
Intent enableBluetooth = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
Activity a = new Activity();
a.startActivityForResult(enableBluetooth, 0);
}
Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();
if (pairedDevices.size() > 0) {
for (BluetoothDevice device : pairedDevices) {
if(device.getName().equals(SharedPreferenceSettings.getPrinterPort(context))) {
currentDevice = device;
}
}
}
} catch (Exception e) {
Toast.makeText(context, e.getMessage(), Toast.LENGTH_SHORT).show();
}
return currentDevice;
}
public void Print()
{
try {
int current = 0;
FormatData();
int line = 0;
Method m = mmDevice.getClass().getMethod("createRfcommSocket", new Class[] {int.class});
mmSocket = (BluetoothSocket) m.invoke(mmDevice, 1);
mmSocket.connect();
while (current < Data.length) {
mmOutputStream = mmSocket.getOutputStream();
int len = 256;
if (current + 256 > Data.length) {
len = Data.length - current;
}
byte[] temp = new byte[len];
System.arraycopy(Data, current, temp, 0, len);
int currentLine = CountLines(temp);
line = line + currentLine;
mmOutputStream.write(temp);
current += len;
Thread.sleep(1700);
}
mmOutputStream.close();
if(mmSocket.isConnected())
mmSocket.close();
} catch (Exception e) {
Log.e("Print ERROR", e.getMessage());
}
}
编辑:
我注意到了一些事情。如果我 运行 我的应用程序带有调试和断点,它可以完美运行,但如果我 运行 它正常,有时打印机会跳过前 256 个字节然后打印。仍然不明白为什么打印机有时会跳过前 256 个字节。
我找到了解决问题的办法。这是一种解决方法,但它仍然有效。我添加一个 Thread.sleep(100);在 mmOutputStream = mmSocket.getOutputStream() 之后;线。之后它工作正常。我不知道为什么,但现在可以用了。