BluetoothAdapter

public final class BluetoothAdapter
extends Object

java.lang.Object
   ↳ android.bluetooth.BluetoothAdapter


Represents the local device Bluetooth adapter. The BluetoothAdapter lets you perform fundamental Bluetooth tasks, such as initiate device discovery, query a list of bonded (paired) devices, instantiate a BluetoothDevice using a known MAC address, and create a BluetoothServerSocket to listen for connection requests from other devices, and start a scan for Bluetooth LE devices.

To get a BluetoothAdapter representing the local Bluetooth adapter, call the BluetoothManager.getAdapter() function on BluetoothManager. On JELLY_BEAN_MR1 and below you will need to use the static getDefaultAdapter() method instead.

Fundamentally, this is your starting point for all Bluetooth actions. Once you have the local adapter, you can get a set of BluetoothDevice objects representing all paired devices with getBondedDevices(); start device discovery with startDiscovery(); or create a BluetoothServerSocket to listen for incoming RFComm connection requests with listenUsingRfcommWithServiceRecord(java.lang.String, java.util.UUID); listen for incoming L2CAP Connection-oriented Channels (CoC) connection requests with listenUsingL2capChannel(); or start a scan for Bluetooth LE devices with startLeScan(android.bluetooth.BluetoothAdapter.LeScanCallback).

This class is thread safe.

Developer Guides

For more information about using Bluetooth, read the Bluetooth developer guide.

Summary

Nested classes

interface BluetoothAdapter.LeScanCallback

Callback interface used to deliver LE scan results. 

Constants

String ACTION_CONNECTION_STATE_CHANGED

Intent used to broadcast the change in connection state of the local Bluetooth adapter to a profile of the remote device.

String ACTION_DISCOVERY_FINISHED

Broadcast Action: The local Bluetooth adapter has finished the device discovery process.

String ACTION_DISCOVERY_STARTED

Broadcast Action: The local Bluetooth adapter has started the remote device discovery process.

String ACTION_LOCAL_NAME_CHANGED

Broadcast Action: The local Bluetooth adapter has changed its friendly Bluetooth name.

String ACTION_REQUEST_DISCOVERABLE

Activity Action: Show a system activity that requests discoverable mode.

String ACTION_REQUEST_ENABLE

Activity Action: Show a system activity that allows the user to turn on Bluetooth.

String ACTION_SCAN_MODE_CHANGED

Broadcast Action: Indicates the Bluetooth scan mode of the local Adapter has changed.

String ACTION_STATE_CHANGED

Broadcast Action: The state of the local Bluetooth adapter has been changed.

int ERROR

Sentinel error value for this class.

String EXTRA_CONNECTION_STATE

Extra used by ACTION_CONNECTION_STATE_CHANGED

This extra represents the current connection state.

String EXTRA_DISCOVERABLE_DURATION

Used as an optional int extra field in ACTION_REQUEST_DISCOVERABLE intents to request a specific duration for discoverability in seconds.

String EXTRA_LOCAL_NAME

Used as a String extra field in ACTION_LOCAL_NAME_CHANGED intents to request the local Bluetooth name.

String EXTRA_PREVIOUS_CONNECTION_STATE

Extra used by ACTION_CONNECTION_STATE_CHANGED

This extra represents the previous connection state.

String EXTRA_PREVIOUS_SCAN_MODE

Used as an int extra field in ACTION_SCAN_MODE_CHANGED intents to request the previous scan mode.

String EXTRA_PREVIOUS_STATE

Used as an int extra field in ACTION_STATE_CHANGED intents to request the previous power state.

String EXTRA_SCAN_MODE

Used as an int extra field in ACTION_SCAN_MODE_CHANGED intents to request the current scan mode.

String EXTRA_STATE

Used as an int extra field in ACTION_STATE_CHANGED intents to request the current power state.

int SCAN_MODE_CONNECTABLE

Indicates that inquiry scan is disabled, but page scan is enabled on the local Bluetooth adapter.

int SCAN_MODE_CONNECTABLE_DISCOVERABLE

Indicates that both inquiry scan and page scan are enabled on the local Bluetooth adapter.

int SCAN_MODE_NONE

Indicates that both inquiry scan and page scan are disabled on the local Bluetooth adapter.

int STATE_CONNECTED

The profile is in connected state

int STATE_CONNECTING

The profile is in connecting state

int STATE_DISCONNECTED

The profile is in disconnected state

int STATE_DISCONNECTING

The profile is in disconnecting state

int STATE_OFF

Indicates the local Bluetooth adapter is off.

int STATE_ON

Indicates the local Bluetooth adapter is on, and ready for use.

int STATE_TURNING_OFF

Indicates the local Bluetooth adapter is turning off.

int STATE_TURNING_ON

Indicates the local Bluetooth adapter is turning on.

Public methods

boolean cancelDiscovery()

Cancel the current device discovery process.

static boolean checkBluetoothAddress(String address)

Validate a String Bluetooth address, such as "00:43:A8:23:10:F0"

Alphabetic characters must be uppercase to be valid.

void closeProfileProxy(int unusedProfile, BluetoothProfile proxy)

Close the connection of the profile proxy to the Service.

boolean disable()

This method was deprecated in API level 33. Starting with Build.VERSION_CODES.TIRAMISU, applications are not allowed to enable/disable Bluetooth. Compatibility Note: For applications targeting Build.VERSION_CODES.TIRAMISU or above, this API will always fail and return false. If apps are targeting an older SDK (Build.VERSION_CODES.S or below), they can continue to use this API.

Deprecation Exemptions:

  • Device Owner (DO), Profile Owner (PO) and system apps.

boolean enable()

This method was deprecated in API level 33. Starting with Build.VERSION_CODES.TIRAMISU, applications are not allowed to enable/disable Bluetooth. Compatibility Note: For applications targeting Build.VERSION_CODES.TIRAMISU or above, this API will always fail and return false. If apps are targeting an older SDK (Build.VERSION_CODES.S or below), they can continue to use this API.

Deprecation Exemptions:

  • Device Owner (DO), Profile Owner (PO) and system apps.

String getAddress()

Returns the hardware address of the local Bluetooth adapter.

BluetoothLeAdvertiser getBluetoothLeAdvertiser()

Returns a BluetoothLeAdvertiser object for Bluetooth LE Advertising operations.

BluetoothLeScanner getBluetoothLeScanner()

Returns a BluetoothLeScanner object for Bluetooth LE scan operations.

Set<BluetoothDevice> getBondedDevices()

Return the set of BluetoothDevice objects that are bonded (paired) to the local adapter.

static BluetoothAdapter getDefaultAdapter()

This method was deprecated in API level 31. this method will continue to work, but developers are strongly encouraged to migrate to using BluetoothManager#getAdapter(), since that approach enables support for Context#createAttributionContext.

Duration getDiscoverableTimeout()

Get the timeout duration of the SCAN_MODE_CONNECTABLE_DISCOVERABLE.

int getLeMaximumAdvertisingDataLength()

Return the maximum LE advertising data length in bytes, if LE Extended Advertising feature is supported, 0 otherwise.

int getMaxConnectedAudioDevices()

Get the maximum number of connected devices per audio profile for this device.

String getName()

Get the friendly Bluetooth name of the local Bluetooth adapter.

int getProfileConnectionState(int profile)

Get the current connection state of a profile.

boolean getProfileProxy(Context context, BluetoothProfile.ServiceListener listener, int profile)

Get the profile proxy object associated with the profile.

BluetoothDevice getRemoteDevice(byte[] address)

Get a BluetoothDevice object for the given Bluetooth hardware address.

BluetoothDevice getRemoteDevice(String address)

Get a BluetoothDevice object for the given Bluetooth hardware address.

BluetoothDevice getRemoteLeDevice(String address, int addressType)

Get a BluetoothDevice object for the given Bluetooth hardware address and addressType.

int getScanMode()

Get the current Bluetooth scan mode of the local Bluetooth adapter.

