summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/java/android/bluetooth/BluetoothAdapter.java36
-rw-r--r--core/java/android/bluetooth/BluetoothDevice.java27
-rw-r--r--core/java/android/bluetooth/BluetoothSocket.java4
3 files changed, 66 insertions, 1 deletions
diff --git a/core/java/android/bluetooth/BluetoothAdapter.java b/core/java/android/bluetooth/BluetoothAdapter.java
index e062fa8..676fd1f 100644
--- a/core/java/android/bluetooth/BluetoothAdapter.java
+++ b/core/java/android/bluetooth/BluetoothAdapter.java
@@ -924,6 +924,42 @@ public final class BluetoothAdapter {
}
/**
+ * Create a listening, L2CAP Bluetooth socket.
+ * <p>A remote device connecting to this socket will optionally be
+ * authenticated and communication on this socket will optionally be
+ * encrypted.
+ * <p>Use {@link BluetoothServerSocket#accept} to retrieve incoming
+ * connections from a listening {@link BluetoothServerSocket}.
+ * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN}
+ * @param secure whether security and authentication are required
+ * @param fixedChannel whether we're looking for a PSM-based connection or a fixed channel
+ * @param channel L2CAP PSM or channel to use
+ * @return a listening L2CAP BluetoothServerSocket
+ * @throws IOException on error, for example Bluetooth not available, or
+ * insufficient permissions, or channel in use.
+ * @hide
+ */
+ public BluetoothServerSocket listenUsingL2CapOn(boolean secure, boolean fixedChannel,
+ int channel) throws IOException {
+ BluetoothServerSocket socket;
+
+ if (fixedChannel) {
+ channel |= BluetoothSocket.PORT_MASK_FIXED_CHAN;
+ }
+
+ socket = new BluetoothServerSocket(
+ BluetoothSocket.TYPE_L2CAP, secure, secure, channel);
+ int errno = socket.mSocket.bindListen();
+ if (errno != 0) {
+ //TODO(BT): Throw the same exception error code
+ // that the previous code was using.
+ //socket.mSocket.throwErrnoNative(errno);
+ throw new IOException("Error: " + errno);
+ }
+ return socket;
+ }
+
+ /**
* Create a listening, secure RFCOMM Bluetooth socket.
* <p>A remote device connecting to this socket will be authenticated and
* communication on this socket will be encrypted.
diff --git a/core/java/android/bluetooth/BluetoothDevice.java b/core/java/android/bluetooth/BluetoothDevice.java
index 3acd9b0..2c85382 100644
--- a/core/java/android/bluetooth/BluetoothDevice.java
+++ b/core/java/android/bluetooth/BluetoothDevice.java
@@ -1144,6 +1144,33 @@ public final class BluetoothDevice implements Parcelable {
return new BluetoothSocket(BluetoothSocket.TYPE_SCO, -1, true, true, this, -1, null);
}
+
+ /**
+ * Construct a L2CAP socket ready to start an outgoing connection.
+ * Call #connect on the returned #BluetoothSocket to begin the connection.
+ * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN}
+ *
+ * @param secure select whether security will be required
+ * @param fixedChannel select if this will be a "fixed channel" L2CAP connection
+ * or a PSM-based connection
+ * @param channel fixed channel or PSM to connect to
+ * @return a L2CAP BluetoothSocket
+ * @throws IOException on error, for example Bluetooth not available, or
+ * insufficient permissions.
+ * @hide
+ */
+ public BluetoothSocket createL2CapSocket(boolean secure, boolean fixedChannel, int channel)
+ throws IOException {
+
+ if (fixedChannel) {
+ channel |= BluetoothSocket.PORT_MASK_FIXED_CHAN;
+ }
+
+ return new BluetoothSocket(BluetoothSocket.TYPE_L2CAP, -1, secure, secure, this,
+ channel, null);
+ }
+
+
/**
* Check that a pin is valid and convert to byte array.
*
diff --git a/core/java/android/bluetooth/BluetoothSocket.java b/core/java/android/bluetooth/BluetoothSocket.java
index d10eaea..191bf67 100644
--- a/core/java/android/bluetooth/BluetoothSocket.java
+++ b/core/java/android/bluetooth/BluetoothSocket.java
@@ -103,6 +103,8 @@ public final class BluetoothSocket implements Closeable {
/*package*/ static final int SEC_FLAG_ENCRYPT = 1;
/*package*/ static final int SEC_FLAG_AUTH = 1 << 1;
+ /*package*/ static final int PORT_MASK_FIXED_CHAN = 1 << 16;
+
private final int mType; /* one of TYPE_RFCOMM etc */
private BluetoothDevice mDevice; /* remote device */
private String mAddress; /* remote address */
@@ -115,7 +117,7 @@ public final class BluetoothSocket implements Closeable {
private LocalSocket mSocket;
private InputStream mSocketIS;
private OutputStream mSocketOS;
- private int mPort; /* RFCOMM channel or L2CAP psm */
+ private int mPort; /* RFCOMM channel or L2CAP psm/channel */
private int mFd;
private String mServiceName;
private static int PROXY_CONNECTION_TIMEOUT = 5000;