BluetoothDevice.java revision ddf7e4756c31d0ed90802f98abeaa79df6d16b2a
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 2bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * Copyright (C) 2009 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.bluetooth; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pellyimport android.annotation.SdkConstant; 20005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pellyimport android.annotation.SdkConstant.SdkConstantType; 21ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xieimport android.content.Context; 22bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pellyimport android.os.IBinder; 23bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pellyimport android.os.Parcel; 24bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pellyimport android.os.Parcelable; 25aef439e6f825c0cb99a2ac08c8207f48b7a9fe10Nick Pellyimport android.os.ParcelUuid; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException; 27bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pellyimport android.os.ServiceManager; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pellyimport java.io.IOException; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.UnsupportedEncodingException; 321caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganeshimport java.util.UUID; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 359fab0aef19a4633d2e4670564e5d7ae9e52fe11fScott Main * Represents a remote Bluetooth device. A {@link BluetoothDevice} lets you 36f51eadaf1f83abfe16a609a4ded6d789494689b2Jake Hamby * create a connection with the respective device or query information about 379fab0aef19a4633d2e4670564e5d7ae9e52fe11fScott Main * it, such as the name, address, class, and bonding state. 3845e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * 3945e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * <p>This class is really just a thin wrapper for a Bluetooth hardware 4045e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * address. Objects of this class are immutable. Operations on this class 4145e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * are performed on the remote Bluetooth hardware address, using the 4245e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * {@link BluetoothAdapter} that was used to create this {@link 4345e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * BluetoothDevice}. 449fab0aef19a4633d2e4670564e5d7ae9e52fe11fScott Main * 459fab0aef19a4633d2e4670564e5d7ae9e52fe11fScott Main * <p>To get a {@link BluetoothDevice}, use 469fab0aef19a4633d2e4670564e5d7ae9e52fe11fScott Main * {@link BluetoothAdapter#getRemoteDevice(String) 479fab0aef19a4633d2e4670564e5d7ae9e52fe11fScott Main * BluetoothAdapter.getRemoteDevice(String)} to create one representing a device 489fab0aef19a4633d2e4670564e5d7ae9e52fe11fScott Main * of a known MAC address (which you can get through device discovery with 499fab0aef19a4633d2e4670564e5d7ae9e52fe11fScott Main * {@link BluetoothAdapter}) or get one from the set of bonded devices 509fab0aef19a4633d2e4670564e5d7ae9e52fe11fScott Main * returned by {@link BluetoothAdapter#getBondedDevices() 519fab0aef19a4633d2e4670564e5d7ae9e52fe11fScott Main * BluetoothAdapter.getBondedDevices()}. You can then open a 52f51eadaf1f83abfe16a609a4ded6d789494689b2Jake Hamby * {@link BluetoothSocket} for communication with the remote device, using 539fab0aef19a4633d2e4670564e5d7ae9e52fe11fScott Main * {@link #createRfcommSocketToServiceRecord(UUID)}. 549fab0aef19a4633d2e4670564e5d7ae9e52fe11fScott Main * 559fab0aef19a4633d2e4670564e5d7ae9e52fe11fScott Main * <p class="note"><strong>Note:</strong> 569fab0aef19a4633d2e4670564e5d7ae9e52fe11fScott Main * Requires the {@link android.Manifest.permission#BLUETOOTH} permission. 579fab0aef19a4633d2e4670564e5d7ae9e52fe11fScott Main * 583aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <div class="special reference"> 593aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <h3>Developer Guides</h3> 603aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <p>For more information about using Bluetooth, read the 613aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <a href="{@docRoot}guide/topics/wireless/bluetooth.html">Bluetooth</a> developer guide.</p> 623aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * </div> 633aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * 649fab0aef19a4633d2e4670564e5d7ae9e52fe11fScott Main * {@see BluetoothAdapter} 659fab0aef19a4633d2e4670564e5d7ae9e52fe11fScott Main * {@see BluetoothSocket} 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 67bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pellypublic final class BluetoothDevice implements Parcelable { 68bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly private static final String TAG = "BluetoothDevice"; 697077272d8feed2f0172520d4fd3b4524e18d5ec1Ravi Nagarajan private static final boolean DBG = false; 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 71b24e11baac589fe16426f2d243b460ab84991c7bNick Pelly /** 72b24e11baac589fe16426f2d243b460ab84991c7bNick Pelly * Sentinel error value for this class. Guaranteed to not equal any other 73b24e11baac589fe16426f2d243b460ab84991c7bNick Pelly * integer constant in this class. Provided as a convenience for functions 74b24e11baac589fe16426f2d243b460ab84991c7bNick Pelly * that require a sentinel error value, for example: 75005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p><code>Intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, 76005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * BluetoothDevice.ERROR)</code> 77005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly */ 78005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly public static final int ERROR = Integer.MIN_VALUE; 79005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly 80005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly /** 81005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * Broadcast Action: Remote device discovered. 82005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Sent when a remote device is found during discovery. 83005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Always contains the extra fields {@link #EXTRA_DEVICE} and {@link 84005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * #EXTRA_CLASS}. Can contain the extra fields {@link #EXTRA_NAME} and/or 85005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * {@link #EXTRA_RSSI} if they are available. 86005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Requires {@link android.Manifest.permission#BLUETOOTH} to receive. 87005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly */ 88005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly // TODO: Change API to not broadcast RSSI if not available (incoming connection) 89005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 90005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly public static final String ACTION_FOUND = 91005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly "android.bluetooth.device.action.FOUND"; 92005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly 93005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly /** 94005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * Broadcast Action: Remote device disappeared. 95005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Sent when a remote device that was found in the last discovery is not 96005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * found in the current discovery. 97005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Always contains the extra field {@link #EXTRA_DEVICE}. 98005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Requires {@link android.Manifest.permission#BLUETOOTH} to receive. 99005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * @hide 100005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly */ 101005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 102005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly public static final String ACTION_DISAPPEARED = 103005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly "android.bluetooth.device.action.DISAPPEARED"; 104005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly 105005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly /** 106005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * Broadcast Action: Bluetooth class of a remote device has changed. 107005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Always contains the extra fields {@link #EXTRA_DEVICE} and {@link 108005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * #EXTRA_CLASS}. 109005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Requires {@link android.Manifest.permission#BLUETOOTH} to receive. 110005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * @see {@link BluetoothClass} 111005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly */ 112005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 113005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly public static final String ACTION_CLASS_CHANGED = 114005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly "android.bluetooth.device.action.CLASS_CHANGED"; 115005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly 116005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly /** 117005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * Broadcast Action: Indicates a low level (ACL) connection has been 118005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * established with a remote device. 119005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Always contains the extra field {@link #EXTRA_DEVICE}. 120005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>ACL connections are managed automatically by the Android Bluetooth 121005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * stack. 122005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Requires {@link android.Manifest.permission#BLUETOOTH} to receive. 123005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly */ 124005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 125005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly public static final String ACTION_ACL_CONNECTED = 126005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly "android.bluetooth.device.action.ACL_CONNECTED"; 127005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly 128005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly /** 129005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * Broadcast Action: Indicates that a low level (ACL) disconnection has 130005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * been requested for a remote device, and it will soon be disconnected. 131005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>This is useful for graceful disconnection. Applications should use 132005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * this intent as a hint to immediately terminate higher level connections 133005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * (RFCOMM, L2CAP, or profile connections) to the remote device. 134005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Always contains the extra field {@link #EXTRA_DEVICE}. 135005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Requires {@link android.Manifest.permission#BLUETOOTH} to receive. 136005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly */ 137005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 138005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly public static final String ACTION_ACL_DISCONNECT_REQUESTED = 139005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly "android.bluetooth.device.action.ACL_DISCONNECT_REQUESTED"; 140005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly 141005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly /** 142005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * Broadcast Action: Indicates a low level (ACL) disconnection from a 143005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * remote device. 144005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Always contains the extra field {@link #EXTRA_DEVICE}. 145005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>ACL connections are managed automatically by the Android Bluetooth 146005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * stack. 147005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Requires {@link android.Manifest.permission#BLUETOOTH} to receive. 148005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly */ 149005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 150005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly public static final String ACTION_ACL_DISCONNECTED = 151005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly "android.bluetooth.device.action.ACL_DISCONNECTED"; 152005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly 153005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly /** 154005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * Broadcast Action: Indicates the friendly name of a remote device has 155005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * been retrieved for the first time, or changed since the last retrieval. 156005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Always contains the extra fields {@link #EXTRA_DEVICE} and {@link 157005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * #EXTRA_NAME}. 158005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Requires {@link android.Manifest.permission#BLUETOOTH} to receive. 159005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly */ 160005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 161005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly public static final String ACTION_NAME_CHANGED = 162005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly "android.bluetooth.device.action.NAME_CHANGED"; 163005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly 164005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly /** 1655bbd4b4f5fc19302fa017ad6afee6eb2d489d91aJeff Brown * Broadcast Action: Indicates the alias of a remote device has been 1665bbd4b4f5fc19302fa017ad6afee6eb2d489d91aJeff Brown * changed. 1675bbd4b4f5fc19302fa017ad6afee6eb2d489d91aJeff Brown * <p>Always contains the extra field {@link #EXTRA_DEVICE}. 1685bbd4b4f5fc19302fa017ad6afee6eb2d489d91aJeff Brown * <p>Requires {@link android.Manifest.permission#BLUETOOTH} to receive. 1695bbd4b4f5fc19302fa017ad6afee6eb2d489d91aJeff Brown * 1705bbd4b4f5fc19302fa017ad6afee6eb2d489d91aJeff Brown * @hide 1715bbd4b4f5fc19302fa017ad6afee6eb2d489d91aJeff Brown */ 1725bbd4b4f5fc19302fa017ad6afee6eb2d489d91aJeff Brown @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 1735bbd4b4f5fc19302fa017ad6afee6eb2d489d91aJeff Brown public static final String ACTION_ALIAS_CHANGED = 1745bbd4b4f5fc19302fa017ad6afee6eb2d489d91aJeff Brown "android.bluetooth.device.action.ALIAS_CHANGED"; 1755bbd4b4f5fc19302fa017ad6afee6eb2d489d91aJeff Brown 1765bbd4b4f5fc19302fa017ad6afee6eb2d489d91aJeff Brown /** 177005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * Broadcast Action: Indicates a change in the bond state of a remote 178005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * device. For example, if a device is bonded (paired). 179005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Always contains the extra fields {@link #EXTRA_DEVICE}, {@link 180005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * #EXTRA_BOND_STATE} and {@link #EXTRA_PREVIOUS_BOND_STATE}. 181005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Requires {@link android.Manifest.permission#BLUETOOTH} to receive. 182005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly */ 183005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly // Note: When EXTRA_BOND_STATE is BOND_NONE then this will also 184005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly // contain a hidden extra field EXTRA_REASON with the result code. 185005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 186005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly public static final String ACTION_BOND_STATE_CHANGED = 187005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly "android.bluetooth.device.action.BOND_STATE_CHANGED"; 188005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly 189005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly /** 190005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * Used as a Parcelable {@link BluetoothDevice} extra field in every intent 191005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * broadcast by this class. It contains the {@link BluetoothDevice} that 192005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * the intent applies to. 193005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly */ 194005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly public static final String EXTRA_DEVICE = "android.bluetooth.device.extra.DEVICE"; 195005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly 196005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly /** 197005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * Used as a String extra field in {@link #ACTION_NAME_CHANGED} and {@link 198005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * #ACTION_FOUND} intents. It contains the friendly Bluetooth name. 199005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly */ 200005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly public static final String EXTRA_NAME = "android.bluetooth.device.extra.NAME"; 201005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly 202005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly /** 203005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * Used as an optional short extra field in {@link #ACTION_FOUND} intents. 204005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * Contains the RSSI value of the remote device as reported by the 205005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * Bluetooth hardware. 206005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly */ 207005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly public static final String EXTRA_RSSI = "android.bluetooth.device.extra.RSSI"; 208005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly 209005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly /** 210f76a50ce8fdc6aea22cabc77b2977a1a15a79630Ken Wakasa * Used as a Parcelable {@link BluetoothClass} extra field in {@link 211005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * #ACTION_FOUND} and {@link #ACTION_CLASS_CHANGED} intents. 212005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly */ 213005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly public static final String EXTRA_CLASS = "android.bluetooth.device.extra.CLASS"; 214005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly 215005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly /** 216005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * Used as an int extra field in {@link #ACTION_BOND_STATE_CHANGED} intents. 217005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * Contains the bond state of the remote device. 218005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Possible values are: 219005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * {@link #BOND_NONE}, 220005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * {@link #BOND_BONDING}, 221005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * {@link #BOND_BONDED}. 222005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly */ 223005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly public static final String EXTRA_BOND_STATE = "android.bluetooth.device.extra.BOND_STATE"; 224005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly /** 225005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * Used as an int extra field in {@link #ACTION_BOND_STATE_CHANGED} intents. 226005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * Contains the previous bond state of the remote device. 227005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Possible values are: 228005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * {@link #BOND_NONE}, 229005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * {@link #BOND_BONDING}, 230005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * {@link #BOND_BONDED}. 231005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly */ 232005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly public static final String EXTRA_PREVIOUS_BOND_STATE = 233005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly "android.bluetooth.device.extra.PREVIOUS_BOND_STATE"; 234005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly /** 235005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * Indicates the remote device is not bonded (paired). 236005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>There is no shared link key with the remote device, so communication 237005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * (if it is allowed at all) will be unauthenticated and unencrypted. 238005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly */ 239005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly public static final int BOND_NONE = 10; 240005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly /** 241005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * Indicates bonding (pairing) is in progress with the remote device. 242005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly */ 243005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly public static final int BOND_BONDING = 11; 244005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly /** 245005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * Indicates the remote device is bonded (paired). 246005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>A shared link keys exists locally for the remote device, so 247005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * communication can be authenticated and encrypted. 248005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p><i>Being bonded (paired) with a remote device does not necessarily 249f51eadaf1f83abfe16a609a4ded6d789494689b2Jake Hamby * mean the device is currently connected. It just means that the pending 250f51eadaf1f83abfe16a609a4ded6d789494689b2Jake Hamby * procedure was completed at some earlier time, and the link key is still 251005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * stored locally, ready to use on the next connection. 252005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * </i> 253005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly */ 254005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly public static final int BOND_BONDED = 12; 255005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly 256005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly /** @hide */ 257005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly public static final String EXTRA_REASON = "android.bluetooth.device.extra.REASON"; 258005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly /** @hide */ 259005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly public static final String EXTRA_PAIRING_VARIANT = 260005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly "android.bluetooth.device.extra.PAIRING_VARIANT"; 261005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly /** @hide */ 262c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh public static final String EXTRA_PAIRING_KEY = "android.bluetooth.device.extra.PAIRING_KEY"; 263005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly 264005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly /** 2651caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh * Broadcast Action: This intent is used to broadcast the {@link UUID} 266aef439e6f825c0cb99a2ac08c8207f48b7a9fe10Nick Pelly * wrapped as a {@link android.os.ParcelUuid} of the remote device after it 267aef439e6f825c0cb99a2ac08c8207f48b7a9fe10Nick Pelly * has been fetched. This intent is sent only when the UUIDs of the remote 268aef439e6f825c0cb99a2ac08c8207f48b7a9fe10Nick Pelly * device are requested to be fetched using Service Discovery Protocol 2691caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh * <p> Always contains the extra field {@link #EXTRA_DEVICE} 270ad2321027e9731711544b43378bd7b2f01890774Matthew Xie * <p> Always contains the extra field {@link #EXTRA_UUID} 2711caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh * <p>Requires {@link android.Manifest.permission#BLUETOOTH} to receive. 2721caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh */ 2731caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 2741caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh public static final String ACTION_UUID = 275ad2321027e9731711544b43378bd7b2f01890774Matthew Xie "android.bluetooth.device.action.UUID"; 2761caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh 2771caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh /** 278005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * Broadcast Action: Indicates a failure to retrieve the name of a remote 279005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * device. 280005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Always contains the extra field {@link #EXTRA_DEVICE}. 281005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Requires {@link android.Manifest.permission#BLUETOOTH} to receive. 282005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * @hide 283005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly */ 284005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly //TODO: is this actually useful? 285005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 286005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly public static final String ACTION_NAME_FAILED = 287005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly "android.bluetooth.device.action.NAME_FAILED"; 288005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly 289005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly /** @hide */ 290005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 291005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly public static final String ACTION_PAIRING_REQUEST = 292005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly "android.bluetooth.device.action.PAIRING_REQUEST"; 293005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly /** @hide */ 294005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 295005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly public static final String ACTION_PAIRING_CANCEL = 296005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly "android.bluetooth.device.action.PAIRING_CANCEL"; 297a4433af5ac677be7c1f63447c0cd78829bdee159Yue Lixin 298a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie /** @hide */ 299a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 300a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie public static final String ACTION_CONNECTION_ACCESS_REQUEST = 301a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie "android.bluetooth.device.action.CONNECTION_ACCESS_REQUEST"; 302a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie 303a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie /** @hide */ 304a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 305a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie public static final String ACTION_CONNECTION_ACCESS_REPLY = 306a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie "android.bluetooth.device.action.CONNECTION_ACCESS_REPLY"; 307a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie 308a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie /** @hide */ 309a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 310a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie public static final String ACTION_CONNECTION_ACCESS_CANCEL = 311a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie "android.bluetooth.device.action.CONNECTION_ACCESS_CANCEL"; 312a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie 313a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie /** 314a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie * Used as an extra field in {@link #ACTION_CONNECTION_ACCESS_REQUEST} intent. 315a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie * @hide 316a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie */ 317a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie public static final String EXTRA_ACCESS_REQUEST_TYPE = 318a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie "android.bluetooth.device.extra.ACCESS_REQUEST_TYPE"; 319a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie 320a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie /**@hide*/ 321a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie public static final int REQUEST_TYPE_PROFILE_CONNECTION = 1; 322a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie 323a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie /**@hide*/ 324a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie public static final int REQUEST_TYPE_PHONEBOOK_ACCESS = 2; 325a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie 326a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie /** 327a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie * Used as an extra field in {@link #ACTION_CONNECTION_ACCESS_REQUEST} intents, 328a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie * Contains package name to return reply intent to. 329a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie * @hide 330a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie */ 331a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie public static final String EXTRA_PACKAGE_NAME = "android.bluetooth.device.extra.PACKAGE_NAME"; 332a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie 333a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie /** 334a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie * Used as an extra field in {@link #ACTION_CONNECTION_ACCESS_REQUEST} intents, 335a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie * Contains class name to return reply intent to. 336a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie * @hide 337a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie */ 338a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie public static final String EXTRA_CLASS_NAME = "android.bluetooth.device.extra.CLASS_NAME"; 339a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie 340a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie /** 341a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie * Used as an extra field in {@link #ACTION_CONNECTION_ACCESS_REPLY} intent. 342a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie * @hide 343a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie */ 344a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie public static final String EXTRA_CONNECTION_ACCESS_RESULT = 345a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie "android.bluetooth.device.extra.CONNECTION_ACCESS_RESULT"; 346a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie 347a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie /**@hide*/ 348a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie public static final int CONNECTION_ACCESS_YES = 1; 349a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie 350a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie /**@hide*/ 351a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie public static final int CONNECTION_ACCESS_NO = 2; 352a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie 353a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie /** 354a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie * Used as an extra field in {@link #ACTION_CONNECTION_ACCESS_REPLY} intents, 355a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie * Contains boolean to indicate if the allowed response is once-for-all so that 356a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie * next request will be granted without asking user again. 357a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie * @hide 358a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie */ 359a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie public static final String EXTRA_ALWAYS_ALLOWED = 360a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie "android.bluetooth.device.extra.ALWAYS_ALLOWED"; 361a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie 362c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh /** 363c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * A bond attempt succeeded 364c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * @hide 365c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh */ 366b24e11baac589fe16426f2d243b460ab84991c7bNick Pelly public static final int BOND_SUCCESS = 0; 367c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh 368c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh /** 369c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * A bond attempt failed because pins did not match, or remote device did 37032d8571f509c392dca732c243e9b2138c15daecfJaikumar Ganesh * not respond to pin request in time 371c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * @hide 372c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh */ 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int UNBOND_REASON_AUTH_FAILED = 1; 374c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh 375c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh /** 376c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * A bond attempt failed because the other side explicitly rejected 37745e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * bonding 378c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * @hide 379c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh */ 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int UNBOND_REASON_AUTH_REJECTED = 2; 381c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh 382c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh /** 383c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * A bond attempt failed because we canceled the bonding process 384c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * @hide 385c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh */ 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int UNBOND_REASON_AUTH_CANCELED = 3; 387c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh 388c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh /** 389c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * A bond attempt failed because we could not contact the remote device 390c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * @hide 391c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh */ 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int UNBOND_REASON_REMOTE_DEVICE_DOWN = 4; 393c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh 394c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh /** 395c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * A bond attempt failed because a discovery is in progress 396c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * @hide 397c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh */ 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int UNBOND_REASON_DISCOVERY_IN_PROGRESS = 5; 399c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh 400c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh /** 401c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * A bond attempt failed because of authentication timeout 402c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * @hide 403c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh */ 40432d8571f509c392dca732c243e9b2138c15daecfJaikumar Ganesh public static final int UNBOND_REASON_AUTH_TIMEOUT = 6; 405c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh 406c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh /** 407c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * A bond attempt failed because of repeated attempts 408c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * @hide 409c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh */ 41032d8571f509c392dca732c243e9b2138c15daecfJaikumar Ganesh public static final int UNBOND_REASON_REPEATED_ATTEMPTS = 7; 411c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh 412c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh /** 413c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * A bond attempt failed because we received an Authentication Cancel 414c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * by remote end 415c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * @hide 416c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh */ 417e5d93b7ed983f98855555d560faf060836f1a52fJaikumar Ganesh public static final int UNBOND_REASON_REMOTE_AUTH_CANCELED = 8; 418c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh 419c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh /** 420c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * An existing bond was explicitly revoked 421c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * @hide 422c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh */ 423e5d93b7ed983f98855555d560faf060836f1a52fJaikumar Ganesh public static final int UNBOND_REASON_REMOVED = 9; 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 425c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh /** 426c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * The user will be prompted to enter a pin 427c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * @hide 428c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh */ 429b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh public static final int PAIRING_VARIANT_PIN = 0; 430c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh 431c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh /** 432c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * The user will be prompted to enter a passkey 433c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * @hide 434c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh */ 435b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh public static final int PAIRING_VARIANT_PASSKEY = 1; 436c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh 437c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh /** 438c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * The user will be prompted to confirm the passkey displayed on the screen 439c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * @hide 440c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh */ 44132d8571f509c392dca732c243e9b2138c15daecfJaikumar Ganesh public static final int PAIRING_VARIANT_PASSKEY_CONFIRMATION = 2; 442c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh 443c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh /** 444c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * The user will be prompted to accept or deny the incoming pairing request 445c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * @hide 446c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh */ 44732d8571f509c392dca732c243e9b2138c15daecfJaikumar Ganesh public static final int PAIRING_VARIANT_CONSENT = 3; 448c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh 449c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh /** 450c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * The user will be prompted to enter the passkey displayed on remote device 451c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * This is used for Bluetooth 2.1 pairing. 452c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * @hide 453c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh */ 45432d8571f509c392dca732c243e9b2138c15daecfJaikumar Ganesh public static final int PAIRING_VARIANT_DISPLAY_PASSKEY = 4; 455c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh 456c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh /** 457c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * The user will be prompted to enter the PIN displayed on remote device. 458c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * This is used for Bluetooth 2.0 pairing. 459c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * @hide 460c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh */ 461c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh public static final int PAIRING_VARIANT_DISPLAY_PIN = 5; 462c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh 463c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh /** 464c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * The user will be prompted to accept or deny the OOB pairing request 465c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * @hide 466c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh */ 467c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh public static final int PAIRING_VARIANT_OOB_CONSENT = 6; 468c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh 4691caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh /** 4701caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh * Used as an extra field in {@link #ACTION_UUID} intents, 471aef439e6f825c0cb99a2ac08c8207f48b7a9fe10Nick Pelly * Contains the {@link android.os.ParcelUuid}s of the remote device which 472aef439e6f825c0cb99a2ac08c8207f48b7a9fe10Nick Pelly * is a parcelable version of {@link UUID}. 4731caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh */ 4741caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh public static final String EXTRA_UUID = "android.bluetooth.device.extra.UUID"; 4751caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh 47616fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly /** 47716fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly * Lazy initialization. Guaranteed final after first object constructed, or 47816fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly * getService() called. 47916fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly * TODO: Unify implementation of sService amongst BluetoothFoo API's 48016fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly */ 48116fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly private static IBluetooth sService; 482bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly 483bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly private final String mAddress; 484d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh 48516fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly /*package*/ static IBluetooth getService() { 486bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly synchronized (BluetoothDevice.class) { 487bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly if (sService == null) { 4880f42037eb7b5118015c2caca635538324ccf0ccffredc BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); 489903ac6f399dcd4f574bf388daa7b5f5907d448d3fredc sService = adapter.getBluetoothService(mStateChangeCallback); 490bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly } 491bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly } 49216fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly return sService; 49316fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly } 494bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly 495903ac6f399dcd4f574bf388daa7b5f5907d448d3fredc static IBluetoothManagerCallback mStateChangeCallback = new IBluetoothManagerCallback.Stub() { 496903ac6f399dcd4f574bf388daa7b5f5907d448d3fredc 497903ac6f399dcd4f574bf388daa7b5f5907d448d3fredc public void onBluetoothServiceUp(IBluetooth bluetoothService) 498903ac6f399dcd4f574bf388daa7b5f5907d448d3fredc throws RemoteException { 499903ac6f399dcd4f574bf388daa7b5f5907d448d3fredc synchronized (BluetoothDevice.class) { 500903ac6f399dcd4f574bf388daa7b5f5907d448d3fredc sService = bluetoothService; 501903ac6f399dcd4f574bf388daa7b5f5907d448d3fredc } 502903ac6f399dcd4f574bf388daa7b5f5907d448d3fredc } 503903ac6f399dcd4f574bf388daa7b5f5907d448d3fredc 504903ac6f399dcd4f574bf388daa7b5f5907d448d3fredc public void onBluetoothServiceDown() 505903ac6f399dcd4f574bf388daa7b5f5907d448d3fredc throws RemoteException { 506903ac6f399dcd4f574bf388daa7b5f5907d448d3fredc synchronized (BluetoothDevice.class) { 507903ac6f399dcd4f574bf388daa7b5f5907d448d3fredc sService = null; 508903ac6f399dcd4f574bf388daa7b5f5907d448d3fredc } 509903ac6f399dcd4f574bf388daa7b5f5907d448d3fredc } 510903ac6f399dcd4f574bf388daa7b5f5907d448d3fredc }; 51116fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly /** 51216fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly * Create a new BluetoothDevice 51316fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly * Bluetooth MAC address must be upper case, such as "00:11:22:33:AA:BB", 51416fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly * and is validated in this constructor. 51516fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly * @param address valid Bluetooth MAC address 51616fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly * @throws RuntimeException Bluetooth is not available on this platform 51716fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly * @throws IllegalArgumentException address is invalid 51816fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly * @hide 51916fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly */ 52016fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly /*package*/ BluetoothDevice(String address) { 52116fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly getService(); // ensures sService is initialized 522005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly if (!BluetoothAdapter.checkBluetoothAddress(address)) { 523bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly throw new IllegalArgumentException(address + " is not a valid Bluetooth address"); 524bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly } 525bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly 526bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly mAddress = address; 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 529bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly @Override 530bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public boolean equals(Object o) { 531bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly if (o instanceof BluetoothDevice) { 532bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return mAddress.equals(((BluetoothDevice)o).getAddress()); 533bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly } 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 537bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly @Override 538bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public int hashCode() { 539bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return mAddress.hashCode(); 540105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 541105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 54245e2704ff512d41e22af2801d76e96955469ce8dNick Pelly /** 54345e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * Returns a string representation of this BluetoothDevice. 54445e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * <p>Currently this is the Bluetooth hardware address, for example 54545e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * "00:11:22:AA:BB:CC". However, you should always use {@link #getAddress} 54645e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * if you explicitly require the Bluetooth hardware address in case the 54745e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * {@link #toString} representation changes in the future. 54845e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * @return string representation of this BluetoothDevice 54945e2704ff512d41e22af2801d76e96955469ce8dNick Pelly */ 550bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly @Override 551bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public String toString() { 552bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return mAddress; 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 555bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public int describeContents() { 556bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return 0; 557bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly } 558bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly 559bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public static final Parcelable.Creator<BluetoothDevice> CREATOR = 560bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly new Parcelable.Creator<BluetoothDevice>() { 561bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public BluetoothDevice createFromParcel(Parcel in) { 562bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return new BluetoothDevice(in.readString()); 563bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly } 564bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public BluetoothDevice[] newArray(int size) { 565bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return new BluetoothDevice[size]; 566bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly } 567bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly }; 568bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly 569bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public void writeToParcel(Parcel out, int flags) { 570bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly out.writeString(mAddress); 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 57345e2704ff512d41e22af2801d76e96955469ce8dNick Pelly /** 57445e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * Returns the hardware address of this BluetoothDevice. 57545e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * <p> For example, "00:11:22:AA:BB:CC". 57645e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * @return Bluetooth hardware address as string 57745e2704ff512d41e22af2801d76e96955469ce8dNick Pelly */ 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getAddress() { 5790f42037eb7b5118015c2caca635538324ccf0ccffredc if (DBG) Log.d(TAG, "mAddress: " + mAddress); 580bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return mAddress; 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 58445e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * Get the friendly Bluetooth name of the remote device. 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 58645e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * <p>The local adapter will automatically retrieve remote names when 58745e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * performing a device scan, and will cache them. This method just returns 58845e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * the name for this device from the cache. 589de893f550301a60274e87aa8168225e7a7a42184Nick Pelly * <p>Requires {@link android.Manifest.permission#BLUETOOTH} 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the Bluetooth name, or null if there was a problem. 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getName() { 5940f42037eb7b5118015c2caca635538324ccf0ccffredc if (sService == null) { 5950f42037eb7b5118015c2caca635538324ccf0ccffredc Log.e(TAG, "BT not enabled. Cannot get Remote Device name"); 5960f42037eb7b5118015c2caca635538324ccf0ccffredc return null; 5970f42037eb7b5118015c2caca635538324ccf0ccffredc } 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 599e4caddbb7a3b39fd6a1ccf107c7dbf09bc8978e8Jaikumar Ganesh return sService.getRemoteName(this); 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) {Log.e(TAG, "", e);} 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 605269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie * Get the Bluetooth alias of the remote device. 606269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie * <p>Alias is the locally modified name of a remote device. 607269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie * 608269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie * @return the Bluetooth alias, or null if no alias or there was a problem 609269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie * @hide 610269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie */ 611269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie public String getAlias() { 6120f42037eb7b5118015c2caca635538324ccf0ccffredc if (sService == null) { 6130f42037eb7b5118015c2caca635538324ccf0ccffredc Log.e(TAG, "BT not enabled. Cannot get Remote Device Alias"); 6140f42037eb7b5118015c2caca635538324ccf0ccffredc return null; 6150f42037eb7b5118015c2caca635538324ccf0ccffredc } 616269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie try { 617e4caddbb7a3b39fd6a1ccf107c7dbf09bc8978e8Jaikumar Ganesh return sService.getRemoteAlias(this); 618269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie } catch (RemoteException e) {Log.e(TAG, "", e);} 619269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie return null; 620269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie } 621269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie 622269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie /** 623269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie * Set the Bluetooth alias of the remote device. 624269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie * <p>Alias is the locally modified name of a remote device. 625269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie * <p>This methoid overwrites the alias. The changed 626269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie * alias is saved in the local storage so that the change 627269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie * is preserved over power cycle. 628269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie * 629269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie * @return true on success, false on error 630269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie * @hide 631269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie */ 632269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie public boolean setAlias(String alias) { 6330f42037eb7b5118015c2caca635538324ccf0ccffredc if (sService == null) { 6340f42037eb7b5118015c2caca635538324ccf0ccffredc Log.e(TAG, "BT not enabled. Cannot set Remote Device name"); 6350f42037eb7b5118015c2caca635538324ccf0ccffredc return false; 6360f42037eb7b5118015c2caca635538324ccf0ccffredc } 637269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie try { 638e4caddbb7a3b39fd6a1ccf107c7dbf09bc8978e8Jaikumar Ganesh return sService.setRemoteAlias(this, alias); 639269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie } catch (RemoteException e) {Log.e(TAG, "", e);} 640269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie return false; 641269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie } 642269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie 643269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie /** 644269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie * Get the Bluetooth alias of the remote device. 645269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie * If Alias is null, get the Bluetooth name instead. 646269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie * @see #getAlias() 647269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie * @see #getName() 648269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie * 649269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie * @return the Bluetooth alias, or null if no alias or there was a problem 650269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie * @hide 651269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie */ 652269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie public String getAliasName() { 653269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie String name = getAlias(); 654269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie if (name == null) { 655269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie name = getName(); 656269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie } 657269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie return name; 658269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie } 659269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie 660269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie /** 661005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * Start the bonding (pairing) process with the remote device. 662005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>This is an asynchronous call, it will return immediately. Register 663005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * for {@link #ACTION_BOND_STATE_CHANGED} intents to be notified when 664005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * the bonding process completes, and its result. 665005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Android system services will handle the necessary user interactions 666005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * to confirm and complete the bonding process. 667005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN}. 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 669005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * @return false on immediate error, true if bonding will begin 67018b1e79a123b979d25bfa5d0b0ee5d0382dbd64bNick Pelly * @hide 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 672bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public boolean createBond() { 6730f42037eb7b5118015c2caca635538324ccf0ccffredc if (sService == null) { 6740f42037eb7b5118015c2caca635538324ccf0ccffredc Log.e(TAG, "BT not enabled. Cannot create bond to Remote Device"); 6750f42037eb7b5118015c2caca635538324ccf0ccffredc return false; 6760f42037eb7b5118015c2caca635538324ccf0ccffredc } 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 678e4caddbb7a3b39fd6a1ccf107c7dbf09bc8978e8Jaikumar Ganesh return sService.createBond(this); 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) {Log.e(TAG, "", e);} 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 684cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * Start the bonding (pairing) process with the remote device using the 685cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * Out Of Band mechanism. 686cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * 687cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * <p>This is an asynchronous call, it will return immediately. Register 688cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * for {@link #ACTION_BOND_STATE_CHANGED} intents to be notified when 689cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * the bonding process completes, and its result. 690cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * 691cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * <p>Android system services will handle the necessary user interactions 692cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * to confirm and complete the bonding process. 693cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * 694cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN}. 695cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * 696cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * @param hash - Simple Secure pairing hash 697cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * @param randomizer - The random key obtained using OOB 698cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * @return false on immediate error, true if bonding will begin 699cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * 700cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * @hide 701cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh */ 702cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh public boolean createBondOutOfBand(byte[] hash, byte[] randomizer) { 703e4caddbb7a3b39fd6a1ccf107c7dbf09bc8978e8Jaikumar Ganesh //TODO(BT) 704e4caddbb7a3b39fd6a1ccf107c7dbf09bc8978e8Jaikumar Ganesh /* 705cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh try { 706e4caddbb7a3b39fd6a1ccf107c7dbf09bc8978e8Jaikumar Ganesh return sService.createBondOutOfBand(this, hash, randomizer); 707e4caddbb7a3b39fd6a1ccf107c7dbf09bc8978e8Jaikumar Ganesh } catch (RemoteException e) {Log.e(TAG, "", e);}*/ 708cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh return false; 709cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh } 710cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh 711cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh /** 712cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * Set the Out Of Band data for a remote device to be used later 713cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * in the pairing mechanism. Users can obtain this data through other 714cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * trusted channels 715cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * 716cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN}. 717cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * 718cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * @param hash Simple Secure pairing hash 719cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * @param randomizer The random key obtained using OOB 720cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * @return false on error; true otherwise 721cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * 722cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * @hide 723cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh */ 724cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh public boolean setDeviceOutOfBandData(byte[] hash, byte[] randomizer) { 725e4caddbb7a3b39fd6a1ccf107c7dbf09bc8978e8Jaikumar Ganesh //TODO(BT) 726e4caddbb7a3b39fd6a1ccf107c7dbf09bc8978e8Jaikumar Ganesh /* 727cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh try { 728e4caddbb7a3b39fd6a1ccf107c7dbf09bc8978e8Jaikumar Ganesh return sService.setDeviceOutOfBandData(this, hash, randomizer); 729e4caddbb7a3b39fd6a1ccf107c7dbf09bc8978e8Jaikumar Ganesh } catch (RemoteException e) {Log.e(TAG, "", e);} */ 730cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh return false; 731cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh } 732cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh 733cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh /** 734005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * Cancel an in-progress bonding request started with {@link #createBond}. 735005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN}. 736005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * 737f51eadaf1f83abfe16a609a4ded6d789494689b2Jake Hamby * @return true on success, false on error 73818b1e79a123b979d25bfa5d0b0ee5d0382dbd64bNick Pelly * @hide 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 740bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public boolean cancelBondProcess() { 7410f42037eb7b5118015c2caca635538324ccf0ccffredc if (sService == null) { 7420f42037eb7b5118015c2caca635538324ccf0ccffredc Log.e(TAG, "BT not enabled. Cannot cancel Remote Device bond"); 7430f42037eb7b5118015c2caca635538324ccf0ccffredc return false; 7440f42037eb7b5118015c2caca635538324ccf0ccffredc } 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 746e4caddbb7a3b39fd6a1ccf107c7dbf09bc8978e8Jaikumar Ganesh return sService.cancelBondProcess(this); 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) {Log.e(TAG, "", e);} 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 752005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * Remove bond (pairing) with the remote device. 753005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Delete the link key associated with the remote device, and 754005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * immediately terminate connections to that device that require 755005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * authentication and encryption. 756005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN}. 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 758f51eadaf1f83abfe16a609a4ded6d789494689b2Jake Hamby * @return true on success, false on error 75918b1e79a123b979d25bfa5d0b0ee5d0382dbd64bNick Pelly * @hide 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 761bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public boolean removeBond() { 7620f42037eb7b5118015c2caca635538324ccf0ccffredc if (sService == null) { 7630f42037eb7b5118015c2caca635538324ccf0ccffredc Log.e(TAG, "BT not enabled. Cannot remove Remote Device bond"); 7640f42037eb7b5118015c2caca635538324ccf0ccffredc return false; 7650f42037eb7b5118015c2caca635538324ccf0ccffredc } 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 767e4caddbb7a3b39fd6a1ccf107c7dbf09bc8978e8Jaikumar Ganesh return sService.removeBond(this); 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) {Log.e(TAG, "", e);} 769bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return false; 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 773005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * Get the bond state of the remote device. 774005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Possible values for the bond state are: 775005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * {@link #BOND_NONE}, 776005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * {@link #BOND_BONDING}, 777005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * {@link #BOND_BONDED}. 778005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Requires {@link android.Manifest.permission#BLUETOOTH}. 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 780005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * @return the bond state 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 782bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public int getBondState() { 7830f42037eb7b5118015c2caca635538324ccf0ccffredc if (sService == null) { 7840f42037eb7b5118015c2caca635538324ccf0ccffredc Log.e(TAG, "BT not enabled. Cannot get bond state"); 7850f42037eb7b5118015c2caca635538324ccf0ccffredc return BOND_NONE; 7860f42037eb7b5118015c2caca635538324ccf0ccffredc } 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 788e4caddbb7a3b39fd6a1ccf107c7dbf09bc8978e8Jaikumar Ganesh return sService.getBondState(this); 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) {Log.e(TAG, "", e);} 790305f240dc12325af4fa267e7c4f52c680bb05280Syed Ibrahim M catch (NullPointerException npe) { 791305f240dc12325af4fa267e7c4f52c680bb05280Syed Ibrahim M // Handle case where bluetooth service proxy 792305f240dc12325af4fa267e7c4f52c680bb05280Syed Ibrahim M // is already null. 793305f240dc12325af4fa267e7c4f52c680bb05280Syed Ibrahim M Log.e(TAG, "NullPointerException for getBondState() of device ("+ 794305f240dc12325af4fa267e7c4f52c680bb05280Syed Ibrahim M getAddress()+")", npe); 795305f240dc12325af4fa267e7c4f52c680bb05280Syed Ibrahim M } 796005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly return BOND_NONE; 797005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly } 798005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly 799005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly /** 800005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * Get the Bluetooth class of the remote device. 801005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Requires {@link android.Manifest.permission#BLUETOOTH}. 802005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * 803005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * @return Bluetooth class object, or null on error 804005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly */ 805005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly public BluetoothClass getBluetoothClass() { 8060f42037eb7b5118015c2caca635538324ccf0ccffredc if (sService == null) { 8070f42037eb7b5118015c2caca635538324ccf0ccffredc Log.e(TAG, "BT not enabled. Cannot get Bluetooth Class"); 8080f42037eb7b5118015c2caca635538324ccf0ccffredc return null; 8090f42037eb7b5118015c2caca635538324ccf0ccffredc } 810005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly try { 811e4caddbb7a3b39fd6a1ccf107c7dbf09bc8978e8Jaikumar Ganesh int classInt = sService.getRemoteClass(this); 812005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly if (classInt == BluetoothClass.ERROR) return null; 813005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly return new BluetoothClass(classInt); 814005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly } catch (RemoteException e) {Log.e(TAG, "", e);} 815005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly return null; 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 818efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue /** 819efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue * Get trust state of a remote device. 820e6ee3be1c254404dad842298f6f56c11cc6c7ac8Nick Pelly * <p>Requires {@link android.Manifest.permission#BLUETOOTH}. 821efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue * @hide 822efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue */ 823efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue public boolean getTrustState() { 824e4caddbb7a3b39fd6a1ccf107c7dbf09bc8978e8Jaikumar Ganesh //TODO(BT) 825e4caddbb7a3b39fd6a1ccf107c7dbf09bc8978e8Jaikumar Ganesh /* 826efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue try { 827e4caddbb7a3b39fd6a1ccf107c7dbf09bc8978e8Jaikumar Ganesh return sService.getTrustState(this); 828efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue } catch (RemoteException e) { 829efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue Log.e(TAG, "", e); 830e4caddbb7a3b39fd6a1ccf107c7dbf09bc8978e8Jaikumar Ganesh }*/ 831efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue return false; 832efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue } 833efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue 834efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue /** 835efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue * Set trust state for a remote device. 836e6ee3be1c254404dad842298f6f56c11cc6c7ac8Nick Pelly * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN}. 837efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue * @param value the trust state value (true or false) 838efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue * @hide 839efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue */ 840efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue public boolean setTrust(boolean value) { 841e4caddbb7a3b39fd6a1ccf107c7dbf09bc8978e8Jaikumar Ganesh //TODO(BT) 842e4caddbb7a3b39fd6a1ccf107c7dbf09bc8978e8Jaikumar Ganesh /* 843efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue try { 844e4caddbb7a3b39fd6a1ccf107c7dbf09bc8978e8Jaikumar Ganesh return sService.setTrust(this, value); 845efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue } catch (RemoteException e) { 846efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue Log.e(TAG, "", e); 847e4caddbb7a3b39fd6a1ccf107c7dbf09bc8978e8Jaikumar Ganesh }*/ 848efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue return false; 849efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue } 850efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue 851ad2321027e9731711544b43378bd7b2f01890774Matthew Xie /** 852ad2321027e9731711544b43378bd7b2f01890774Matthew Xie * Returns the supported features (UUIDs) of the remote device. 853ad2321027e9731711544b43378bd7b2f01890774Matthew Xie * 854ad2321027e9731711544b43378bd7b2f01890774Matthew Xie * <p>This method does not start a service discovery procedure to retrieve the UUIDs 855ad2321027e9731711544b43378bd7b2f01890774Matthew Xie * from the remote device. Instead, the local cached copy of the service 856ad2321027e9731711544b43378bd7b2f01890774Matthew Xie * UUIDs are returned. 857ad2321027e9731711544b43378bd7b2f01890774Matthew Xie * <p>Use {@link #fetchUuidsWithSdp} if fresh UUIDs are desired. 858ad2321027e9731711544b43378bd7b2f01890774Matthew Xie * <p>Requires {@link android.Manifest.permission#BLUETOOTH}. 859ad2321027e9731711544b43378bd7b2f01890774Matthew Xie * 860ad2321027e9731711544b43378bd7b2f01890774Matthew Xie * @return the supported features (UUIDs) of the remote device, 861ad2321027e9731711544b43378bd7b2f01890774Matthew Xie * or null on error 862ad2321027e9731711544b43378bd7b2f01890774Matthew Xie */ 863dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh public ParcelUuid[] getUuids() { 8640f42037eb7b5118015c2caca635538324ccf0ccffredc if (sService == null) { 8650f42037eb7b5118015c2caca635538324ccf0ccffredc Log.e(TAG, "BT not enabled. Cannot get remote device Uuids"); 8660f42037eb7b5118015c2caca635538324ccf0ccffredc return null; 8670f42037eb7b5118015c2caca635538324ccf0ccffredc } 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 869e4caddbb7a3b39fd6a1ccf107c7dbf09bc8978e8Jaikumar Ganesh return sService.getRemoteUuids(this); 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) {Log.e(TAG, "", e);} 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 873d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh 8741caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh /** 875ad2321027e9731711544b43378bd7b2f01890774Matthew Xie * Perform a service discovery on the remote device to get the UUIDs supported. 876ad2321027e9731711544b43378bd7b2f01890774Matthew Xie * 877ad2321027e9731711544b43378bd7b2f01890774Matthew Xie * <p>This API is asynchronous and {@link #ACTION_UUID} intent is sent, 878ad2321027e9731711544b43378bd7b2f01890774Matthew Xie * with the UUIDs supported by the remote end. If there is an error 879ad2321027e9731711544b43378bd7b2f01890774Matthew Xie * in getting the SDP records or if the process takes a long time, 880ad2321027e9731711544b43378bd7b2f01890774Matthew Xie * {@link #ACTION_UUID} intent is sent with the UUIDs that is currently 881ad2321027e9731711544b43378bd7b2f01890774Matthew Xie * present in the cache. Clients should use the {@link #getUuids} to get UUIDs 882ad2321027e9731711544b43378bd7b2f01890774Matthew Xie * if service discovery is not to be performed. 883ad2321027e9731711544b43378bd7b2f01890774Matthew Xie * <p>Requires {@link android.Manifest.permission#BLUETOOTH}. 8841caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh * 885ad2321027e9731711544b43378bd7b2f01890774Matthew Xie * @return False if the sanity check fails, True if the process 8861caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh * of initiating an ACL connection to the remote device 8871caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh * was started. 8881caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh */ 8891caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh public boolean fetchUuidsWithSdp() { 8901caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh try { 8914c9cacadcc7ab20e06763746bbb41d0acdc106b5fredc return sService.fetchRemoteUuids(this); 8924c9cacadcc7ab20e06763746bbb41d0acdc106b5fredc } catch (RemoteException e) {Log.e(TAG, "", e);} 8934c9cacadcc7ab20e06763746bbb41d0acdc106b5fredc return false; 8941caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh } 8951caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh 89645e2704ff512d41e22af2801d76e96955469ce8dNick Pelly /** @hide */ 897dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh public int getServiceChannel(ParcelUuid uuid) { 898e4caddbb7a3b39fd6a1ccf107c7dbf09bc8978e8Jaikumar Ganesh //TODO(BT) 899e4caddbb7a3b39fd6a1ccf107c7dbf09bc8978e8Jaikumar Ganesh /* 900d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh try { 901e4caddbb7a3b39fd6a1ccf107c7dbf09bc8978e8Jaikumar Ganesh return sService.getRemoteServiceChannel(this, uuid); 902e4caddbb7a3b39fd6a1ccf107c7dbf09bc8978e8Jaikumar Ganesh } catch (RemoteException e) {Log.e(TAG, "", e);}*/ 903b24e11baac589fe16426f2d243b460ab84991c7bNick Pelly return BluetoothDevice.ERROR; 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 90645e2704ff512d41e22af2801d76e96955469ce8dNick Pelly /** @hide */ 907bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public boolean setPin(byte[] pin) { 9080f42037eb7b5118015c2caca635538324ccf0ccffredc if (sService == null) { 9090f42037eb7b5118015c2caca635538324ccf0ccffredc Log.e(TAG, "BT not enabled. Cannot set Remote Device pin"); 9100f42037eb7b5118015c2caca635538324ccf0ccffredc return false; 9110f42037eb7b5118015c2caca635538324ccf0ccffredc } 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 913e4caddbb7a3b39fd6a1ccf107c7dbf09bc8978e8Jaikumar Ganesh return sService.setPin(this, true, pin.length, pin); 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) {Log.e(TAG, "", e);} 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 917b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh 91845e2704ff512d41e22af2801d76e96955469ce8dNick Pelly /** @hide */ 919bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public boolean setPasskey(int passkey) { 920e4caddbb7a3b39fd6a1ccf107c7dbf09bc8978e8Jaikumar Ganesh //TODO(BT) 921e4caddbb7a3b39fd6a1ccf107c7dbf09bc8978e8Jaikumar Ganesh /* 922b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh try { 923e4caddbb7a3b39fd6a1ccf107c7dbf09bc8978e8Jaikumar Ganesh return sService.setPasskey(this, true, 4, passkey); 924e4caddbb7a3b39fd6a1ccf107c7dbf09bc8978e8Jaikumar Ganesh } catch (RemoteException e) {Log.e(TAG, "", e);}*/ 925b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh return false; 926b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh } 927b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh 92845e2704ff512d41e22af2801d76e96955469ce8dNick Pelly /** @hide */ 929bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public boolean setPairingConfirmation(boolean confirm) { 9300f42037eb7b5118015c2caca635538324ccf0ccffredc if (sService == null) { 9310f42037eb7b5118015c2caca635538324ccf0ccffredc Log.e(TAG, "BT not enabled. Cannot set pairing confirmation"); 9320f42037eb7b5118015c2caca635538324ccf0ccffredc return false; 9330f42037eb7b5118015c2caca635538324ccf0ccffredc } 934b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh try { 935e4caddbb7a3b39fd6a1ccf107c7dbf09bc8978e8Jaikumar Ganesh return sService.setPairingConfirmation(this, confirm); 936b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh } catch (RemoteException e) {Log.e(TAG, "", e);} 937b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh return false; 938b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh } 939b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh 94045e2704ff512d41e22af2801d76e96955469ce8dNick Pelly /** @hide */ 941cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh public boolean setRemoteOutOfBandData() { 942e4caddbb7a3b39fd6a1ccf107c7dbf09bc8978e8Jaikumar Ganesh // TODO(BT) 943e4caddbb7a3b39fd6a1ccf107c7dbf09bc8978e8Jaikumar Ganesh /* 944cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh try { 945e4caddbb7a3b39fd6a1ccf107c7dbf09bc8978e8Jaikumar Ganesh return sService.setRemoteOutOfBandData(this); 946e4caddbb7a3b39fd6a1ccf107c7dbf09bc8978e8Jaikumar Ganesh } catch (RemoteException e) {Log.e(TAG, "", e);}*/ 947cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh return false; 948cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh } 949cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh 950cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh /** @hide */ 951bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public boolean cancelPairingUserInput() { 9520f42037eb7b5118015c2caca635538324ccf0ccffredc if (sService == null) { 9530f42037eb7b5118015c2caca635538324ccf0ccffredc Log.e(TAG, "BT not enabled. Cannot create pairing user input"); 9540f42037eb7b5118015c2caca635538324ccf0ccffredc return false; 9550f42037eb7b5118015c2caca635538324ccf0ccffredc } 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 957919a4c6264b733585152ce1dc6f868c1093d368bRavi Nagarajan return sService.cancelBondProcess(this); 958db44b20fe6aed65d5cd7e1f6d7c52e4322083039Priti Aghera } catch (RemoteException e) {Log.e(TAG, "", e);} 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9623fbf7b62bb48b10316353087d09cc3720af00642Jaikumar Ganesh /** @hide */ 9633fbf7b62bb48b10316353087d09cc3720af00642Jaikumar Ganesh public boolean isBluetoothDock() { 964e4caddbb7a3b39fd6a1ccf107c7dbf09bc8978e8Jaikumar Ganesh // TODO(BT) 965e4caddbb7a3b39fd6a1ccf107c7dbf09bc8978e8Jaikumar Ganesh /* 9663fbf7b62bb48b10316353087d09cc3720af00642Jaikumar Ganesh try { 967e4caddbb7a3b39fd6a1ccf107c7dbf09bc8978e8Jaikumar Ganesh return sService.isBluetoothDock(this); 968e4caddbb7a3b39fd6a1ccf107c7dbf09bc8978e8Jaikumar Ganesh } catch (RemoteException e) {Log.e(TAG, "", e);}*/ 9693fbf7b62bb48b10316353087d09cc3720af00642Jaikumar Ganesh return false; 9703fbf7b62bb48b10316353087d09cc3720af00642Jaikumar Ganesh } 9713fbf7b62bb48b10316353087d09cc3720af00642Jaikumar Ganesh 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 97345e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * Create an RFCOMM {@link BluetoothSocket} ready to start a secure 97416fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly * outgoing connection to this remote device on given channel. 97545e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * <p>The remote device will be authenticated and communication on this 97645e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * socket will be encrypted. 977c8fa4ff838a0c3d2c67db65540fa751e5abe27edJaikumar Ganesh * <p> Use this socket only if an authenticated socket link is possible. 978c8fa4ff838a0c3d2c67db65540fa751e5abe27edJaikumar Ganesh * Authentication refers to the authentication of the link key to 979c8fa4ff838a0c3d2c67db65540fa751e5abe27edJaikumar Ganesh * prevent man-in-the-middle type of attacks. 980c8fa4ff838a0c3d2c67db65540fa751e5abe27edJaikumar Ganesh * For example, for Bluetooth 2.1 devices, if any of the devices does not 981c8fa4ff838a0c3d2c67db65540fa751e5abe27edJaikumar Ganesh * have an input and output capability or just has the ability to 982c8fa4ff838a0c3d2c67db65540fa751e5abe27edJaikumar Ganesh * display a numeric key, a secure socket connection is not possible. 983c8fa4ff838a0c3d2c67db65540fa751e5abe27edJaikumar Ganesh * In such a case, use {#link createInsecureRfcommSocket}. 984c8fa4ff838a0c3d2c67db65540fa751e5abe27edJaikumar Ganesh * For more details, refer to the Security Model section 5.2 (vol 3) of 985c8fa4ff838a0c3d2c67db65540fa751e5abe27edJaikumar Ganesh * Bluetooth Core Specification version 2.1 + EDR. 986f51eadaf1f83abfe16a609a4ded6d789494689b2Jake Hamby * <p>Use {@link BluetoothSocket#connect} to initiate the outgoing 98745e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * connection. 98845e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * <p>Valid RFCOMM channels are in range 1 to 30. 989cf44059813539bf7f36dabd278cef93ba3122c56Nick Pelly * <p>Requires {@link android.Manifest.permission#BLUETOOTH} 990de893f550301a60274e87aa8168225e7a7a42184Nick Pelly * 99145e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * @param channel RFCOMM channel to connect to 99245e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * @return a RFCOMM BluetoothServerSocket ready for an outgoing connection 993bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * @throws IOException on error, for example Bluetooth not available, or 99445e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * insufficient permissions 99516fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly * @hide 996bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly */ 99745e2704ff512d41e22af2801d76e96955469ce8dNick Pelly public BluetoothSocket createRfcommSocket(int channel) throws IOException { 99816fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly return new BluetoothSocket(BluetoothSocket.TYPE_RFCOMM, -1, true, true, this, channel, 99916fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly null); 100016fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly } 100116fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly 100216fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly /** 100316fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly * Create an RFCOMM {@link BluetoothSocket} ready to start a secure 100416fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly * outgoing connection to this remote device using SDP lookup of uuid. 100516fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly * <p>This is designed to be used with {@link 100616fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly * BluetoothAdapter#listenUsingRfcommWithServiceRecord} for peer-peer 100716fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly * Bluetooth applications. 1008f51eadaf1f83abfe16a609a4ded6d789494689b2Jake Hamby * <p>Use {@link BluetoothSocket#connect} to initiate the outgoing 100916fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly * connection. This will also perform an SDP lookup of the given uuid to 101016fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly * determine which channel to connect to. 101116fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly * <p>The remote device will be authenticated and communication on this 101216fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly * socket will be encrypted. 1013c8fa4ff838a0c3d2c67db65540fa751e5abe27edJaikumar Ganesh * <p> Use this socket only if an authenticated socket link is possible. 1014c8fa4ff838a0c3d2c67db65540fa751e5abe27edJaikumar Ganesh * Authentication refers to the authentication of the link key to 1015c8fa4ff838a0c3d2c67db65540fa751e5abe27edJaikumar Ganesh * prevent man-in-the-middle type of attacks. 1016c8fa4ff838a0c3d2c67db65540fa751e5abe27edJaikumar Ganesh * For example, for Bluetooth 2.1 devices, if any of the devices does not 1017c8fa4ff838a0c3d2c67db65540fa751e5abe27edJaikumar Ganesh * have an input and output capability or just has the ability to 1018c8fa4ff838a0c3d2c67db65540fa751e5abe27edJaikumar Ganesh * display a numeric key, a secure socket connection is not possible. 1019c8fa4ff838a0c3d2c67db65540fa751e5abe27edJaikumar Ganesh * In such a case, use {#link createInsecureRfcommSocketToServiceRecord}. 1020c8fa4ff838a0c3d2c67db65540fa751e5abe27edJaikumar Ganesh * For more details, refer to the Security Model section 5.2 (vol 3) of 1021c8fa4ff838a0c3d2c67db65540fa751e5abe27edJaikumar Ganesh * Bluetooth Core Specification version 2.1 + EDR. 1022ea5056e5a705048f8495131ab0dcf087a2633fedNick Pelly * <p>Hint: If you are connecting to a Bluetooth serial board then try 1023ea5056e5a705048f8495131ab0dcf087a2633fedNick Pelly * using the well-known SPP UUID 00001101-0000-1000-8000-00805F9B34FB. 1024ea5056e5a705048f8495131ab0dcf087a2633fedNick Pelly * However if you are connecting to an Android peer then please generate 1025ea5056e5a705048f8495131ab0dcf087a2633fedNick Pelly * your own unique UUID. 102616fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly * <p>Requires {@link android.Manifest.permission#BLUETOOTH} 102716fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly * 102816fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly * @param uuid service record uuid to lookup RFCOMM channel 102916fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly * @return a RFCOMM BluetoothServerSocket ready for an outgoing connection 103016fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly * @throws IOException on error, for example Bluetooth not available, or 103116fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly * insufficient permissions 103216fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly */ 103316fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly public BluetoothSocket createRfcommSocketToServiceRecord(UUID uuid) throws IOException { 103416fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly return new BluetoothSocket(BluetoothSocket.TYPE_RFCOMM, -1, true, true, this, -1, 103516fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly new ParcelUuid(uuid)); 1036bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly } 1037bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly 1038bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly /** 10396eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh * Create an RFCOMM {@link BluetoothSocket} socket ready to start an insecure 10406eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh * outgoing connection to this remote device using SDP lookup of uuid. 10416eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh * <p> The communication channel will not have an authenticated link key 10426eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh * i.e it will be subject to man-in-the-middle attacks. For Bluetooth 2.1 10436eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh * devices, the link key will be encrypted, as encryption is mandatory. 10446eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh * For legacy devices (pre Bluetooth 2.1 devices) the link key will 10456eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh * be not be encrypted. Use {@link #createRfcommSocketToServiceRecord} if an 10466eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh * encrypted and authenticated communication channel is desired. 10476eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh * <p>This is designed to be used with {@link 10486eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh * BluetoothAdapter#listenUsingInsecureRfcommWithServiceRecord} for peer-peer 10496eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh * Bluetooth applications. 10506eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh * <p>Use {@link BluetoothSocket#connect} to initiate the outgoing 10516eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh * connection. This will also perform an SDP lookup of the given uuid to 10526eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh * determine which channel to connect to. 10536eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh * <p>The remote device will be authenticated and communication on this 10546eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh * socket will be encrypted. 10556eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh * <p>Hint: If you are connecting to a Bluetooth serial board then try 10566eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh * using the well-known SPP UUID 00001101-0000-1000-8000-00805F9B34FB. 10576eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh * However if you are connecting to an Android peer then please generate 10586eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh * your own unique UUID. 10596eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh * <p>Requires {@link android.Manifest.permission#BLUETOOTH} 10606eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh * 10616eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh * @param uuid service record uuid to lookup RFCOMM channel 10626eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh * @return a RFCOMM BluetoothServerSocket ready for an outgoing connection 10636eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh * @throws IOException on error, for example Bluetooth not available, or 10646eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh * insufficient permissions 10656eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh */ 10666eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh public BluetoothSocket createInsecureRfcommSocketToServiceRecord(UUID uuid) throws IOException { 10676eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh return new BluetoothSocket(BluetoothSocket.TYPE_RFCOMM, -1, false, false, this, -1, 10686eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh new ParcelUuid(uuid)); 10696eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh } 10706eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh 10716eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh /** 1072bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * Construct an insecure RFCOMM socket ready to start an outgoing 1073bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * connection. 1074bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * Call #connect on the returned #BluetoothSocket to begin the connection. 1075bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * The remote device will not be authenticated and communication on this 1076bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * socket will not be encrypted. 1077e6ee3be1c254404dad842298f6f56c11cc6c7ac8Nick Pelly * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN} 1078e6ee3be1c254404dad842298f6f56c11cc6c7ac8Nick Pelly * 1079bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * @param port remote port 1080bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * @return An RFCOMM BluetoothSocket 1081bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * @throws IOException On error, for example Bluetooth not available, or 1082bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * insufficient permissions. 108345e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * @hide 1084bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly */ 1085bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public BluetoothSocket createInsecureRfcommSocket(int port) throws IOException { 108616fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly return new BluetoothSocket(BluetoothSocket.TYPE_RFCOMM, -1, false, false, this, port, 108716fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly null); 1088bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly } 1089bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly 1090bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly /** 1091bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * Construct a SCO socket ready to start an outgoing connection. 1092bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * Call #connect on the returned #BluetoothSocket to begin the connection. 1093e6ee3be1c254404dad842298f6f56c11cc6c7ac8Nick Pelly * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN} 1094e6ee3be1c254404dad842298f6f56c11cc6c7ac8Nick Pelly * 1095bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * @return a SCO BluetoothSocket 1096bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * @throws IOException on error, for example Bluetooth not available, or 1097bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * insufficient permissions. 109845e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * @hide 1099bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly */ 1100bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public BluetoothSocket createScoSocket() throws IOException { 110116fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly return new BluetoothSocket(BluetoothSocket.TYPE_SCO, -1, true, true, this, -1, null); 1102bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly } 1103bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly 1104bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly /** 11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Check that a pin is valid and convert to byte array. 11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1107f51eadaf1f83abfe16a609a4ded6d789494689b2Jake Hamby * Bluetooth pin's are 1 to 16 bytes of UTF-8 characters. 11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pin pin as java String 1109f51eadaf1f83abfe16a609a4ded6d789494689b2Jake Hamby * @return the pin code as a UTF-8 byte array, or null if it is an invalid 11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Bluetooth pin. 111145e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * @hide 11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static byte[] convertPinToBytes(String pin) { 11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pin == null) { 11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] pinBytes; 11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1119f51eadaf1f83abfe16a609a4ded6d789494689b2Jake Hamby pinBytes = pin.getBytes("UTF-8"); 11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (UnsupportedEncodingException uee) { 1121f51eadaf1f83abfe16a609a4ded6d789494689b2Jake Hamby Log.e(TAG, "UTF-8 not supported?!?"); // this should not happen 11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pinBytes.length <= 0 || pinBytes.length > 16) { 11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pinBytes; 11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1130ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie /** 1131ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * Connect to GATT Server hosted by this device. Caller acts as GATT client. 1132ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * The callback is used to deliver results to Caller, such as connection status as well 1133ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * as any further GATT client operations. 1134ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * The method returns a BluetoothGatt instance. You can use BluetoothGatt to conduct 1135ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * GATT client operations. 1136ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * @param callback GATT callback handler that will receive asynchronous callbacks. 1137ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * @param autoConnect Whether to directly connect to the remote device (false) 1138ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * or to automatically connect as soon as the remote 1139ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * device becomes available (true). 1140ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * @throws IllegalArgumentException if callback is null 1141ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie */ 1142ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie public BluetoothGatt connectGattServer(Context context, boolean autoConnect, 1143ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie BluetoothGattCallback callback) { 1144ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie // TODO(Bluetooth) check whether platform support BLE 1145ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie // Do the check here or in GattServer? 1146ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); 1147ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie IBluetoothManager managerService = adapter.getBluetoothManager(); 1148ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie try { 1149ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie IBluetoothGatt iGatt = managerService.getBluetoothGatt(); 1150ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie BluetoothGatt gatt = new BluetoothGatt(context, iGatt, this); 1151ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie gatt.connect(autoConnect, callback); 1152ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie return gatt; 1153ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie } catch (RemoteException e) {Log.e(TAG, "", e);} 1154ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie return null; 1155ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie } 11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1157