int getState()

Get the current state of the local Bluetooth adapter.

boolean isDiscovering()

Return true if the local Bluetooth adapter is currently in the device discovery process.

boolean isEnabled()

Return true if Bluetooth is currently enabled and ready for use.

boolean isLe2MPhySupported()

Return true if LE 2M PHY feature is supported.

int isLeAudioBroadcastAssistantSupported()

Returns BluetoothStatusCodes#FEATURE_SUPPORTED if the LE audio broadcast assistant feature is supported, BluetoothStatusCodes#FEATURE_NOT_SUPPORTED if the feature is not supported, or an error code.

int isLeAudioBroadcastSourceSupported()

Returns BluetoothStatusCodes#FEATURE_SUPPORTED if the LE audio broadcast source feature is supported, BluetoothStatusCodes#FEATURE_NOT_SUPPORTED if the feature is not supported, or an error code.

int isLeAudioSupported()

Returns BluetoothStatusCodes#FEATURE_SUPPORTED if the LE audio feature is supported, BluetoothStatusCodes#FEATURE_NOT_SUPPORTED if the feature is not supported, or an error code.

boolean isLeCodedPhySupported()

Return true if LE Coded PHY feature is supported.

boolean isLeExtendedAdvertisingSupported()

Return true if LE Extended Advertising feature is supported.

boolean isLePeriodicAdvertisingSupported()

Return true if LE Periodic Advertising feature is supported.

boolean isMultipleAdvertisementSupported()

Return true if the multi advertisement is supported by the chipset
For apps targeting Build.VERSION_CODES#R or lower, this requires the Manifest.permission#BLUETOOTH permission which can be gained with a simple <uses-permission> manifest tag.

boolean isOffloadedFilteringSupported()

Return true if offloaded filters are supported
For apps targeting Build.VERSION_CODES#R or lower, this requires the Manifest.permission#BLUETOOTH permission which can be gained with a simple <uses-permission> manifest tag.

boolean isOffloadedScanBatchingSupported()

Return true if offloaded scan batching is supported
For apps targeting Build.VERSION_CODES#R or lower, this requires the Manifest.permission#BLUETOOTH permission which can be gained with a simple <uses-permission> manifest tag.

BluetoothServerSocket listenUsingInsecureL2capChannel()

Create an insecure L2CAP Connection-oriented Channel (CoC) BluetoothServerSocket and assign a dynamic PSM value.

BluetoothServerSocket listenUsingInsecureRfcommWithServiceRecord(String name, UUID uuid)

Create a listening, insecure RFCOMM Bluetooth socket with Service Record.

BluetoothServerSocket listenUsingL2capChannel()

Create a secure L2CAP Connection-oriented Channel (CoC) BluetoothServerSocket and assign a dynamic protocol/service multiplexer (PSM) value.

BluetoothServerSocket listenUsingRfcommWithServiceRecord(String name, UUID uuid)

Create a listening, secure RFCOMM Bluetooth socket with Service Record.

boolean setName(String name)

Set the friendly Bluetooth name of the local Bluetooth adapter.

boolean startDiscovery()

Start the remote device discovery process.

boolean startLeScan(UUID[] serviceUuids, BluetoothAdapter.LeScanCallback callback)

This method was deprecated in API level 21. use BluetoothLeScanner#startScan(List, ScanSettings, ScanCallback) instead.

boolean startLeScan(BluetoothAdapter.LeScanCallback callback)

This method was deprecated in API level 21. use BluetoothLeScanner#startScan(List, ScanSettings, ScanCallback) instead.

void stopLeScan(BluetoothAdapter.LeScanCallback callback)

This method was deprecated in API level 21. Use BluetoothLeScanner#stopScan(ScanCallback) instead.

Protected methods

void finalize()

Called by the garbage collector on an object when garbage collection determines that there are no more references to the object.

Inherited methods

Constants

ACTION_CONNECTION_STATE_CHANGED

Added in API level 11
public static final String ACTION_CONNECTION_STATE_CHANGED

Intent used to broadcast the change in connection state of the local Bluetooth adapter to a profile of the remote device. When the adapter is not connected to any profiles of any remote devices and it attempts a connection to a profile this intent will be sent. Once connected, this intent will not be sent for any more connection attempts to any profiles of any remote device. When the adapter disconnects from the last profile its connected to of any remote device, this intent will be sent.

This intent is useful for applications that are only concerned about whether the local adapter is connected to any profile of any device and are not really concerned about which profile. For example, an application which displays an icon to display whether Bluetooth is connected or not can use this intent.

This intent will have 3 extras: EXTRA_CONNECTION_STATE - The current connection state. EXTRA_PREVIOUS_CONNECTION_STATE- The previous connection state. BluetoothDevice.EXTRA_DEVICE - The remote device.

EXTRA_CONNECTION_STATE or EXTRA_PREVIOUS_CONNECTION_STATE can be any of STATE_DISCONNECTED, STATE_CONNECTING, STATE_CONNECTED, STATE_DISCONNECTING.
For apps targeting Build.VERSION_CODES#R or lower, this requires the Manifest.permission#BLUETOOTH permission which can be gained with a simple <uses-permission> manifest tag.
For apps targeting Build.VERSION_CODES#S or or higher, this requires the Manifest.permission#BLUETOOTH_CONNECT permission which can be gained with Activity.requestPermissions(String[], int).
Requires Manifest.permission.BLUETOOTH_CONNECT

Constant Value: "android.bluetooth.adapter.action.CONNECTION_STATE_CHANGED"

ACTION_DISCOVERY_FINISHED

Added in API level 5
public static final String ACTION_DISCOVERY_FINISHED

Broadcast Action: The local Bluetooth adapter has finished the device discovery process.
For apps targeting Build.VERSION_CODES#R or lower, this requires the Manifest.permission#BLUETOOTH permission which can be gained with a simple <uses-permission> manifest tag.
For apps targeting Build.VERSION_CODES#S or or higher, this requires the Manifest.permission#BLUETOOTH_SCAN permission which can be gained with Activity.requestPermissions(String[], int).
Requires Manifest.permission.BLUETOOTH_SCAN

Constant Value: "android.bluetooth.adapter.action.DISCOVERY_FINISHED"

ACTION_DISCOVERY_STARTED

Added in API level 5
public static final String ACTION_DISCOVERY_STARTED

Broadcast Action: The local Bluetooth adapter has started the remote device discovery process.

This usually involves an inquiry scan of about 12 seconds, followed by a page scan of each new device to retrieve its Bluetooth name.

Register for BluetoothDevice#ACTION_FOUND to be notified as remote Bluetooth devices are found.

Device discovery is a heavyweight procedure. New connections to remote Bluetooth devices should not be attempted while discovery is in progress, and existing connections will experience limited bandwidth and high latency. Use cancelDiscovery() to cancel an ongoing discovery.
For apps targeting Build.VERSION_CODES#R or lower, this requires the Manifest.permission#BLUETOOTH permission which can be gained with a simple <uses-permission> manifest tag.
For apps targeting Build.VERSION_CODES#S or or higher, this requires the Manifest.permission#BLUETOOTH_SCAN permission which can be gained with Activity.requestPermissions(String[], int).
Requires Manifest.permission.BLUETOOTH_SCAN

Constant Value: "android.bluetooth.adapter.action.DISCOVERY_STARTED"

ACTION_LOCAL_NAME_CHANGED

Added in API level 5
public static final String ACTION_LOCAL_NAME_CHANGED

Broadcast Action: The local Bluetooth adapter has changed its friendly Bluetooth name.

This name is visible to remote Bluetooth devices.

Always contains the extra field EXTRA_LOCAL_NAME containing the name.
For apps targeting Build.VERSION_CODES#R or lower, this requires the Manifest.permission#BLUETOOTH permission which can be gained with a simple <uses-permission> manifest tag.
For apps targeting Build.VERSION_CODES#S or or higher, this requires the Manifest.permission#BLUETOOTH_CONNECT permission which can be gained with Activity.requestPermissions(String[], int).
Requires Manifest.permission.BLUETOOTH_CONNECT

