page.title=Bluetooth Low Energy
page.tags="wireless","bluetoothadapter","bluetoothdevice","BLE","BTLE"
@jd:body

<div id="qv-wrapper">
<div id="qv">

  <h2>In this document</h2>
  <ol>
    <li><a href="#terms">Key Terms and Concepts</a>
    <ol>
      <li><a href="#roles">Roles and Responsibilities</a></li>
    </ol>
    </li>
    <li><a href="#permissions">BLE Permissions</a></li>
    <li><a href="#setup">Setting Up BLE</a></li>
    <li><a href="#find">Finding BLE Devices</a></li>
    <li><a href="#connect">Connecting to a GATT Server</a></li>
    <li><a href="#read">Reading BLE Attributes</a></li>
    <li><a href="#notification">Receiving GATT Notifications</a></li>
    <li><a href="#close">Closing the Client App</a></li>
  </ol>

  <h2>Key classes</h2>
  <ol>
    <li>{@link android.bluetooth.BluetoothGatt}</li>
    <li>{@link android.bluetooth.BluetoothGattCallback}</li>
    <li>{@link android.bluetooth.BluetoothGattCharacteristic}</li>
    <li>{@link android.bluetooth.BluetoothGattService}</li>
  </ol>

  <h2>Related samples</h2>
  <ol>
    <li><a href="{@docRoot}tools/samples/index.html">Bluetooth LE sample</a></li>
  </ol>

   <h2>See Also</h2>
  <ol>
    <li><a href="http://developers.google.com/events/io/sessions/326240948">
    Best Practices for Bluetooth Development</a> (video)</li>

  </ol>

</div>
</div>

<a class="notice-developers-video" href="http://www.youtube.com/watch?v=vUbFB1Qypg8">
<div>
    <h3>Video</h3>
    <p>DevBytes: Bluetooth Low Energy API</p>
</div>
</a>




<p>
Android 4.3 (API Level 18) introduces built-in platform support for Bluetooth Low
Energy in the <em>central role</em> and provides APIs that apps can use to discover
devices, query for services, and read/write characteristics.
In contrast to
<a href="{@docRoot}guide/topics/connectivity/bluetooth.html">Classic Bluetooth</a>,
Bluetooth Low Energy (BLE) is designed to provide significantly lower power consumption.
This allows Android apps to communicate with BLE devices that have low power requirements,
such as proximity sensors, heart rate monitors, fitness devices, and so on.</p>

<h2 id="terms">Key Terms and Concepts</h2>
<p>Here is a summary of key BLE terms and concepts:</p>
<ul>
  <li><strong>Generic Attribute Profile (GATT)</strong>&mdash;The GATT profile
is a general specification for sending and receiving short pieces of data known
as "attributes" over a BLE link. All current Low Energy application profiles are
based on GATT.
    <ul>
      <li>The Bluetooth SIG defines many
<a href="https://www.bluetooth.org/en-us/specification/adopted-specifications">profiles</a>
for Low Energy devices. A profile is a specification for how a device works in a
particular application. Note that a device can implement more than one profile.
For example, a device could contain a heart rate monitor and a battery level
detector.</li>
    </ul>
  </li>
  <li><strong>Attribute Protocol (ATT)</strong>&mdash;GATT is built on top of
the Attribute Protocol (ATT). This is also referred to as GATT/ATT. ATT is
optimized to run on BLE devices. To this end, it uses as few bytes as possible.
Each attribute is uniquely identified by a Universally Unique Identifier (UUID),
which is a standardized 128-bit format for a string ID used to uniquely
identify information. The <em>attributes</em> transported by ATT are formatted
as <em>characteristics</em> and <em>services</em>. </li>

  <li><strong>Characteristic</strong>&mdash;A characteristic contains a single
value and 0-n descriptors that describe the characteristic's value. A
characteristic can be thought of as a type, analogous to a class. </li>
  <li><strong>Descriptor</strong>&mdash;Descriptors are defined attributes that
describe a characteristic value. For example, a descriptor might specify a
human-readable description, an acceptable range for a characteristic's value, or
a unit of measure that is specific to a characteristic's value.</li>

  <li><strong>Service</strong>&mdash;A service is a collection of
