Hi all,
I have to connect my app to a mobile zebra printer. Print via bluetooth
works fine.
The bt-connection will be established directly with the mac address of the
bluetooth printer:
minSdkVersion 16
targetSdkVersion 24
public class BluetoothConnection{
private BluetoothAdapter btAdapter = null;
private BluetoothSocket btSocket = null;
private OutputStream outStream = null;
private Context context = null;
// SPP UUID service
private static final UUID MY_UUID = UUID.fromString(
"00001101-0000-1000-8000-00805F9B34FB");
public BluetoothConnection(String pAddress, Context pContext){
this.address= pAddress;
btAdapter = BluetoothAdapter.getDefaultAdapter();
this.context = pContext;
checkBTState();
}
private BluetoothSocket createBluetoothSocket(BluetoothDevice device)
throws IOException {
if(Build.VERSION.SDK_INT >= 10){
try {
final Method m = device.getClass().getMethod(
"createInsecureRfcommSocketToServiceRecord", new Class[] { UUID.class });
return (BluetoothSocket) m.invoke(device, MY_UUID);
} catch (Exception e) {
}
}
return device.createRfcommSocketToServiceRecord(MY_UUID);
}
public boolean connect() {
boolean retVal = true;
if (btAdapter == null){
return false;
}
// Set up a pointer to the remote node using it's address.
BluetoothDevice device = btAdapter.getRemoteDevice(address);
try {
btSocket = createBluetoothSocket(device);
retVal = true;
} catch (IOException e1) {
retVal = false;
}
// Discovery is resource intensive. Make sure it isn't going on
// when you attempt to connect and pass your message.
btAdapter.cancelDiscovery();
// Establish the connection. This will block until it connects.
try {
btSocket.connect();
} catch (IOException e) {
try {
btSocket.close();
retVal = true;
} catch (IOException e2) {
retVal = false;
}
}
try {
outStream = btSocket.getOutputStream();
retVal = true;
} catch (IOException e) {
retVal = false;
}
return true;
}
.....................
The printing works fine now. I keep the bluetooth connection alive when the
app runs, because establishing the connection costs 4 - 6 seconds. This
works fine.
My problem is, I cannot detect if the printer is powered off.
I want to check before each print job if the bluetooth connection to the
printer still exists & works. btSocket.isConnected() always returns true
(even if the printer is powered off). I can send data to the outstream with
write() without getting an IOException.
I tried to use a BroadcastReceiver too. Unfortunatly
ACTION_ACL_DISCONNECTED is raised when the printer is powered on, not when
it is powered off. ACTION_ACL_DISCONNECT_REQUESTED is never raised.
registerReceiver(mReceiver, new IntentFilter(BluetoothDevice.
ACTION_ACL_DISCONNECTED));
registerReceiver(mReceiver, new IntentFilter(BluetoothDevice.
ACTION_ACL_DISCONNECT_REQUESTED));
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
BluetoothDevice device = intent.getParcelableExtra(
BluetoothDevice.EXTRA_DEVICE);
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
Logger.d("Device found");
}
else if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) {
Logger.d("Device is now connected");
}
else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(
action)) {
Logger.d("Done searching");
}
else if (BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED.equals(
action)) {
Logger.d("Device is about to disconnect");
}
else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action))
{
Logger.d("Device has disconnected");
}
}
};
What can I do to detect if the bluetooth connection exists and works?
--
You received this message because you are subscribed to the Google Groups
"Android Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/android-developers.
To view this discussion on the web visit
https://groups.google.com/d/msgid/android-developers/7000b843-2574-4cbf-ae74-2bf9aa15796e%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.