Constant Value: "android.bluetooth.adapter.action.LOCAL_NAME_CHANGED"

ACTION_REQUEST_DISCOVERABLE

Added in API level 5
public static final String ACTION_REQUEST_DISCOVERABLE

Activity Action: Show a system activity that requests discoverable mode. This activity will also request the user to turn on Bluetooth if it is not currently enabled.

Discoverable mode is equivalent to SCAN_MODE_CONNECTABLE_DISCOVERABLE. It allows remote devices to see this Bluetooth adapter when they perform a discovery.

For privacy, Android is not discoverable by default.

The sender of this Intent can optionally use extra field EXTRA_DISCOVERABLE_DURATION to request the duration of discoverability. Currently the default duration is 120 seconds, and maximum duration is capped at 300 seconds for each request.

Notification of the result of this activity is posted using the Activity.onActivityResult(int, int, Intent) callback. The resultCode will be the duration (in seconds) of discoverability or Activity.RESULT_CANCELED if the user rejected discoverability or an error has occurred.

Applications can also listen for ACTION_SCAN_MODE_CHANGED for global notification whenever the scan mode changes. For example, an application can be notified when the device has ended discoverability.
For apps targeting Build.VERSION_CODES#R or lower, this requires the Manifest.permission#BLUETOOTH permission which can be gained with a simple <uses-permission> manifest tag.
For apps targeting Build.VERSION_CODES#S or or higher, this requires the Manifest.permission#BLUETOOTH_ADVERTISE permission which can be gained with Activity.requestPermissions(String[], int).
Requires Manifest.permission.BLUETOOTH_ADVERTISE

Constant Value: "android.bluetooth.adapter.action.REQUEST_DISCOVERABLE"

ACTION_REQUEST_ENABLE

Added in API level 5
public static final String ACTION_REQUEST_ENABLE

Activity Action: Show a system activity that allows the user to turn on Bluetooth.

This system activity will return once Bluetooth has completed turning on, or the user has decided not to turn Bluetooth on.

Notification of the result of this activity is posted using the Activity.onActivityResult(int, int, Intent) callback. The resultCode will be Activity.RESULT_OK if Bluetooth has been turned on or Activity.RESULT_CANCELED if the user has rejected the request or an error has occurred.

Applications can also listen for ACTION_STATE_CHANGED for global notification whenever Bluetooth is turned on or off.
For apps targeting Build.VERSION_CODES#R or lower, this requires the Manifest.permission#BLUETOOTH permission which can be gained with a simple <uses-permission> manifest tag.
For apps targeting Build.VERSION_CODES#S or or higher, this requires the Manifest.permission#BLUETOOTH_CONNECT permission which can be gained with Activity.requestPermissions(String[], int).
Requires Manifest.permission.BLUETOOTH_CONNECT

Constant Value: "android.bluetooth.adapter.action.REQUEST_ENABLE"

ACTION_SCAN_MODE_CHANGED

Added in API level 5
public static final String ACTION_SCAN_MODE_CHANGED

Broadcast Action: Indicates the Bluetooth scan mode of the local Adapter has changed.

Always contains the extra fields EXTRA_SCAN_MODE and EXTRA_PREVIOUS_SCAN_MODE containing the new and old scan modes respectively.
For apps targeting Build.VERSION_CODES#R or lower, this requires the Manifest.permission#BLUETOOTH permission which can be gained with a simple <uses-permission> manifest tag.
For apps targeting Build.VERSION_CODES#S or or higher, this requires the Manifest.permission#BLUETOOTH_SCAN permission which can be gained with Activity.requestPermissions(String[], int).
Requires Manifest.permission.BLUETOOTH_SCAN

Constant Value: "android.bluetooth.adapter.action.SCAN_MODE_CHANGED"

ACTION_STATE_CHANGED

Added in API level 5
public static final String ACTION_STATE_CHANGED

Broadcast Action: The state of the local Bluetooth adapter has been changed.

For example, Bluetooth has been turned on or off.

Always contains the extra fields EXTRA_STATE and EXTRA_PREVIOUS_STATE containing the new and old states respectively.
For apps targeting Build.VERSION_CODES#R or lower, this requires the Manifest.permission#BLUETOOTH permission which can be gained with a simple <uses-permission> manifest tag.

Constant Value: "android.bluetooth.adapter.action.STATE_CHANGED"

ERROR

Added in API level 5
public static final int ERROR

Sentinel error value for this class. Guaranteed to not equal any other integer constant in this class. Provided as a convenience for functions that require a sentinel error value, for example:

Intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR)

Constant Value: -2147483648 (0x80000000)

EXTRA_CONNECTION_STATE

Added in API level 11
public static final String EXTRA_CONNECTION_STATE

Extra used by ACTION_CONNECTION_STATE_CHANGED

This extra represents the current connection state.

Constant Value: "android.bluetooth.adapter.extra.CONNECTION_STATE"

EXTRA_DISCOVERABLE_DURATION

Added in API level 5
public static final String EXTRA_DISCOVERABLE_DURATION

Used as an optional int extra field in ACTION_REQUEST_DISCOVERABLE intents to request a specific duration for discoverability in seconds. The current default is 120 seconds, and requests over 300 seconds will be capped. These values could change.

Constant Value: "android.bluetooth.adapter.extra.DISCOVERABLE_DURATION"

EXTRA_LOCAL_NAME

Added in API level 5
public static final String EXTRA_LOCAL_NAME

Used as a String extra field in ACTION_LOCAL_NAME_CHANGED intents to request the local Bluetooth name.

Constant Value: "android.bluetooth.adapter.extra.LOCAL_NAME"

EXTRA_PREVIOUS_CONNECTION_STATE

Added in API level 11
public static final String EXTRA_PREVIOUS_CONNECTION_STATE

Extra used by ACTION_CONNECTION_STATE_CHANGED

This extra represents the previous connection state.

Constant Value: "android.bluetooth.adapter.extra.PREVIOUS_CONNECTION_STATE"

EXTRA_PREVIOUS_SCAN_MODE

Added in API level 5
public static final String EXTRA_PREVIOUS_SCAN_MODE

Used as an int extra field in ACTION_SCAN_MODE_CHANGED intents to request the previous scan mode. Possible values are: SCAN_MODE_NONE, SCAN_MODE_CONNECTABLE, SCAN_MODE_CONNECTABLE_DISCOVERABLE,

Constant Value: "android.bluetooth.adapter.extra.PREVIOUS_SCAN_MODE"

EXTRA_PREVIOUS_STATE

Added in API level 5
public static final String EXTRA_PREVIOUS_STATE

Used as an int extra field in ACTION_STATE_CHANGED intents to request the previous power state. Possible values are: STATE_OFF, STATE_TURNING_ON, STATE_ON, STATE_TURNING_OFF

Constant Value: "android.bluetooth.adapter.extra.PREVIOUS_STATE"

EXTRA_SCAN_MODE

Added in API level 5
public static final String EXTRA_SCAN_MODE

Used as an int extra field in ACTION_SCAN_MODE_CHANGED intents to request the current scan mode. Possible values are: SCAN_MODE_NONE, SCAN_MODE_CONNECTABLE, SCAN_MODE_CONNECTABLE_DISCOVERABLE,

Constant Value: "android.bluetooth.adapter.extra.SCAN_MODE"

EXTRA_STATE

Added in API level 5
public static final String EXTRA_STATE

Used as an int extra field in ACTION_STATE_CHANGED intents to request the current power state. Possible values are: STATE_OFF, STATE_TURNING_ON, STATE_ON, STATE_TURNING_OFF,

Constant Value: "android.bluetooth.adapter.extra.STATE"

SCAN_MODE_CONNECTABLE

Added in API level 5
public static final int SCAN_MODE_CONNECTABLE