characteristics. For example, you could have a service called
&quot;Heart Rate Monitor&quot; that includes characteristics such as
&quot;heart rate measurement.&quot; You can find a list of existing GATT-based
profiles and services on
<a href="https://www.bluetooth.org/en-us/specification/adopted-specifications">
bluetooth.org</a>.</li>

</ul>

<h3 id="roles">Roles and Responsibilities</h3>

<p>Here are the roles and responsibilities that apply when
an Android device interacts with a BLE device:</p>

<ul>
  <li>Central vs. peripheral. This applies to the BLE connection itself. The
  device in the central role scans, looking for advertisement, and the device in
  the peripheral role makes the advertisement.</li>
  <li>GATT server vs. GATT client. This determines how two devices talk to each
other once they've established the connection.</li>
</ul>

<p>To understand the distinction, imagine that you have an Android phone and
an activity tracker that is a BLE device. The phone supports the
central role; the activity tracker supports the peripheral role (to
establish a BLE connection you need one of each&mdash;two things that only support
peripheral couldn't talk to each other, nor could two things that only support
central).</p>

<p>Once the phone and the activity tracker have established a connection, they
start transferring GATT metadata to one another. Depending on the kind of data they transfer,
one or the other might act as the server. For example, if the activity tracker
wants to report sensor data to the phone, it might make sense for the activity
tracker to act as the server. If the activity tracker wants to receive updates
from the phone, then it might make sense for the phone to act
as the server.</p>

<p>
In the example used in this document, the Android app (running on an Android
device) is the GATT client. The app gets data from the GATT server, which is a
BLE heart rate monitor that supports the
<a href="http://developer.bluetooth.org/TechnologyOverview/Pages/HRP.aspx">Heart
Rate Profile</a>.  But you could alternatively design
your Android app to play the GATT server
role. See {@link android.bluetooth.BluetoothGattServer} for more
information.</p>

<h2 id="permissions">BLE Permissions</h2>

