Loading core/java/android/bluetooth/BluetoothAdapter.java +33 −0 Original line number Diff line number Diff line Loading @@ -26,8 +26,10 @@ import android.os.ParcelUuid; import android.os.RemoteException; import android.os.ServiceManager; import android.util.Log; import android.util.Pair; import java.io.IOException; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.LinkedList; Loading Loading @@ -863,6 +865,37 @@ public final class BluetoothAdapter { return socket; } /** * Read the local Out of Band Pairing Data * <p>Requires {@link android.Manifest.permission#BLUETOOTH} * * @return Pair<byte[], byte[]> of Hash and Randomizer * * @hide */ public Pair<byte[], byte[]> readOutOfBandData() { if (getState() != STATE_ON) return null; try { byte[] hash = new byte[16]; byte[] randomizer = new byte[16]; byte[] ret = mService.readOutOfBandData(); if (ret == null || ret.length != 32) return null; hash = Arrays.copyOfRange(ret, 0, 16); randomizer = Arrays.copyOfRange(ret, 16, 32); if (DBG) { Log.d(TAG, "readOutOfBandData:" + Arrays.toString(hash) + ":" + Arrays.toString(randomizer)); } return new Pair<byte[], byte[]>(hash, randomizer); } catch (RemoteException e) {Log.e(TAG, "", e);} return null; } private Set<BluetoothDevice> toDeviceSet(String[] addresses) { Set<BluetoothDevice> devices = new HashSet<BluetoothDevice>(addresses.length); for (int i = 0; i < addresses.length; i++) { Loading core/java/android/bluetooth/BluetoothDevice.java +57 −1 Original line number Diff line number Diff line Loading @@ -325,7 +325,9 @@ public final class BluetoothDevice implements Parcelable { /** The user will be prompted to enter the passkey displayed on remote device * @hide */ public static final int PAIRING_VARIANT_DISPLAY_PASSKEY = 4; /** The user will be prompted to accept or deny the OOB pairing request * @hide */ public static final int PAIRING_VARIANT_OOB_CONSENT = 5; /** * Used as an extra field in {@link #ACTION_UUID} intents, * Contains the {@link android.os.ParcelUuid}s of the remote device which Loading Loading @@ -463,6 +465,52 @@ public final class BluetoothDevice implements Parcelable { return false; } /** * Start the bonding (pairing) process with the remote device using the * Out Of Band mechanism. * * <p>This is an asynchronous call, it will return immediately. Register * for {@link #ACTION_BOND_STATE_CHANGED} intents to be notified when * the bonding process completes, and its result. * * <p>Android system services will handle the necessary user interactions * to confirm and complete the bonding process. * * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN}. * * @param hash - Simple Secure pairing hash * @param randomizer - The random key obtained using OOB * @return false on immediate error, true if bonding will begin * * @hide */ public boolean createBondOutOfBand(byte[] hash, byte[] randomizer) { try { return sService.createBondOutOfBand(mAddress, hash, randomizer); } catch (RemoteException e) {Log.e(TAG, "", e);} return false; } /** * Set the Out Of Band data for a remote device to be used later * in the pairing mechanism. Users can obtain this data through other * trusted channels * * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN}. * * @param hash Simple Secure pairing hash * @param randomizer The random key obtained using OOB * @return false on error; true otherwise * * @hide */ public boolean setDeviceOutOfBandData(byte[] hash, byte[] randomizer) { try { return sService.setDeviceOutOfBandData(mAddress, hash, randomizer); } catch (RemoteException e) {Log.e(TAG, "", e);} return false; } /** * Cancel an in-progress bonding request started with {@link #createBond}. * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN}. Loading Loading @@ -616,6 +664,14 @@ public final class BluetoothDevice implements Parcelable { return false; } /** @hide */ public boolean setRemoteOutOfBandData() { try { return sService.setRemoteOutOfBandData(mAddress); } catch (RemoteException e) {Log.e(TAG, "", e);} return false; } /** @hide */ public boolean cancelPairingUserInput() { try { Loading core/java/android/bluetooth/IBluetooth.aidl +4 −0 Original line number Diff line number Diff line Loading @@ -44,12 +44,15 @@ interface IBluetooth boolean startDiscovery(); boolean cancelDiscovery(); boolean isDiscovering(); byte[] readOutOfBandData(); boolean createBond(in String address); boolean createBondOutOfBand(in String address, in byte[] hash, in byte[] randomizer); boolean cancelBondProcess(in String address); boolean removeBond(in String address); String[] listBonds(); int getBondState(in String address); boolean setDeviceOutOfBandData(in String address, in byte[] hash, in byte[] randomizer); String getRemoteName(in String address); int getRemoteClass(in String address); Loading @@ -60,6 +63,7 @@ interface IBluetooth boolean setPin(in String address, in byte[] pin); boolean setPasskey(in String address, int passkey); boolean setPairingConfirmation(in String address, boolean confirm); boolean setRemoteOutOfBandData(in String addres); boolean cancelPairingUserInput(in String address); boolean setTrust(in String address, in boolean value); Loading core/java/android/server/BluetoothEventLoop.java +26 −1 Original line number Diff line number Diff line Loading @@ -551,6 +551,17 @@ class BluetoothEventLoop { mContext.sendBroadcast(intent, BLUETOOTH_ADMIN_PERM); } private void onRequestOobData(String objectPath , int nativeData) { String address = checkPairingRequestAndGetAddress(objectPath, nativeData); if (address == null) return; Intent intent = new Intent(BluetoothDevice.ACTION_PAIRING_REQUEST); intent.putExtra(BluetoothDevice.EXTRA_DEVICE, mAdapter.getRemoteDevice(address)); intent.putExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT, BluetoothDevice.PAIRING_VARIANT_OOB_CONSENT); mContext.sendBroadcast(intent, BLUETOOTH_ADMIN_PERM); } private boolean onAgentAuthorize(String objectPath, String deviceUuid) { String address = mBluetoothService.getAddressFromObjectPath(objectPath); if (address == null) { Loading Loading @@ -583,7 +594,21 @@ class BluetoothEventLoop { return authorized; } boolean isOtherSinkInNonDisconnectingState(String address) { private boolean onAgentOutOfBandDataAvailable(String objectPath) { if (!mBluetoothService.isEnabled()) return false; String address = mBluetoothService.getAddressFromObjectPath(objectPath); if (address == null) return false; if (mBluetoothService.getDeviceOutOfBandData( mAdapter.getRemoteDevice(address)) != null) { return true; } return false; } private boolean isOtherSinkInNonDisconnectingState(String address) { BluetoothA2dp a2dp = new BluetoothA2dp(mContext); Set<BluetoothDevice> devices = a2dp.getNonDisconnectedSinks(); if (devices.size() == 0) return false; Loading core/java/android/server/BluetoothService.java +88 −2 Original line number Diff line number Diff line Loading @@ -50,6 +50,7 @@ import android.os.ServiceManager; import android.os.SystemService; import android.provider.Settings; import android.util.Log; import android.util.Pair; import com.android.internal.app.IBatteryStats; Loading Loading @@ -129,6 +130,8 @@ public class BluetoothService extends IBluetooth.Stub { private final BluetoothProfileState mHfpProfileState; private BluetoothA2dpService mA2dpService; private final HashMap<String, Pair<byte[], byte[]>> mDeviceOobData; private static String mDockAddress; private String mDockPin; Loading Loading @@ -183,6 +186,7 @@ public class BluetoothService extends IBluetooth.Stub { mDeviceProperties = new HashMap<String, Map<String,String>>(); mDeviceServiceChannelCache = new HashMap<String, Map<ParcelUuid, Integer>>(); mDeviceOobData = new HashMap<String, Pair<byte[], byte[]>>(); mUuidIntentTracker = new ArrayList<String>(); mUuidCallbackTracker = new HashMap<RemoteService, IBluetoothCallback>(); mServiceRecordToPid = new HashMap<Integer, Integer>(); Loading Loading @@ -1119,7 +1123,7 @@ public class BluetoothService extends IBluetooth.Stub { mIsDiscovering = isDiscovering; } public synchronized boolean createBond(String address) { private boolean isBondingFeasible(String address) { mContext.enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM, "Need BLUETOOTH_ADMIN permission"); if (!isEnabledInternal()) return false; Loading Loading @@ -1149,6 +1153,11 @@ public class BluetoothService extends IBluetooth.Stub { return false; } } return true; } public synchronized boolean createBond(String address) { if (!isBondingFeasible(address)) return false; if (!createPairedDeviceNative(address, 60000 /*1 minute*/ )) { return false; Loading @@ -1160,6 +1169,51 @@ public class BluetoothService extends IBluetooth.Stub { return true; } public synchronized boolean createBondOutOfBand(String address, byte[] hash, byte[] randomizer) { if (!isBondingFeasible(address)) return false; if (!createPairedDeviceOutOfBandNative(address, 60000 /* 1 minute */)) { return false; } setDeviceOutOfBandData(address, hash, randomizer); mBondState.setPendingOutgoingBonding(address); mBondState.setBondState(address, BluetoothDevice.BOND_BONDING); return true; } public synchronized boolean setDeviceOutOfBandData(String address, byte[] hash, byte[] randomizer) { mContext.enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM, "Need BLUETOOTH_ADMIN permission"); if (!isEnabledInternal()) return false; Pair <byte[], byte[]> value = new Pair<byte[], byte[]>(hash, randomizer); if (DBG) { log("Setting out of band data for:" + address + ":" + Arrays.toString(hash) + ":" + Arrays.toString(randomizer)); } mDeviceOobData.put(address, value); return true; } Pair<byte[], byte[]> getDeviceOutOfBandData(BluetoothDevice device) { return mDeviceOobData.get(device.getAddress()); } public synchronized byte[] readOutOfBandData() { mContext.enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission"); if (!isEnabledInternal()) return null; return readAdapterOutOfBandDataNative(); } public synchronized boolean cancelBondProcess(String address) { mContext.enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM, "Need BLUETOOTH_ADMIN permission"); Loading Loading @@ -1551,6 +1605,32 @@ public class BluetoothService extends IBluetooth.Stub { return setPairingConfirmationNative(address, confirm, data.intValue()); } public synchronized boolean setRemoteOutOfBandData(String address) { mContext.enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM, "Need BLUETOOTH_ADMIN permission"); if (!isEnabledInternal()) return false; address = address.toUpperCase(); Integer data = mEventLoop.getPasskeyAgentRequestData().remove(address); if (data == null) { Log.w(TAG, "setRemoteOobData(" + address + ") called but no native data available, " + "ignoring. Maybe the PasskeyAgent Request was cancelled by the remote device" + " or by bluez.\n"); return false; } Pair<byte[], byte[]> val = mDeviceOobData.get(address); byte[] hash, randomizer; if (val == null) { // TODO: check what should be passed in this case. hash = new byte[16]; randomizer = new byte[16]; } else { hash = val.first; randomizer = val.second; } return setRemoteOutOfBandDataNative(address, hash, randomizer, data.intValue()); } public synchronized boolean cancelPairingUserInput(String address) { mContext.enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM, "Need BLUETOOTH_ADMIN permission"); Loading Loading @@ -2084,6 +2164,9 @@ public class BluetoothService extends IBluetooth.Stub { private native boolean stopDiscoveryNative(); private native boolean createPairedDeviceNative(String address, int timeout_ms); private native boolean createPairedDeviceOutOfBandNative(String address, int timeout_ms); private native byte[] readAdapterOutOfBandDataNative(); private native boolean cancelDeviceCreationNative(String address); private native boolean removeDeviceNative(String objectPath); private native int getDeviceServiceChannelNative(String objectPath, String uuid, Loading @@ -2094,6 +2177,9 @@ public class BluetoothService extends IBluetooth.Stub { private native boolean setPasskeyNative(String address, int passkey, int nativeData); private native boolean setPairingConfirmationNative(String address, boolean confirm, int nativeData); private native boolean setRemoteOutOfBandDataNative(String address, byte[] hash, byte[] randomizer, int nativeData); private native boolean setDevicePropertyBooleanNative(String objectPath, String key, int value); private native boolean createDeviceNative(String address); Loading Loading
core/java/android/bluetooth/BluetoothAdapter.java +33 −0 Original line number Diff line number Diff line Loading @@ -26,8 +26,10 @@ import android.os.ParcelUuid; import android.os.RemoteException; import android.os.ServiceManager; import android.util.Log; import android.util.Pair; import java.io.IOException; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.LinkedList; Loading Loading @@ -863,6 +865,37 @@ public final class BluetoothAdapter { return socket; } /** * Read the local Out of Band Pairing Data * <p>Requires {@link android.Manifest.permission#BLUETOOTH} * * @return Pair<byte[], byte[]> of Hash and Randomizer * * @hide */ public Pair<byte[], byte[]> readOutOfBandData() { if (getState() != STATE_ON) return null; try { byte[] hash = new byte[16]; byte[] randomizer = new byte[16]; byte[] ret = mService.readOutOfBandData(); if (ret == null || ret.length != 32) return null; hash = Arrays.copyOfRange(ret, 0, 16); randomizer = Arrays.copyOfRange(ret, 16, 32); if (DBG) { Log.d(TAG, "readOutOfBandData:" + Arrays.toString(hash) + ":" + Arrays.toString(randomizer)); } return new Pair<byte[], byte[]>(hash, randomizer); } catch (RemoteException e) {Log.e(TAG, "", e);} return null; } private Set<BluetoothDevice> toDeviceSet(String[] addresses) { Set<BluetoothDevice> devices = new HashSet<BluetoothDevice>(addresses.length); for (int i = 0; i < addresses.length; i++) { Loading
core/java/android/bluetooth/BluetoothDevice.java +57 −1 Original line number Diff line number Diff line Loading @@ -325,7 +325,9 @@ public final class BluetoothDevice implements Parcelable { /** The user will be prompted to enter the passkey displayed on remote device * @hide */ public static final int PAIRING_VARIANT_DISPLAY_PASSKEY = 4; /** The user will be prompted to accept or deny the OOB pairing request * @hide */ public static final int PAIRING_VARIANT_OOB_CONSENT = 5; /** * Used as an extra field in {@link #ACTION_UUID} intents, * Contains the {@link android.os.ParcelUuid}s of the remote device which Loading Loading @@ -463,6 +465,52 @@ public final class BluetoothDevice implements Parcelable { return false; } /** * Start the bonding (pairing) process with the remote device using the * Out Of Band mechanism. * * <p>This is an asynchronous call, it will return immediately. Register * for {@link #ACTION_BOND_STATE_CHANGED} intents to be notified when * the bonding process completes, and its result. * * <p>Android system services will handle the necessary user interactions * to confirm and complete the bonding process. * * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN}. * * @param hash - Simple Secure pairing hash * @param randomizer - The random key obtained using OOB * @return false on immediate error, true if bonding will begin * * @hide */ public boolean createBondOutOfBand(byte[] hash, byte[] randomizer) { try { return sService.createBondOutOfBand(mAddress, hash, randomizer); } catch (RemoteException e) {Log.e(TAG, "", e);} return false; } /** * Set the Out Of Band data for a remote device to be used later * in the pairing mechanism. Users can obtain this data through other * trusted channels * * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN}. * * @param hash Simple Secure pairing hash * @param randomizer The random key obtained using OOB * @return false on error; true otherwise * * @hide */ public boolean setDeviceOutOfBandData(byte[] hash, byte[] randomizer) { try { return sService.setDeviceOutOfBandData(mAddress, hash, randomizer); } catch (RemoteException e) {Log.e(TAG, "", e);} return false; } /** * Cancel an in-progress bonding request started with {@link #createBond}. * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN}. Loading Loading @@ -616,6 +664,14 @@ public final class BluetoothDevice implements Parcelable { return false; } /** @hide */ public boolean setRemoteOutOfBandData() { try { return sService.setRemoteOutOfBandData(mAddress); } catch (RemoteException e) {Log.e(TAG, "", e);} return false; } /** @hide */ public boolean cancelPairingUserInput() { try { Loading
core/java/android/bluetooth/IBluetooth.aidl +4 −0 Original line number Diff line number Diff line Loading @@ -44,12 +44,15 @@ interface IBluetooth boolean startDiscovery(); boolean cancelDiscovery(); boolean isDiscovering(); byte[] readOutOfBandData(); boolean createBond(in String address); boolean createBondOutOfBand(in String address, in byte[] hash, in byte[] randomizer); boolean cancelBondProcess(in String address); boolean removeBond(in String address); String[] listBonds(); int getBondState(in String address); boolean setDeviceOutOfBandData(in String address, in byte[] hash, in byte[] randomizer); String getRemoteName(in String address); int getRemoteClass(in String address); Loading @@ -60,6 +63,7 @@ interface IBluetooth boolean setPin(in String address, in byte[] pin); boolean setPasskey(in String address, int passkey); boolean setPairingConfirmation(in String address, boolean confirm); boolean setRemoteOutOfBandData(in String addres); boolean cancelPairingUserInput(in String address); boolean setTrust(in String address, in boolean value); Loading
core/java/android/server/BluetoothEventLoop.java +26 −1 Original line number Diff line number Diff line Loading @@ -551,6 +551,17 @@ class BluetoothEventLoop { mContext.sendBroadcast(intent, BLUETOOTH_ADMIN_PERM); } private void onRequestOobData(String objectPath , int nativeData) { String address = checkPairingRequestAndGetAddress(objectPath, nativeData); if (address == null) return; Intent intent = new Intent(BluetoothDevice.ACTION_PAIRING_REQUEST); intent.putExtra(BluetoothDevice.EXTRA_DEVICE, mAdapter.getRemoteDevice(address)); intent.putExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT, BluetoothDevice.PAIRING_VARIANT_OOB_CONSENT); mContext.sendBroadcast(intent, BLUETOOTH_ADMIN_PERM); } private boolean onAgentAuthorize(String objectPath, String deviceUuid) { String address = mBluetoothService.getAddressFromObjectPath(objectPath); if (address == null) { Loading Loading @@ -583,7 +594,21 @@ class BluetoothEventLoop { return authorized; } boolean isOtherSinkInNonDisconnectingState(String address) { private boolean onAgentOutOfBandDataAvailable(String objectPath) { if (!mBluetoothService.isEnabled()) return false; String address = mBluetoothService.getAddressFromObjectPath(objectPath); if (address == null) return false; if (mBluetoothService.getDeviceOutOfBandData( mAdapter.getRemoteDevice(address)) != null) { return true; } return false; } private boolean isOtherSinkInNonDisconnectingState(String address) { BluetoothA2dp a2dp = new BluetoothA2dp(mContext); Set<BluetoothDevice> devices = a2dp.getNonDisconnectedSinks(); if (devices.size() == 0) return false; Loading
core/java/android/server/BluetoothService.java +88 −2 Original line number Diff line number Diff line Loading @@ -50,6 +50,7 @@ import android.os.ServiceManager; import android.os.SystemService; import android.provider.Settings; import android.util.Log; import android.util.Pair; import com.android.internal.app.IBatteryStats; Loading Loading @@ -129,6 +130,8 @@ public class BluetoothService extends IBluetooth.Stub { private final BluetoothProfileState mHfpProfileState; private BluetoothA2dpService mA2dpService; private final HashMap<String, Pair<byte[], byte[]>> mDeviceOobData; private static String mDockAddress; private String mDockPin; Loading Loading @@ -183,6 +186,7 @@ public class BluetoothService extends IBluetooth.Stub { mDeviceProperties = new HashMap<String, Map<String,String>>(); mDeviceServiceChannelCache = new HashMap<String, Map<ParcelUuid, Integer>>(); mDeviceOobData = new HashMap<String, Pair<byte[], byte[]>>(); mUuidIntentTracker = new ArrayList<String>(); mUuidCallbackTracker = new HashMap<RemoteService, IBluetoothCallback>(); mServiceRecordToPid = new HashMap<Integer, Integer>(); Loading Loading @@ -1119,7 +1123,7 @@ public class BluetoothService extends IBluetooth.Stub { mIsDiscovering = isDiscovering; } public synchronized boolean createBond(String address) { private boolean isBondingFeasible(String address) { mContext.enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM, "Need BLUETOOTH_ADMIN permission"); if (!isEnabledInternal()) return false; Loading Loading @@ -1149,6 +1153,11 @@ public class BluetoothService extends IBluetooth.Stub { return false; } } return true; } public synchronized boolean createBond(String address) { if (!isBondingFeasible(address)) return false; if (!createPairedDeviceNative(address, 60000 /*1 minute*/ )) { return false; Loading @@ -1160,6 +1169,51 @@ public class BluetoothService extends IBluetooth.Stub { return true; } public synchronized boolean createBondOutOfBand(String address, byte[] hash, byte[] randomizer) { if (!isBondingFeasible(address)) return false; if (!createPairedDeviceOutOfBandNative(address, 60000 /* 1 minute */)) { return false; } setDeviceOutOfBandData(address, hash, randomizer); mBondState.setPendingOutgoingBonding(address); mBondState.setBondState(address, BluetoothDevice.BOND_BONDING); return true; } public synchronized boolean setDeviceOutOfBandData(String address, byte[] hash, byte[] randomizer) { mContext.enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM, "Need BLUETOOTH_ADMIN permission"); if (!isEnabledInternal()) return false; Pair <byte[], byte[]> value = new Pair<byte[], byte[]>(hash, randomizer); if (DBG) { log("Setting out of band data for:" + address + ":" + Arrays.toString(hash) + ":" + Arrays.toString(randomizer)); } mDeviceOobData.put(address, value); return true; } Pair<byte[], byte[]> getDeviceOutOfBandData(BluetoothDevice device) { return mDeviceOobData.get(device.getAddress()); } public synchronized byte[] readOutOfBandData() { mContext.enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission"); if (!isEnabledInternal()) return null; return readAdapterOutOfBandDataNative(); } public synchronized boolean cancelBondProcess(String address) { mContext.enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM, "Need BLUETOOTH_ADMIN permission"); Loading Loading @@ -1551,6 +1605,32 @@ public class BluetoothService extends IBluetooth.Stub { return setPairingConfirmationNative(address, confirm, data.intValue()); } public synchronized boolean setRemoteOutOfBandData(String address) { mContext.enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM, "Need BLUETOOTH_ADMIN permission"); if (!isEnabledInternal()) return false; address = address.toUpperCase(); Integer data = mEventLoop.getPasskeyAgentRequestData().remove(address); if (data == null) { Log.w(TAG, "setRemoteOobData(" + address + ") called but no native data available, " + "ignoring. Maybe the PasskeyAgent Request was cancelled by the remote device" + " or by bluez.\n"); return false; } Pair<byte[], byte[]> val = mDeviceOobData.get(address); byte[] hash, randomizer; if (val == null) { // TODO: check what should be passed in this case. hash = new byte[16]; randomizer = new byte[16]; } else { hash = val.first; randomizer = val.second; } return setRemoteOutOfBandDataNative(address, hash, randomizer, data.intValue()); } public synchronized boolean cancelPairingUserInput(String address) { mContext.enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM, "Need BLUETOOTH_ADMIN permission"); Loading Loading @@ -2084,6 +2164,9 @@ public class BluetoothService extends IBluetooth.Stub { private native boolean stopDiscoveryNative(); private native boolean createPairedDeviceNative(String address, int timeout_ms); private native boolean createPairedDeviceOutOfBandNative(String address, int timeout_ms); private native byte[] readAdapterOutOfBandDataNative(); private native boolean cancelDeviceCreationNative(String address); private native boolean removeDeviceNative(String objectPath); private native int getDeviceServiceChannelNative(String objectPath, String uuid, Loading @@ -2094,6 +2177,9 @@ public class BluetoothService extends IBluetooth.Stub { private native boolean setPasskeyNative(String address, int passkey, int nativeData); private native boolean setPairingConfirmationNative(String address, boolean confirm, int nativeData); private native boolean setRemoteOutOfBandDataNative(String address, byte[] hash, byte[] randomizer, int nativeData); private native boolean setDevicePropertyBooleanNative(String objectPath, String key, int value); private native boolean createDeviceNative(String address); Loading