Indicates that inquiry scan is disabled, but page scan is enabled on the local Bluetooth adapter. Therefore this device is not discoverable from remote Bluetooth devices, but is connectable from remote devices that have previously discovered this device.

Constant Value: 21 (0x00000015)

SCAN_MODE_CONNECTABLE_DISCOVERABLE

Added in API level 5
public static final int SCAN_MODE_CONNECTABLE_DISCOVERABLE

Indicates that both inquiry scan and page scan are enabled on the local Bluetooth adapter. Therefore this device is both discoverable and connectable from remote Bluetooth devices.

Constant Value: 23 (0x00000017)

SCAN_MODE_NONE

Added in API level 5
public static final int SCAN_MODE_NONE

Indicates that both inquiry scan and page scan are disabled on the local Bluetooth adapter. Therefore this device is neither discoverable nor connectable from remote Bluetooth devices.

Constant Value: 20 (0x00000014)

STATE_CONNECTED

Added in API level 11
public static final int STATE_CONNECTED

The profile is in connected state

Constant Value: 2 (0x00000002)

STATE_CONNECTING

Added in API level 11
public static final int STATE_CONNECTING

The profile is in connecting state

Constant Value: 1 (0x00000001)

STATE_DISCONNECTED

Added in API level 11
public static final int STATE_DISCONNECTED

The profile is in disconnected state

Constant Value: 0 (0x00000000)

STATE_DISCONNECTING

Added in API level 11
public static final int STATE_DISCONNECTING

The profile is in disconnecting state

Constant Value: 3 (0x00000003)

STATE_OFF

Added in API level 5
public static final int STATE_OFF

Indicates the local Bluetooth adapter is off.

Constant Value: 10 (0x0000000a)

STATE_ON

Added in API level 5
public static final int STATE_ON

Indicates the local Bluetooth adapter is on, and ready for use.

Constant Value: 12 (0x0000000c)

STATE_TURNING_OFF

Added in API level 5
public static final int STATE_TURNING_OFF

Indicates the local Bluetooth adapter is turning off. Local clients should immediately attempt graceful disconnection of any remote links.

Constant Value: 13 (0x0000000d)

STATE_TURNING_ON

Added in API level 5
public static final int STATE_TURNING_ON

Indicates the local Bluetooth adapter is turning on. However local clients should wait for STATE_ON before attempting to use the adapter.

Constant Value: 11 (0x0000000b)

Public methods

cancelDiscovery

Added in API level 5
public boolean cancelDiscovery ()

Cancel the current device discovery process.

Because discovery is a heavyweight procedure for the Bluetooth adapter, this method should always be called before attempting to connect to a remote device with BluetoothSocket.connect(). Discovery is not managed by the Activity, but is run as a system service, so an application should always call cancel discovery even if it did not directly request a discovery, just to be sure.

If Bluetooth state is not STATE_ON, this API will return false. After turning on Bluetooth, wait for ACTION_STATE_CHANGED with STATE_ON to get the updated value.
For apps targeting Build.VERSION_CODES#R or lower, this requires the Manifest.permission#BLUETOOTH_ADMIN permission which can be gained with a simple <uses-permission> manifest tag.
For apps targeting Build.VERSION_CODES#S or or higher, this requires the Manifest.permission#BLUETOOTH_SCAN permission which can be gained with Activity.requestPermissions(String[], int).
Requires Manifest.permission.BLUETOOTH_SCAN

Returns
boolean true on success, false on error

checkBluetoothAddress

Added in API level 5
public static boolean checkBluetoothAddress (String address)

Validate a String Bluetooth address, such as "00:43:A8:23:10:F0"

Alphabetic characters must be uppercase to be valid.

Parameters
address String: Bluetooth address as string

Returns
boolean true if the address is valid, false otherwise

closeProfileProxy

Added in API level 11
public void closeProfileProxy (int unusedProfile, 
                BluetoothProfile proxy)

Close the connection of the profile proxy to the Service.

Clients should call this when they are no longer using the proxy obtained from getProfileProxy(Context, ServiceListener, int). Profile can be one of BluetoothProfile#HEADSET or BluetoothProfile.A2DP

Parameters
unusedProfile int

proxy BluetoothProfile: Profile proxy object

disable

Added in API level 5
Deprecated in API level 33
public boolean disable ()

This method was deprecated in API level 33.
Starting with Build.VERSION_CODES.TIRAMISU, applications are not allowed to enable/disable Bluetooth. Compatibility Note: For applications targeting Build.VERSION_CODES.TIRAMISU or above, this API will always fail and return false. If apps are targeting an older SDK (Build.VERSION_CODES.S or below), they can continue to use this API.

Deprecation Exemptions:

  • Device Owner (DO), Profile Owner (PO) and system apps.

Turn off the local Bluetooth adapter—do not use without explicit user action to turn off Bluetooth.

This gracefully shuts down all Bluetooth connections, stops Bluetooth system services, and powers down the underlying Bluetooth hardware.

Bluetooth should never be disabled without direct user consent. The disable() method is provided only for applications that include a user interface for changing system settings, such as a "power manager" app.

This is an asynchronous call: it will return immediately, and clients should listen for ACTION_STATE_CHANGED to be notified of subsequent adapter state changes. If this call returns true, then the adapter state will immediately transition from STATE_ON to STATE_TURNING_OFF, and some time later transition to either STATE_OFF or STATE_ON. If this call returns false then there was an immediate problem that will prevent the adapter from being turned off - such as the adapter already being turned off.
For apps targeting Build.VERSION_CODES#R or lower, this requires the Manifest.permission#BLUETOOTH_ADMIN permission which can be gained with a simple <uses-permission> manifest tag.
For apps targeting Build.VERSION_CODES#S or or higher, this requires the Manifest.permission#BLUETOOTH_CONNECT permission which can be gained with Activity.requestPermissions(String[], int).
Requires Manifest.permission.BLUETOOTH_CONNECT

Returns
boolean true to indicate adapter shutdown has begun, or false on immediate error

enable

Added in API level 5
Deprecated in API level 33
public boolean enable ()

This method was deprecated in API level 33.
Starting with Build.VERSION_CODES.TIRAMISU, applications are not allowed to enable/disable Bluetooth. Compatibility Note: For applications targeting Build.VERSION_CODES.TIRAMISU or above, this API will always fail and return false. If apps are targeting an older SDK (Build.VERSION_CODES.S or below), they can continue to use this API.

Deprecation Exemptions:

  • Device Owner (DO), Profile Owner (PO) and system apps.

Turn on the local Bluetooth adapter—do not use without explicit user action to turn on Bluetooth.

This powers on the underlying Bluetooth hardware, and starts all Bluetooth system services.

Bluetooth should never be enabled without direct user consent. If you want to turn on Bluetooth in order to create a wireless connection, you should use the ACTION_REQUEST_ENABLE Intent, which will raise a dialog that requests user permission to turn on Bluetooth. The enable() method is provided only for applications that include a user interface for changing system settings, such as a "power manager" app.

This is an asynchronous call: it will return immediately, and clients should listen for ACTION_STATE_CHANGED to be notified of subsequent adapter state changes. If this call returns true, then the adapter state will immediately transition from STATE_OFF to STATE_TURNING_ON, and some time later transition to either STATE_OFF or STATE_ON. If this call returns false then there was an immediate problem that will prevent the adapter from being turned on - such as Airplane mode, or the adapter is already turned on.
For apps targeting Build.VERSION_CODES#R or lower, this requires the Manifest.permission#BLUETOOTH_ADMIN permission which can be gained with a simple <uses-permission> manifest tag.
For apps targeting Build.VERSION_CODES#S or or higher, this requires the Manifest.permission#BLUETOOTH_CONNECT permission which can be gained with Activity.requestPermissions(String[], int).
Requires Manifest.permission.BLUETOOTH_CONNECT

Returns
boolean true to indicate adapter startup has begun, or false on immediate error

getAddress