<p>In order to use Bluetooth features in your application, you must declare
the Bluetooth permission {@link android.Manifest.permission#BLUETOOTH}.
You need this permission to perform any Bluetooth communication,
such as requesting a connection, accepting a connection, and transferring data.</p>

<p>If you want your app to initiate device discovery or manipulate Bluetooth
settings, you must also declare the {@link android.Manifest.permission#BLUETOOTH_ADMIN}
permission. <strong>Note:</strong> If you use the
{@link android.Manifest.permission#BLUETOOTH_ADMIN} permission, then you must
also have the {@link android.Manifest.permission#BLUETOOTH} permission.</p>

<p>Declare the Bluetooth permission(s) in your application manifest file. For
example:</p>

<pre>
&lt;uses-permission android:name=&quot;android.permission.BLUETOOTH&quot;/&gt;
&lt;uses-permission android:name=&quot;android.permission.BLUETOOTH_ADMIN&quot;/&gt;</pre>

<p>If you want to declare that your app is available to BLE-capable devices only,
include the following in your app's manifest:</p>

<pre>&lt;uses-feature android:name=&quot;android.hardware.bluetooth_le&quot; android:required=&quot;true&quot;/&gt;
</pre>

<p>However, if you want to make your app available to devices that don't support BLE,
you should still include this element in your app's manifest, but set {@code required="false"}. 
Then at run-time you can determine BLE availability by using
{@link android.content.pm.PackageManager#hasSystemFeature PackageManager.hasSystemFeature()}:

<pre>// Use this check to determine whether BLE is supported on the device. Then
// you can selectively disable BLE-related features.
if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
    Toast.makeText(this, R.string.ble_not_supported, Toast.LENGTH_SHORT).show();
    finish();
}</pre>

<h2 id="setup">Setting Up BLE</h2>

<p>Before your application can communicate over BLE, you need
to verify that BLE is supported on the device, and if so, ensure that it is enabled.
Note that this check is only necessary if {@code &lt;uses-feature.../&gt;}
is set to false.</p>

<p>If BLE is not supported, then you should gracefully disable any
BLE features. If BLE is supported, but disabled, then you can request that the
user enable Bluetooth without leaving your application. This setup is
accomplished in two steps, using the {@link android.bluetooth.BluetoothAdapter}.
</p>


<ol>
<li>Get the {@link android.bluetooth.BluetoothAdapter}
<p>The {@link android.bluetooth.BluetoothAdapter} is required for any and all
Bluetooth activity. The {@link android.bluetooth.BluetoothAdapter} represents
the device's own Bluetooth adapter (the Bluetooth radio). There's one Bluetooth
adapter for the entire system, and your application can interact with it using
this object. The snippet below shows how to get the adapter. Note that this approach
uses {@link android.content.Context#getSystemService getSystemService()} to return
an instance of {@link android.bluetooth.BluetoothManager}, which is then
used to get the adapter. Android 4.3 (API Level 18) introduces
{@link android.bluetooth.BluetoothManager}:</p>

<pre>// Initializes Bluetooth adapter.
final BluetoothManager bluetoothManager =
        (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = bluetoothManager.getAdapter();
</pre>
</li>

<li>Enable Bluetooth
<p>Next, you need to ensure that Bluetooth is enabled. Call {@link
android.bluetooth.BluetoothAdapter#isEnabled()} to check whether Bluetooth is
currently enabled. If this method returns false, then Bluetooth is disabled.
The following snippet checks whether Bluetooth is enabled. If it isn't, the
snippet displays an error prompting the user to go to Settings to enable
Bluetooth:</p>
<pre>private BluetoothAdapter mBluetoothAdapter;
...
// Ensures Bluetooth is available on the device and it is enabled. If not,
// displays a dialog requesting user permission to enable Bluetooth.
if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) {
    Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
    startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}
</li>
</ol>



<h2 id="find">Finding BLE Devices</h2>

<p>To find BLE devices, you use the
{@link android.bluetooth.BluetoothAdapter#startLeScan startLeScan()} method.
This method takes a  {@link android.bluetooth.BluetoothAdapter.LeScanCallback}
as a parameter. You must implement this callback, because that is how scan
results are returned. Because scanning is battery-intensive, you should observe
the following guidelines:</p>
<ul>
  <li>As soon as you find the desired device, stop scanning.</li>
  <li>Never scan on a loop, and set a time limit on your scan. A device that was
previously available may have moved out of range, and continuing to scan drains
the battery.</li>
</ul>

<p>The following snippet shows how to start and stop a scan:</p>

<pre>/**
 * Activity for scanning and displaying available BLE devices.
 */
public class DeviceScanActivity extends ListActivity {

    private BluetoothAdapter mBluetoothAdapter;
    private boolean mScanning;
    private Handler mHandler;

    // Stops scanning after 10 seconds.
    private static final long SCAN_PERIOD = 10000;
    ...
    private void scanLeDevice(final boolean enable) {
        if (enable) {
            // Stops scanning after a pre-defined scan period.
            mHandler.postDelayed(new Runnable() {
                &#64;Override
                public void run() {
                    mScanning = false;
                    mBluetoothAdapter.stopLeScan(mLeScanCallback);
                }
            }, SCAN_PERIOD);

            mScanning = true;
            mBluetoothAdapter.startLeScan(mLeScanCallback);
        } else {
            mScanning = false;
            mBluetoothAdapter.stopLeScan(mLeScanCallback);
        }
        ...
    }
...
}
</pre>

<p>If you want to scan for only specific types of peripherals, you can instead
call {@link android.bluetooth.BluetoothAdapter#startLeScan startLeScan(UUID[], BluetoothAdapter.LeScanCallback)},
providing an array of {@link java.util.UUID} objects that specify the GATT
services your app supports.</p>

<p>Here is an implementation of the
{@link android.bluetooth.BluetoothAdapter.LeScanCallback},
which is the interface used to deliver BLE scan results:</p>

<pre>
private LeDeviceListAdapter mLeDeviceListAdapter;
...
// Device scan callback.
private BluetoothAdapter.LeScanCallback mLeScanCallback =
        new BluetoothAdapter.LeScanCallback() {
    &#64;Override
    public void onLeScan(final BluetoothDevice device, int rssi,
            byte[] scanRecord) {
        runOnUiThread(new Runnable() {
           &#64;Override
           public void run() {
               mLeDeviceListAdapter.addDevice(device);
               mLeDeviceListAdapter.notifyDataSetChanged();
           }
       });
   }
};</pre>


<p class="note"><strong>Note:</strong> You can only scan for Bluetooth LE devices
<em>or</em> scan for Classic Bluetooth devices, as described in
<a href="{@docRoot}guide/topics/connectivity/bluetooth.html">Bluetooth</a>. You cannot
scan for both Bluetooth LE and classic devices at the same time.</p>

<h2 id="connect">Connecting to a GATT Server</h2>

<p>The first step in interacting with a BLE device is connecting to it&mdash;
more specifically, connecting to the GATT server on the device. To
connect to a GATT server on a BLE device, you use the
{@link android.bluetooth.BluetoothDevice#connectGatt connectGatt()} method.
This method takes three parameters: a {@link android.content.Context} object,
<code>autoConnect</code> (boolean indicating whether to automatically connect to
the BLE device as soon as it becomes available), and a reference to a
{@link android.bluetooth.BluetoothGattCallback}: </p>

<pre>mBluetoothGatt = device.connectGatt(this, false, mGattCallback);</pre>

<p>This connects to the GATT server hosted by the BLE device, and returns a
{@link android.bluetooth.BluetoothGatt} instance, which you can then use to
conduct GATT client operations. The caller (the Android app) is the GATT client.
The {@link android.bluetooth.BluetoothGattCallback} is used to deliver results
to the client, such as connection status, as well as any further GATT client
operations.</p>

<p>In this example, the BLE app provides an activity
(<code>DeviceControlActivity</code>) to connect,
display data, and display GATT services and characteristics
supported by the device.  Based on user input, this activity communicates with a
{@link android.app.Service} called {@code BluetoothLeService},
which interacts with the BLE device via the Android BLE API:</p>

<pre>
// A service that interacts with the BLE device via the Android BLE API.
public class BluetoothLeService extends Service {
    private final static String TAG = BluetoothLeService.class.getSimpleName();

    private BluetoothManager mBluetoothManager;
    private BluetoothAdapter mBluetoothAdapter;
    private String mBluetoothDeviceAddress;
    private BluetoothGatt mBluetoothGatt;
    private int mConnectionState = STATE_DISCONNECTED;

    private static final int STATE_DISCONNECTED = 0;
    private static final int STATE_CONNECTING = 1;
    private static final int STATE_CONNECTED = 2;

    public final static String ACTION_GATT_CONNECTED =
            "com.example.bluetooth.le.ACTION_GATT_CONNECTED";
    public final static String ACTION_GATT_DISCONNECTED =
            "com.example.bluetooth.le.ACTION_GATT_DISCONNECTED";
    public final static String ACTION_GATT_SERVICES_DISCOVERED =
            "com.example.bluetooth.le.ACTION_GATT_SERVICES_DISCOVERED";
    public final static String ACTION_DATA_AVAILABLE =
            "com.example.bluetooth.le.ACTION_DATA_AVAILABLE";
    public final static String EXTRA_DATA =
            "com.example.bluetooth.le.EXTRA_DATA";

    public final static UUID UUID_HEART_RATE_MEASUREMENT =
            UUID.fromString(SampleGattAttributes.HEART_RATE_MEASUREMENT);

    // Various callback methods defined by the BLE API.
    private final BluetoothGattCallback mGattCallback =
            new BluetoothGattCallback() {
        &#64;Override
        public void onConnectionStateChange(BluetoothGatt gatt, int status,
                int newState) {
            String intentAction;
            if (newState == BluetoothProfile.STATE_CONNECTED) {
                intentAction = ACTION_GATT_CONNECTED;
                mConnectionState = STATE_CONNECTED;
                broadcastUpdate(intentAction);
                Log.i(TAG, "Connected to GATT server.");
                Log.i(TAG, "Attempting to start service discovery:" +
                        mBluetoothGatt.discoverServices());

            } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
                intentAction = ACTION_GATT_DISCONNECTED;
                mConnectionState = STATE_DISCONNECTED;
                Log.i(TAG, "Disconnected from GATT server.");
                broadcastUpdate(intentAction);
            }
        }

        &#64;Override
        // New services discovered
        public void onServicesDiscovered(BluetoothGatt gatt, int status) {
            if (status == BluetoothGatt.GATT_SUCCESS) {
                broadcastUpdate(ACTION_GATT_SERVICES_DISCOVERED);
            } else {
                Log.w(TAG, "onServicesDiscovered received: " + status);
            }
        }

        &#64;Override
        // Result of a characteristic read operation
        public void onCharacteristicRead(BluetoothGatt gatt,
                BluetoothGattCharacteristic characteristic,
                int status) {
            if (status == BluetoothGatt.GATT_SUCCESS) {
                broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);
            }
        }
     ...
    };
...
}</pre>

<p>When a particular callback is triggered, it calls the appropriate
{@code broadcastUpdate()} helper method and passes it an action. Note that the data
parsing in this section is performed in accordance with the Bluetooth Heart Rate
Measurement
<a href="http://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.heart_rate_measurement.xml">
profile specifications</a>:</p>

<pre>private void broadcastUpdate(final String action) {
    final Intent intent = new Intent(action);
    sendBroadcast(intent);
}

private void broadcastUpdate(final String action,
                             final BluetoothGattCharacteristic characteristic) {
    final Intent intent = new Intent(action);

    // This is special handling for the Heart Rate Measurement profile. Data
    // parsing is carried out as per profile specifications.
    if (UUID_HEART_RATE_MEASUREMENT.equals(characteristic.getUuid())) {
        int flag = characteristic.getProperties();
        int format = -1;
        if ((flag &amp; 0x01) != 0) {
            format = BluetoothGattCharacteristic.FORMAT_UINT16;
            Log.d(TAG, &quot;Heart rate format UINT16.&quot;);
        } else {
            format = BluetoothGattCharacteristic.FORMAT_UINT8;
            Log.d(TAG, &quot;Heart rate format UINT8.&quot;);
        }
        final int heartRate = characteristic.getIntValue(format, 1);
        Log.d(TAG, String.format(&quot;Received heart rate: %d&quot;, heartRate));
        intent.putExtra(EXTRA_DATA, String.valueOf(heartRate));
    } else {
        // For all other profiles, writes the data formatted in HEX.
        final byte[] data = characteristic.getValue();
        if (data != null &amp;&amp; data.length &gt; 0) {
            final StringBuilder stringBuilder = new StringBuilder(data.length);
            for(byte byteChar : data)
                stringBuilder.append(String.format(&quot;%02X &quot;, byteChar));
            intent.putExtra(EXTRA_DATA, new String(data) + &quot;\n&quot; +
                    stringBuilder.toString());
        }
    }
    sendBroadcast(intent);
}</pre>



<p>Back in <code>DeviceControlActivity</code>, these events are handled by a
{@link android.content.BroadcastReceiver}:</p>

<pre>// Handles various events fired by the Service.
// ACTION_GATT_CONNECTED: connected to a GATT server.
// ACTION_GATT_DISCONNECTED: disconnected from a GATT server.
// ACTION_GATT_SERVICES_DISCOVERED: discovered GATT services.
// ACTION_DATA_AVAILABLE: received data from the device. This can be a
// result of read or notification operations.
private final BroadcastReceiver mGattUpdateReceiver = new BroadcastReceiver() {
    &#64;Override
    public void onReceive(Context context, Intent intent) {
        final String action = intent.getAction();
        if (BluetoothLeService.ACTION_GATT_CONNECTED.equals(action)) {
            mConnected = true;
            updateConnectionState(R.string.connected);
            invalidateOptionsMenu();
        } else if (BluetoothLeService.ACTION_GATT_DISCONNECTED.equals(action)) {
            mConnected = false;
            updateConnectionState(R.string.disconnected);
            invalidateOptionsMenu();
            clearUI();
        } else if (BluetoothLeService.
                ACTION_GATT_SERVICES_DISCOVERED.equals(action)) {
            // Show all the supported services and characteristics on the
            // user interface.
            displayGattServices(mBluetoothLeService.getSupportedGattServices());
        } else if (BluetoothLeService.ACTION_DATA_AVAILABLE.equals(action)) {
            displayData(intent.getStringExtra(BluetoothLeService.EXTRA_DATA));
        }
    }
};
</pre>

<h2 id="read">Reading BLE Attributes</h2>

<p>Once your Android app has connected to a GATT server and discovered services,
it can read and write attributes, where supported. For example, this snippet iterates
through the server's services and characteristics and displays them in the UI:</p>

<pre>
public class DeviceControlActivity extends Activity {
    ...
    // Demonstrates how to iterate through the supported GATT
    // Services/Characteristics.
    // In this sample, we populate the data structure that is bound to the
    // ExpandableListView on the UI.
    private void displayGattServices(List&lt;BluetoothGattService&gt; gattServices) {
        if (gattServices == null) return;
        String uuid = null;
        String unknownServiceString = getResources().
                getString(R.string.unknown_service);
        String unknownCharaString = getResources().
                getString(R.string.unknown_characteristic);
        ArrayList&lt;HashMap&lt;String, String&gt;&gt; gattServiceData =
                new ArrayList&lt;HashMap&lt;String, String&gt;&gt;();
        ArrayList&lt;ArrayList&lt;HashMap&lt;String, String&gt;&gt;&gt; gattCharacteristicData
                = new ArrayList&lt;ArrayList&lt;HashMap&lt;String, String&gt;&gt;&gt;();
        mGattCharacteristics =
                new ArrayList&lt;ArrayList&lt;BluetoothGattCharacteristic&gt;&gt;();

        // Loops through available GATT Services.
        for (BluetoothGattService gattService : gattServices) {
            HashMap&lt;String, String&gt; currentServiceData =
                    new HashMap&lt;String, String&gt;();
            uuid = gattService.getUuid().toString();
            currentServiceData.put(
                    LIST_NAME, SampleGattAttributes.
                            lookup(uuid, unknownServiceString));
            currentServiceData.put(LIST_UUID, uuid);
            gattServiceData.add(currentServiceData);

            ArrayList&lt;HashMap&lt;String, String&gt;&gt; gattCharacteristicGroupData =
                    new ArrayList&lt;HashMap&lt;String, String&gt;&gt;();
            List&lt;BluetoothGattCharacteristic&gt; gattCharacteristics =
                    gattService.getCharacteristics();
            ArrayList&lt;BluetoothGattCharacteristic&gt; charas =
                    new ArrayList&lt;BluetoothGattCharacteristic&gt;();
           // Loops through available Characteristics.
            for (BluetoothGattCharacteristic gattCharacteristic :
                    gattCharacteristics) {
                charas.add(gattCharacteristic);
                HashMap&lt;String, String&gt; currentCharaData =
                        new HashMap&lt;String, String&gt;();
                uuid = gattCharacteristic.getUuid().toString();
                currentCharaData.put(
                        LIST_NAME, SampleGattAttributes.lookup(uuid,
                                unknownCharaString));
                currentCharaData.put(LIST_UUID, uuid);
                gattCharacteristicGroupData.add(currentCharaData);
            }
            mGattCharacteristics.add(charas);
            gattCharacteristicData.add(gattCharacteristicGroupData);
         }
    ...
    }
...
}</pre>

<h2 id="notification">Receiving GATT Notifications</h2>

<p>It's common for BLE apps to ask to be notified when a particular
characteristic changes on the device. This snippet shows how to set a notification
for a characteristic, using the
{@link android.bluetooth.BluetoothGatt#setCharacteristicNotification setCharacteristicNotification()}
method:</p>

<pre>
private BluetoothGatt mBluetoothGatt;
BluetoothGattCharacteristic characteristic;
boolean enabled;
...
mBluetoothGatt.setCharacteristicNotification(characteristic, enabled);
...
BluetoothGattDescriptor descriptor = characteristic.getDescriptor(
        UUID.fromString(SampleGattAttributes.CLIENT_CHARACTERISTIC_CONFIG));
descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
mBluetoothGatt.writeDescriptor(descriptor);</pre>

<p>Once notifications are enabled for a characteristic,
an {@link android.bluetooth.BluetoothGattCallback#onCharacteristicChanged onCharacteristicChanged()}
callback is triggered if the characteristic changes on the remote device:</p>

<pre>&#64;Override
// Characteristic notification
public void onCharacteristicChanged(BluetoothGatt gatt,
        BluetoothGattCharacteristic characteristic) {
    broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);
}
</pre>

<h2 id="close">Closing the Client App</h2>

<p>Once your app has finished using a BLE device, it should call
{@link android.bluetooth.BluetoothGatt#close close()}
so the system can release resources appropriately:</p>

<pre>public void close() {
    if (mBluetoothGatt == null) {
        return;
    }
    mBluetoothGatt.close();
    mBluetoothGatt = null;
}</pre>