Added in API level 5
public String getAddress ()

Returns the hardware address of the local Bluetooth adapter.

For example, "00:11:22:AA:BB:CC".
For apps targeting Build.VERSION_CODES#R or lower, this requires the Manifest.permission#BLUETOOTH permission which can be gained with a simple <uses-permission> manifest tag.
For apps targeting Build.VERSION_CODES#S or or higher, this requires the Manifest.permission#BLUETOOTH_CONNECT permission which can be gained with Activity.requestPermissions(String[], int).

Returns
String Bluetooth hardware address as string

Requires android.Manifest.permission#LOCAL_MAC_ADDRESS and Manifest.permission.BLUETOOTH_CONNECT.

getBluetoothLeAdvertiser

Added in API level 21
public BluetoothLeAdvertiser getBluetoothLeAdvertiser ()

Returns a BluetoothLeAdvertiser object for Bluetooth LE Advertising operations. Will return null if Bluetooth is turned off or if Bluetooth LE Advertising is not supported on this device.

Use isMultipleAdvertisementSupported() to check whether LE Advertising is supported on this device before calling this method.

Returns
BluetoothLeAdvertiser

getBluetoothLeScanner

Added in API level 21
public BluetoothLeScanner getBluetoothLeScanner ()

Returns a BluetoothLeScanner object for Bluetooth LE scan operations.

Returns
BluetoothLeScanner

getBondedDevices

Added in API level 5
public Set<BluetoothDevice> getBondedDevices ()

Return the set of BluetoothDevice objects that are bonded (paired) to the local adapter.

If Bluetooth state is not STATE_ON, this API will return an empty set. After turning on Bluetooth, wait for ACTION_STATE_CHANGED with STATE_ON to get the updated value.
For apps targeting Build.VERSION_CODES#R or lower, this requires the Manifest.permission#BLUETOOTH permission which can be gained with a simple <uses-permission> manifest tag.
For apps targeting Build.VERSION_CODES#S or or higher, this requires the Manifest.permission#BLUETOOTH_CONNECT permission which can be gained with Activity.requestPermissions(String[], int).
Requires Manifest.permission.BLUETOOTH_CONNECT

Returns
Set<BluetoothDevice> unmodifiable set of BluetoothDevice, or null on error

getDefaultAdapter

Added in API level 5
Deprecated in API level 31
public static BluetoothAdapter getDefaultAdapter ()

This method was deprecated in API level 31.
this method will continue to work, but developers are strongly encouraged to migrate to using BluetoothManager#getAdapter(), since that approach enables support for Context#createAttributionContext.

Get a handle to the default local Bluetooth adapter.

Currently Android only supports one Bluetooth adapter, but the API could be extended to support more. This will always return the default adapter.

Returns
BluetoothAdapter the default local adapter, or null if Bluetooth is not supported on this hardware platform

getDiscoverableTimeout

Added in API level 33
public Duration getDiscoverableTimeout ()

Get the timeout duration of the SCAN_MODE_CONNECTABLE_DISCOVERABLE.
For apps targeting Build.VERSION_CODES#S or or higher, this requires the Manifest.permission#BLUETOOTH_SCAN permission which can be gained with Activity.requestPermissions(String[], int).
Requires Manifest.permission.BLUETOOTH_SCAN

Returns
Duration the duration of the discoverable timeout or null if an error has occurred

getLeMaximumAdvertisingDataLength

Added in API level 26
public int getLeMaximumAdvertisingDataLength ()

Return the maximum LE advertising data length in bytes, if LE Extended Advertising feature is supported, 0 otherwise.
For apps targeting Build.VERSION_CODES#R or lower, this requires the Manifest.permission#BLUETOOTH permission which can be gained with a simple <uses-permission> manifest tag.

Returns
int the maximum LE advertising data length.

getMaxConnectedAudioDevices

Added in API level 33
public int getMaxConnectedAudioDevices ()

Get the maximum number of connected devices per audio profile for this device.
For apps targeting Build.VERSION_CODES#R or lower, this requires the Manifest.permission#BLUETOOTH permission which can be gained with a simple <uses-permission> manifest tag.
For apps targeting Build.VERSION_CODES#S or or higher, this requires the Manifest.permission#BLUETOOTH_CONNECT permission which can be gained with Activity.requestPermissions(String[], int).
Requires Manifest.permission.BLUETOOTH_CONNECT

Returns
int the number of allowed simultaneous connected devices for each audio profile for this device, or -1 if the Bluetooth service can't be reached

getName

Added in API level 5
public String getName ()

Get the friendly Bluetooth name of the local Bluetooth adapter.

This name is visible to remote Bluetooth devices.
For apps targeting Build.VERSION_CODES#R or lower, this requires the Manifest.permission#BLUETOOTH permission which can be gained with a simple <uses-permission> manifest tag.
For apps targeting Build.VERSION_CODES#S or or higher, this requires the Manifest.permission#BLUETOOTH_CONNECT permission which can be gained with Activity.requestPermissions(String[], int).
Requires Manifest.permission.BLUETOOTH_CONNECT

Returns
String the Bluetooth name, or null on error

getProfileConnectionState

Added in API level 14
public int getProfileConnectionState (int profile)

Get the current connection state of a profile. This function can be used to check whether the local Bluetooth adapter is connected to any remote device for a specific profile. Profile can be one of BluetoothProfile#HEADSET, BluetoothProfile#A2DP.

Return the profile connection state
For apps targeting Build.VERSION_CODES#R or lower, this requires the Manifest.permission#BLUETOOTH permission which can be gained with a simple <uses-permission> manifest tag.
For apps targeting Build.VERSION_CODES#S or or higher, this requires the Manifest.permission#BLUETOOTH_CONNECT permission which can be gained with Activity.requestPermissions(String[], int).
Requires Manifest.permission.BLUETOOTH_CONNECT

Parameters
profile int

Returns
int Value is STATE_DISCONNECTED, STATE_CONNECTING, STATE_CONNECTED, or STATE_DISCONNECTING

getProfileProxy

Added in API level 11
public boolean getProfileProxy (Context context, 
                BluetoothProfile.ServiceListener listener, 
                int profile)

Get the profile proxy object associated with the profile.

Profile can be one of BluetoothProfile#HEADSET, BluetoothProfile#A2DP, BluetoothProfile#GATT, BluetoothProfile#HEARING_AID, or BluetoothProfile.GATT_SERVER. Clients must implement BluetoothProfile.ServiceListener to get notified of the connection status and to get the proxy object.

Parameters
context Context: Context of the application

listener BluetoothProfile.ServiceListener: The service Listener for connection callbacks.

profile int: The Bluetooth profile; either BluetoothProfile#HEADSET, BluetoothProfile.A2DP, BluetoothProfile#GATT, BluetoothProfile.HEARING_AID or BluetoothProfile#GATT_SERVER.

Returns
boolean true on success, false on error

getRemoteDevice

Added in API level 16
public BluetoothDevice getRemoteDevice (byte[] address)

Get a BluetoothDevice object for the given Bluetooth hardware address.

Valid Bluetooth hardware addresses must be 6 bytes. This method expects the address in network byte order (MSB first).

A BluetoothDevice will always be returned for a valid hardware address, even if this adapter has never seen that device.

Parameters
address byte: Bluetooth MAC address (6 bytes)

Returns
BluetoothDevice

Throws
IllegalArgumentException if address is invalid

getRemoteDevice

Added in API level 5
public BluetoothDevice getRemoteDevice (String address)

Get a BluetoothDevice object for the given Bluetooth hardware address.

Valid Bluetooth hardware addresses must be upper case, in big endian byte order, and in a format such as "00:11:22:33:AA:BB". The helper checkBluetoothAddress(String) is available to validate a Bluetooth address.

A BluetoothDevice will always be returned for a valid hardware address, even if this adapter has never seen that device.

Parameters
address String: valid Bluetooth MAC address

Returns
BluetoothDevice

Throws
IllegalArgumentException if address is invalid

getRemoteLeDevice

Added in API level 33
public BluetoothDevice getRemoteLeDevice (String address, 
                int addressType)

Get a BluetoothDevice object for the given Bluetooth hardware address and addressType.

Valid Bluetooth hardware addresses must be upper case, in big endian byte order, and in a format such as "00:11:22:33:AA:BB". The helper checkBluetoothAddress(String) is available to validate a Bluetooth address.

A BluetoothDevice will always be returned for a valid hardware address and type, even if this adapter has never seen that device.

Parameters
address String: valid Bluetooth MAC address This value cannot be null.

addressType int: Bluetooth address type Value is BluetoothDevice.ADDRESS_TYPE_PUBLIC, BluetoothDevice.ADDRESS_TYPE_RANDOM, android.bluetooth.BluetoothDevice.ADDRESS_TYPE_ANONYMOUS, or BluetoothDevice.ADDRESS_TYPE_UNKNOWN

Returns
BluetoothDevice This value cannot be null.

Throws
IllegalArgumentException if address is invalid

getScanMode

Added in API level 5
public int getScanMode ()

Get the current Bluetooth scan mode of the local Bluetooth adapter.

The Bluetooth scan mode determines if the local adapter is connectable and/or discoverable from remote Bluetooth devices.

Possible values are: SCAN_MODE_NONE, SCAN_MODE_CONNECTABLE, SCAN_MODE_CONNECTABLE_DISCOVERABLE.

If Bluetooth state is not STATE_ON, this API will return SCAN_MODE_NONE. After turning on Bluetooth, wait for ACTION_STATE_CHANGED with STATE_ON to get the updated value.
For apps targeting Build.VERSION_CODES#R or lower, this requires the Manifest.permission#BLUETOOTH permission which can be gained with a simple <uses-permission> manifest tag.
For apps targeting Build.VERSION_CODES#S or or higher, this requires the Manifest.permission#BLUETOOTH_SCAN permission which can be gained with Activity.requestPermissions(String[], int).
Requires Manifest.permission.BLUETOOTH_SCAN

Returns
int scan mode Value is SCAN_MODE_NONE, SCAN_MODE_CONNECTABLE, or SCAN_MODE_CONNECTABLE_DISCOVERABLE

getState

Added in API level 5
public int getState ()

Get the current state of the local Bluetooth adapter.

Possible return values are STATE_OFF, STATE_TURNING_ON, STATE_ON, STATE_TURNING_OFF.
For apps targeting Build.VERSION_CODES#R or lower, this requires the Manifest.permission#BLUETOOTH permission which can be gained with a simple <uses-permission> manifest tag.

Returns
int current state of Bluetooth adapter Value is STATE_OFF, STATE_TURNING_ON, STATE_ON, or STATE_TURNING_OFF

isDiscovering

Added in API level 5
public boolean isDiscovering ()

Return true if the local Bluetooth adapter is currently in the device discovery process.

Device discovery is a heavyweight procedure. New connections to remote Bluetooth devices should not be attempted while discovery is in progress, and existing connections will experience limited bandwidth and high latency. Use cancelDiscovery() to cancel an ongoing discovery.

Applications can also register for ACTION_DISCOVERY_STARTED or ACTION_DISCOVERY_FINISHED to be notified when discovery starts or completes.

If Bluetooth state is not STATE_ON, this API will return false. After turning on Bluetooth, wait for ACTION_STATE_CHANGED with STATE_ON to get the updated value.
For apps targeting Build.VERSION_CODES#R or lower, this requires the Manifest.permission#BLUETOOTH permission which can be gained with a simple <uses-permission> manifest tag.
For apps targeting Build.VERSION_CODES#S or or higher, this requires the Manifest.permission#BLUETOOTH_SCAN permission which can be gained with Activity.requestPermissions(String[], int).
Requires Manifest.permission.BLUETOOTH_SCAN

Returns
boolean true if discovering

isEnabled

Added in API level 5
public boolean isEnabled ()

Return true if Bluetooth is currently enabled and ready for use.

Equivalent to: getBluetoothState() == STATE_ON
For apps targeting Build.VERSION_CODES#R or lower, this requires the Manifest.permission#BLUETOOTH permission which can be gained with a simple <uses-permission> manifest tag.

Returns
boolean true if the local adapter is turned on

isLe2MPhySupported

Added in API level 26
public boolean isLe2MPhySupported ()

Return true if LE 2M PHY feature is supported.
For apps targeting Build.VERSION_CODES#R or lower, this requires the Manifest.permission#BLUETOOTH permission which can be gained with a simple <uses-permission> manifest tag.

Returns
boolean true if chipset supports LE 2M PHY feature

isLeAudioBroadcastAssistantSupported

Added in API level 33
public int isLeAudioBroadcastAssistantSupported ()

Returns BluetoothStatusCodes#FEATURE_SUPPORTED if the LE audio broadcast assistant feature is supported, BluetoothStatusCodes#FEATURE_NOT_SUPPORTED if the feature is not supported, or an error code.

Returns
int whether the LE audio broadcast assistant is supported Value is BluetoothStatusCodes.FEATURE_SUPPORTED, BluetoothStatusCodes.ERROR_UNKNOWN, BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED, or BluetoothStatusCodes.FEATURE_NOT_SUPPORTED

Throws
IllegalStateException if the bluetooth service is null

isLeAudioBroadcastSourceSupported

Added in API level 33
public int isLeAudioBroadcastSourceSupported ()

Returns BluetoothStatusCodes#FEATURE_SUPPORTED if the LE audio broadcast source feature is supported, BluetoothStatusCodes#FEATURE_NOT_SUPPORTED if the feature is not supported, or an error code.

Returns
int whether the LE audio broadcast source is supported Value is BluetoothStatusCodes.FEATURE_SUPPORTED, BluetoothStatusCodes.ERROR_UNKNOWN, BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED, or BluetoothStatusCodes.FEATURE_NOT_SUPPORTED

Throws
IllegalStateException if the bluetooth service is null

isLeAudioSupported

Added in API level 33
public int isLeAudioSupported ()

Returns BluetoothStatusCodes#FEATURE_SUPPORTED if the LE audio feature is supported, BluetoothStatusCodes#FEATURE_NOT_SUPPORTED if the feature is not supported, or an error code.

Returns
int whether the LE audio is supported Value is BluetoothStatusCodes.FEATURE_SUPPORTED, BluetoothStatusCodes.ERROR_UNKNOWN, BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED, or BluetoothStatusCodes.FEATURE_NOT_SUPPORTED

Throws
IllegalStateException if the bluetooth service is null

isLeCodedPhySupported

Added in API level 26
public boolean isLeCodedPhySupported ()

Return true if LE Coded PHY feature is supported.
For apps targeting Build.VERSION_CODES#R or lower, this requires the Manifest.permission#BLUETOOTH permission which can be gained with a simple <uses-permission> manifest tag.

Returns
boolean true if chipset supports LE Coded PHY feature

isLeExtendedAdvertisingSupported

Added in API level 26
public boolean isLeExtendedAdvertisingSupported ()

Return true if LE Extended Advertising feature is supported.
For apps targeting Build.VERSION_CODES#R or lower, this requires the Manifest.permission#BLUETOOTH permission which can be gained with a simple <uses-permission> manifest tag.

Returns
boolean true if chipset supports LE Extended Advertising feature

isLePeriodicAdvertisingSupported

Added in API level 26
public boolean isLePeriodicAdvertisingSupported ()

Return true if LE Periodic Advertising feature is supported.
For apps targeting Build.VERSION_CODES#R or lower, this requires the Manifest.permission#BLUETOOTH permission which can be gained with a simple <uses-permission> manifest tag.

Returns
boolean true if chipset supports LE Periodic Advertising feature

isMultipleAdvertisementSupported

Added in API level 21
public boolean isMultipleAdvertisementSupported ()

Return true if the multi advertisement is supported by the chipset
For apps targeting Build.VERSION_CODES#R or lower, this requires the Manifest.permission#BLUETOOTH permission which can be gained with a simple <uses-permission> manifest tag.

Returns
boolean true if Multiple Advertisement feature is supported

isOffloadedFilteringSupported

Added in API level 21
public boolean isOffloadedFilteringSupported ()

Return true if offloaded filters are supported
For apps targeting Build.VERSION_CODES#R or lower, this requires the Manifest.permission#BLUETOOTH permission which can be gained with a simple <uses-permission> manifest tag.

Returns
boolean true if chipset supports on-chip filtering

isOffloadedScanBatchingSupported

Added in API level 21
public boolean isOffloadedScanBatchingSupported ()

Return true if offloaded scan batching is supported
For apps targeting Build.VERSION_CODES#R or lower, this requires the Manifest.permission#BLUETOOTH permission which can be gained with a simple <uses-permission> manifest tag.

Returns
boolean true if chipset supports on-chip scan batching

listenUsingInsecureL2capChannel

Added in API level 29
public BluetoothServerSocket listenUsingInsecureL2capChannel ()

Create an insecure L2CAP Connection-oriented Channel (CoC) BluetoothServerSocket and assign a dynamic PSM value. This socket can be used to listen for incoming connections. The supported Bluetooth transport is LE only.

The link key is not required to be authenticated, i.e. the communication may be vulnerable to person-in-the-middle attacks. Use listenUsingL2capChannel(), if an encrypted and authenticated communication channel is desired.

Use BluetoothServerSocket#accept to retrieve incoming connections from a listening BluetoothServerSocket.

The system will assign a dynamic protocol/service multiplexer (PSM) value. This PSM value can be read from the BluetoothServerSocket#getPsm() and this value will be released when this server socket is closed, Bluetooth is turned off, or the application exits unexpectedly.

The mechanism of disclosing the assigned dynamic PSM value to the initiating peer is defined and performed by the application.

Use BluetoothDevice#createInsecureL2capChannel(int) to connect to this server socket from another Android device that is given the PSM value.
For apps targeting Build.VERSION_CODES#R or lower, this requires the Manifest.permission#BLUETOOTH permission which can be gained with a simple <uses-permission> manifest tag.
For apps targeting Build.VERSION_CODES#S or or higher, this requires the Manifest.permission#BLUETOOTH_CONNECT permission which can be gained with Activity.requestPermissions(String[], int).
Requires Manifest.permission.BLUETOOTH_CONNECT

Returns
BluetoothServerSocket an L2CAP CoC BluetoothServerSocket This value cannot be null.

Throws
IOException on error, for example Bluetooth not available, or insufficient permissions, or unable to start this CoC

listenUsingInsecureRfcommWithServiceRecord

Added in API level 10
public BluetoothServerSocket listenUsingInsecureRfcommWithServiceRecord (String name, 
                UUID uuid)

Create a listening, insecure RFCOMM Bluetooth socket with Service Record.

The link key is not required to be authenticated, i.e. the communication may be vulnerable to Person In the Middle attacks. For Bluetooth 2.1 devices, the link will be encrypted, as encryption is mandatory. For legacy devices (pre Bluetooth 2.1 devices) the link will not be encrypted. Use listenUsingRfcommWithServiceRecord(String, UUID), if an encrypted and authenticated communication channel is desired.

Use BluetoothServerSocket#accept to retrieve incoming connections from a listening BluetoothServerSocket.

The system will assign an unused RFCOMM channel to listen on.

The system will also register a Service Discovery Protocol (SDP) record with the local SDP server containing the specified UUID, service name, and auto-assigned channel. Remote Bluetooth devices can use the same UUID to query our SDP server and discover which channel to connect to. This SDP record will be removed when this socket is closed, or if this application closes unexpectedly.

Use BluetoothDevice#createInsecureRfcommSocketToServiceRecord to connect to this socket from another device using the same UUID.
For apps targeting Build.VERSION_CODES#R or lower, this requires the Manifest.permission#BLUETOOTH permission which can be gained with a simple <uses-permission> manifest tag.
For apps targeting Build.VERSION_CODES#S or or higher, this requires the Manifest.permission#BLUETOOTH_CONNECT permission which can be gained with Activity.requestPermissions(String[], int).
Requires Manifest.permission.BLUETOOTH_CONNECT

Parameters
name String: service name for SDP record

uuid UUID: uuid for SDP record

Returns
BluetoothServerSocket a listening RFCOMM BluetoothServerSocket

Throws
IOException on error, for example Bluetooth not available, or insufficient permissions, or channel in use.

listenUsingL2capChannel

Added in API level 29
public BluetoothServerSocket listenUsingL2capChannel ()

Create a secure L2CAP Connection-oriented Channel (CoC) BluetoothServerSocket and assign a dynamic protocol/service multiplexer (PSM) value. This socket can be used to listen for incoming connections. The supported Bluetooth transport is LE only.

A remote device connecting to this socket will be authenticated and communication on this socket will be encrypted.

Use BluetoothServerSocket#accept to retrieve incoming connections from a listening BluetoothServerSocket.

The system will assign a dynamic PSM value. This PSM value can be read from the BluetoothServerSocket.getPsm() and this value will be released when this server socket is closed, Bluetooth is turned off, or the application exits unexpectedly.

The mechanism of disclosing the assigned dynamic PSM value to the initiating peer is defined and performed by the application.

Use BluetoothDevice#createL2capChannel(int) to connect to this server socket from another Android device that is given the PSM value.
For apps targeting Build.VERSION_CODES#R or lower, this requires the Manifest.permission#BLUETOOTH permission which can be gained with a simple <uses-permission> manifest tag.
For apps targeting Build.VERSION_CODES#S or or higher, this requires the Manifest.permission#BLUETOOTH_CONNECT permission which can be gained with Activity.requestPermissions(String[], int).
Requires Manifest.permission.BLUETOOTH_CONNECT

Returns
BluetoothServerSocket an L2CAP CoC BluetoothServerSocket This value cannot be null.

Throws
IOException on error, for example Bluetooth not available, or insufficient permissions, or unable to start this CoC

listenUsingRfcommWithServiceRecord

Added in API level 5
public BluetoothServerSocket listenUsingRfcommWithServiceRecord (String name, 
                UUID uuid)

Create a listening, secure RFCOMM Bluetooth socket with Service Record.

A remote device connecting to this socket will be authenticated and communication on this socket will be encrypted.

Use BluetoothServerSocket#accept to retrieve incoming connections from a listening BluetoothServerSocket.

The system will assign an unused RFCOMM channel to listen on.

The system will also register a Service Discovery Protocol (SDP) record with the local SDP server containing the specified UUID, service name, and auto-assigned channel. Remote Bluetooth devices can use the same UUID to query our SDP server and discover which channel to connect to. This SDP record will be removed when this socket is closed, or if this application closes unexpectedly.

Use BluetoothDevice#createRfcommSocketToServiceRecord to connect to this socket from another device using the same UUID.
For apps targeting Build.VERSION_CODES#R or lower, this requires the Manifest.permission#BLUETOOTH permission which can be gained with a simple <uses-permission> manifest tag.
For apps targeting Build.VERSION_CODES#S or or higher, this requires the Manifest.permission#BLUETOOTH_CONNECT permission which can be gained with Activity.requestPermissions(String[], int).
Requires Manifest.permission.BLUETOOTH_CONNECT

Parameters
name String: service name for SDP record

uuid UUID: uuid for SDP record

Returns
BluetoothServerSocket a listening RFCOMM BluetoothServerSocket

Throws
IOException on error, for example Bluetooth not available, or insufficient permissions, or channel in use.

setName

Added in API level 5
public boolean setName (String name)

Set the friendly Bluetooth name of the local Bluetooth adapter.

This name is visible to remote Bluetooth devices.

Valid Bluetooth names are a maximum of 248 bytes using UTF-8 encoding, although many remote devices can only display the first 40 characters, and some may be limited to just 20.

If Bluetooth state is not STATE_ON, this API will return false. After turning on Bluetooth, wait for ACTION_STATE_CHANGED with STATE_ON to get the updated value.
For apps targeting Build.VERSION_CODES#R or lower, this requires the Manifest.permission#BLUETOOTH_ADMIN permission which can be gained with a simple <uses-permission> manifest tag.
For apps targeting Build.VERSION_CODES#S or or higher, this requires the Manifest.permission#BLUETOOTH_CONNECT permission which can be gained with Activity.requestPermissions(String[], int).
Requires Manifest.permission.BLUETOOTH_CONNECT

Parameters
name String: a valid Bluetooth name

Returns
boolean true if the name was set, false otherwise

startDiscovery

Added in API level 5
public boolean startDiscovery ()

Start the remote device discovery process.

The discovery process usually involves an inquiry scan of about 12 seconds, followed by a page scan of each new device to retrieve its Bluetooth name.

This is an asynchronous call, it will return immediately. Register for ACTION_DISCOVERY_STARTED and ACTION_DISCOVERY_FINISHED intents to determine exactly when the discovery starts and completes. Register for BluetoothDevice.ACTION_FOUND to be notified as remote Bluetooth devices are found.

Device discovery is a heavyweight procedure. New connections to remote Bluetooth devices should not be attempted while discovery is in progress, and existing connections will experience limited bandwidth and high latency. Use cancelDiscovery() to cancel an ongoing discovery. Discovery is not managed by the Activity, but is run as a system service, so an application should always call BluetoothAdapter#cancelDiscovery() even if it did not directly request a discovery, just to be sure.

Device discovery will only find remote devices that are currently discoverable (inquiry scan enabled). Many Bluetooth devices are not discoverable by default, and need to be entered into a special mode.

If Bluetooth state is not STATE_ON, this API will return false. After turning on Bluetooth, wait for ACTION_STATE_CHANGED with STATE_ON to get the updated value.

If a device is currently bonding, this request will be queued and executed once that device has finished bonding. If a request is already queued, this request will be ignored.
For apps targeting Build.VERSION_CODES#R or lower, this requires the Manifest.permission#BLUETOOTH_ADMIN permission which can be gained with a simple <uses-permission> manifest tag.
For apps targeting Build.VERSION_CODES#S or or higher, this requires the Manifest.permission#BLUETOOTH_SCAN permission which can be gained with Activity.requestPermissions(String[], int).
In addition, this requires either the Manifest.permission#ACCESS_FINE_LOCATION permission or a strong assertion that you will never derive the physical location of the device. You can make this assertion by declaring usesPermissionFlags="neverForLocation" on the relevant <uses-permission> manifest tag, but it may restrict the types of Bluetooth devices you can interact with.
Requires Manifest.permission.BLUETOOTH_SCAN

Returns
boolean true on success, false on error

startLeScan

Added in API level 18
Deprecated in API level 21
public boolean startLeScan (UUID[] serviceUuids, 
                BluetoothAdapter.LeScanCallback callback)

This method was deprecated in API level 21.
use BluetoothLeScanner#startScan(List, ScanSettings, ScanCallback) instead.

Starts a scan for Bluetooth LE devices, looking for devices that advertise given services.

Devices which advertise all specified services are reported using the BluetoothAdapter.LeScanCallback.onLeScan(BluetoothDevice, int, byte) callback.
For apps targeting Build.VERSION_CODES#R or lower, this requires the Manifest.permission#BLUETOOTH_ADMIN permission which can be gained with a simple <uses-permission> manifest tag.
For apps targeting Build.VERSION_CODES#S or or higher, this requires the Manifest.permission#BLUETOOTH_SCAN permission which can be gained with Activity.requestPermissions(String[], int).
In addition, this requires either the Manifest.permission#ACCESS_FINE_LOCATION permission or a strong assertion that you will never derive the physical location of the device. You can make this assertion by declaring usesPermissionFlags="neverForLocation" on the relevant <uses-permission> manifest tag, but it may restrict the types of Bluetooth devices you can interact with.
Requires Manifest.permission.BLUETOOTH_SCAN

Parameters
serviceUuids UUID: Array of services to look for

callback BluetoothAdapter.LeScanCallback: the callback LE scan results are delivered

Returns
boolean true, if the scan was started successfully

startLeScan

Added in API level 18
Deprecated in API level 21
public boolean startLeScan (BluetoothAdapter.LeScanCallback callback)

This method was deprecated in API level 21.
use BluetoothLeScanner#startScan(List, ScanSettings, ScanCallback) instead.

Starts a scan for Bluetooth LE devices.

Results of the scan are reported using the LeScanCallback#onLeScan callback.
For apps targeting Build.VERSION_CODES#R or lower, this requires the Manifest.permission#BLUETOOTH_ADMIN permission which can be gained with a simple <uses-permission> manifest tag.
For apps targeting Build.VERSION_CODES#S or or higher, this requires the Manifest.permission#BLUETOOTH_SCAN permission which can be gained with Activity.requestPermissions(String[], int).
In addition, this requires either the Manifest.permission#ACCESS_FINE_LOCATION permission or a strong assertion that you will never derive the physical location of the device. You can make this assertion by declaring usesPermissionFlags="neverForLocation" on the relevant <uses-permission> manifest tag, but it may restrict the types of Bluetooth devices you can interact with.
Requires Manifest.permission.BLUETOOTH_SCAN

Parameters
callback BluetoothAdapter.LeScanCallback: the callback LE scan results are delivered

Returns
boolean true, if the scan was started successfully

stopLeScan

Added in API level 18
Deprecated in API level 21
public void stopLeScan (BluetoothAdapter.LeScanCallback callback)

This method was deprecated in API level 21.
Use BluetoothLeScanner#stopScan(ScanCallback) instead.

Stops an ongoing Bluetooth LE device scan.
For apps targeting Build.VERSION_CODES#R or lower, this requires the Manifest.permission#BLUETOOTH_ADMIN permission which can be gained with a simple <uses-permission> manifest tag.
For apps targeting Build.VERSION_CODES#S or or higher, this requires the Manifest.permission#BLUETOOTH_SCAN permission which can be gained with Activity.requestPermissions(String[], int).
Requires Manifest.permission.BLUETOOTH_SCAN

Parameters
callback BluetoothAdapter.LeScanCallback: used to identify which scan to stop must be the same handle used to start the scan

Protected methods

finalize

Added in API level 5
protected void finalize ()

Called by the garbage collector on an object when garbage collection determines that there are no more references to the object. A subclass overrides the finalize method to dispose of system resources or to perform other cleanup.

The general contract of finalize is that it is invoked if and when the Java virtual machine has determined that there is no longer any means by which this object can be accessed by any thread that has not yet died, except as a result of an action taken by the finalization of some other object or class which is ready to be finalized. The finalize method may take any action, including making this object available again to other threads; the usual purpose of finalize, however, is to perform cleanup actions before the object is irrevocably discarded. For example, the finalize method for an object that represents an input/output connection might perform explicit I/O transactions to break the connection before the object is permanently discarded.

The finalize method of class Object performs no special action; it simply returns normally. Subclasses of Object may override this definition.

The Java programming language does not guarantee which thread will invoke the finalize method for any given object. It is guaranteed, however, that the thread that invokes finalize will not be holding any user-visible synchronization locks when finalize is invoked. If an uncaught exception is thrown by the finalize method, the exception is ignored and finalization of that object terminates.

After the finalize method has been invoked for an object, no further action is taken until the Java virtual machine has again determined that there is no longer any means by which this object can be accessed by any thread that has not yet died, including possible actions by other objects or classes which are ready to be finalized, at which point the object may be discarded.

The finalize method is never invoked more than once by a Java virtual machine for any given object.

Any exception thrown by the finalize method causes the finalization of this object to be halted, but is otherwise ignored.

Throws
Throwable