BluetoothDevice.java revision 5bbd4b4f5fc19302fa017ad6afee6eb2d489d91a
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; 21bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pellyimport android.os.IBinder; 22bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pellyimport android.os.Parcel; 23bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pellyimport android.os.Parcelable; 24aef439e6f825c0cb99a2ac08c8207f48b7a9fe10Nick Pellyimport android.os.ParcelUuid; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException; 26bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pellyimport android.os.ServiceManager; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pellyimport java.io.IOException; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.UnsupportedEncodingException; 311caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganeshimport java.util.UUID; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 349fab0aef19a4633d2e4670564e5d7ae9e52fe11fScott Main * Represents a remote Bluetooth device. A {@link BluetoothDevice} lets you 35f51eadaf1f83abfe16a609a4ded6d789494689b2Jake Hamby * create a connection with the respective device or query information about 369fab0aef19a4633d2e4670564e5d7ae9e52fe11fScott Main * it, such as the name, address, class, and bonding state. 3745e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * 3845e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * <p>This class is really just a thin wrapper for a Bluetooth hardware 3945e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * address. Objects of this class are immutable. Operations on this class 4045e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * are performed on the remote Bluetooth hardware address, using the 4145e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * {@link BluetoothAdapter} that was used to create this {@link 4245e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * BluetoothDevice}. 439fab0aef19a4633d2e4670564e5d7ae9e52fe11fScott Main * 449fab0aef19a4633d2e4670564e5d7ae9e52fe11fScott Main * <p>To get a {@link BluetoothDevice}, use 459fab0aef19a4633d2e4670564e5d7ae9e52fe11fScott Main * {@link BluetoothAdapter#getRemoteDevice(String) 469fab0aef19a4633d2e4670564e5d7ae9e52fe11fScott Main * BluetoothAdapter.getRemoteDevice(String)} to create one representing a device 479fab0aef19a4633d2e4670564e5d7ae9e52fe11fScott Main * of a known MAC address (which you can get through device discovery with 489fab0aef19a4633d2e4670564e5d7ae9e52fe11fScott Main * {@link BluetoothAdapter}) or get one from the set of bonded devices 499fab0aef19a4633d2e4670564e5d7ae9e52fe11fScott Main * returned by {@link BluetoothAdapter#getBondedDevices() 509fab0aef19a4633d2e4670564e5d7ae9e52fe11fScott Main * BluetoothAdapter.getBondedDevices()}. You can then open a 51f51eadaf1f83abfe16a609a4ded6d789494689b2Jake Hamby * {@link BluetoothSocket} for communication with the remote device, using 529fab0aef19a4633d2e4670564e5d7ae9e52fe11fScott Main * {@link #createRfcommSocketToServiceRecord(UUID)}. 539fab0aef19a4633d2e4670564e5d7ae9e52fe11fScott Main * 549fab0aef19a4633d2e4670564e5d7ae9e52fe11fScott Main * <p class="note"><strong>Note:</strong> 559fab0aef19a4633d2e4670564e5d7ae9e52fe11fScott Main * Requires the {@link android.Manifest.permission#BLUETOOTH} permission. 569fab0aef19a4633d2e4670564e5d7ae9e52fe11fScott Main * 573aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <div class="special reference"> 583aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <h3>Developer Guides</h3> 593aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <p>For more information about using Bluetooth, read the 603aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <a href="{@docRoot}guide/topics/wireless/bluetooth.html">Bluetooth</a> developer guide.</p> 613aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * </div> 623aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * 639fab0aef19a4633d2e4670564e5d7ae9e52fe11fScott Main * {@see BluetoothAdapter} 649fab0aef19a4633d2e4670564e5d7ae9e52fe11fScott Main * {@see BluetoothSocket} 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 66bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pellypublic final class BluetoothDevice implements Parcelable { 67bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly private static final String TAG = "BluetoothDevice"; 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 69b24e11baac589fe16426f2d243b460ab84991c7bNick Pelly /** 70b24e11baac589fe16426f2d243b460ab84991c7bNick Pelly * Sentinel error value for this class. Guaranteed to not equal any other 71b24e11baac589fe16426f2d243b460ab84991c7bNick Pelly * integer constant in this class. Provided as a convenience for functions 72b24e11baac589fe16426f2d243b460ab84991c7bNick Pelly * that require a sentinel error value, for example: 73005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p><code>Intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, 74005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * BluetoothDevice.ERROR)</code> 75005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly */ 76005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly public static final int ERROR = Integer.MIN_VALUE; 77005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly 78005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly /** 79005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * Broadcast Action: Remote device discovered. 80005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Sent when a remote device is found during discovery. 81005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Always contains the extra fields {@link #EXTRA_DEVICE} and {@link 82005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * #EXTRA_CLASS}. Can contain the extra fields {@link #EXTRA_NAME} and/or 83005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * {@link #EXTRA_RSSI} if they are available. 84005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Requires {@link android.Manifest.permission#BLUETOOTH} to receive. 85005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly */ 86005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly // TODO: Change API to not broadcast RSSI if not available (incoming connection) 87005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 88005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly public static final String ACTION_FOUND = 89005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly "android.bluetooth.device.action.FOUND"; 90005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly 91005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly /** 92005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * Broadcast Action: Remote device disappeared. 93005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Sent when a remote device that was found in the last discovery is not 94005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * found in the current discovery. 95005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Always contains the extra field {@link #EXTRA_DEVICE}. 96005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Requires {@link android.Manifest.permission#BLUETOOTH} to receive. 97005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * @hide 98005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly */ 99005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 100005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly public static final String ACTION_DISAPPEARED = 101005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly "android.bluetooth.device.action.DISAPPEARED"; 102005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly 103005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly /** 104005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * Broadcast Action: Bluetooth class of a remote device has changed. 105005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Always contains the extra fields {@link #EXTRA_DEVICE} and {@link 106005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * #EXTRA_CLASS}. 107005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Requires {@link android.Manifest.permission#BLUETOOTH} to receive. 108005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * @see {@link BluetoothClass} 109005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly */ 110005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 111005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly public static final String ACTION_CLASS_CHANGED = 112005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly "android.bluetooth.device.action.CLASS_CHANGED"; 113005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly 114005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly /** 115005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * Broadcast Action: Indicates a low level (ACL) connection has been 116005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * established with a remote device. 117005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Always contains the extra field {@link #EXTRA_DEVICE}. 118005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>ACL connections are managed automatically by the Android Bluetooth 119005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * stack. 120005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Requires {@link android.Manifest.permission#BLUETOOTH} to receive. 121005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly */ 122005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 123005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly public static final String ACTION_ACL_CONNECTED = 124005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly "android.bluetooth.device.action.ACL_CONNECTED"; 125005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly 126005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly /** 127005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * Broadcast Action: Indicates that a low level (ACL) disconnection has 128005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * been requested for a remote device, and it will soon be disconnected. 129005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>This is useful for graceful disconnection. Applications should use 130005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * this intent as a hint to immediately terminate higher level connections 131005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * (RFCOMM, L2CAP, or profile connections) to the remote device. 132005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Always contains the extra field {@link #EXTRA_DEVICE}. 133005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Requires {@link android.Manifest.permission#BLUETOOTH} to receive. 134005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly */ 135005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 136005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly public static final String ACTION_ACL_DISCONNECT_REQUESTED = 137005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly "android.bluetooth.device.action.ACL_DISCONNECT_REQUESTED"; 138005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly 139005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly /** 140005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * Broadcast Action: Indicates a low level (ACL) disconnection from a 141005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * remote device. 142005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Always contains the extra field {@link #EXTRA_DEVICE}. 143005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>ACL connections are managed automatically by the Android Bluetooth 144005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * stack. 145005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Requires {@link android.Manifest.permission#BLUETOOTH} to receive. 146005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly */ 147005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 148005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly public static final String ACTION_ACL_DISCONNECTED = 149005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly "android.bluetooth.device.action.ACL_DISCONNECTED"; 150005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly 151005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly /** 152005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * Broadcast Action: Indicates the friendly name of a remote device has 153005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * been retrieved for the first time, or changed since the last retrieval. 154005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Always contains the extra fields {@link #EXTRA_DEVICE} and {@link 155005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * #EXTRA_NAME}. 156005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Requires {@link android.Manifest.permission#BLUETOOTH} to receive. 157005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly */ 158005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 159005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly public static final String ACTION_NAME_CHANGED = 160005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly "android.bluetooth.device.action.NAME_CHANGED"; 161005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly 162005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly /** 1635bbd4b4f5fc19302fa017ad6afee6eb2d489d91aJeff Brown * Broadcast Action: Indicates the alias of a remote device has been 1645bbd4b4f5fc19302fa017ad6afee6eb2d489d91aJeff Brown * changed. 1655bbd4b4f5fc19302fa017ad6afee6eb2d489d91aJeff Brown * <p>Always contains the extra field {@link #EXTRA_DEVICE}. 1665bbd4b4f5fc19302fa017ad6afee6eb2d489d91aJeff Brown * <p>Requires {@link android.Manifest.permission#BLUETOOTH} to receive. 1675bbd4b4f5fc19302fa017ad6afee6eb2d489d91aJeff Brown * 1685bbd4b4f5fc19302fa017ad6afee6eb2d489d91aJeff Brown * @hide 1695bbd4b4f5fc19302fa017ad6afee6eb2d489d91aJeff Brown */ 1705bbd4b4f5fc19302fa017ad6afee6eb2d489d91aJeff Brown @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 1715bbd4b4f5fc19302fa017ad6afee6eb2d489d91aJeff Brown public static final String ACTION_ALIAS_CHANGED = 1725bbd4b4f5fc19302fa017ad6afee6eb2d489d91aJeff Brown "android.bluetooth.device.action.ALIAS_CHANGED"; 1735bbd4b4f5fc19302fa017ad6afee6eb2d489d91aJeff Brown 1745bbd4b4f5fc19302fa017ad6afee6eb2d489d91aJeff Brown /** 175005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * Broadcast Action: Indicates a change in the bond state of a remote 176005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * device. For example, if a device is bonded (paired). 177005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Always contains the extra fields {@link #EXTRA_DEVICE}, {@link 178005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * #EXTRA_BOND_STATE} and {@link #EXTRA_PREVIOUS_BOND_STATE}. 179005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Requires {@link android.Manifest.permission#BLUETOOTH} to receive. 180005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly */ 181005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly // Note: When EXTRA_BOND_STATE is BOND_NONE then this will also 182005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly // contain a hidden extra field EXTRA_REASON with the result code. 183005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 184005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly public static final String ACTION_BOND_STATE_CHANGED = 185005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly "android.bluetooth.device.action.BOND_STATE_CHANGED"; 186005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly 187005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly /** 188005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * Used as a Parcelable {@link BluetoothDevice} extra field in every intent 189005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * broadcast by this class. It contains the {@link BluetoothDevice} that 190005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * the intent applies to. 191005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly */ 192005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly public static final String EXTRA_DEVICE = "android.bluetooth.device.extra.DEVICE"; 193005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly 194005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly /** 195005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * Used as a String extra field in {@link #ACTION_NAME_CHANGED} and {@link 196005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * #ACTION_FOUND} intents. It contains the friendly Bluetooth name. 197005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly */ 198005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly public static final String EXTRA_NAME = "android.bluetooth.device.extra.NAME"; 199005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly 200005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly /** 201005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * Used as an optional short extra field in {@link #ACTION_FOUND} intents. 202005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * Contains the RSSI value of the remote device as reported by the 203005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * Bluetooth hardware. 204005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly */ 205005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly public static final String EXTRA_RSSI = "android.bluetooth.device.extra.RSSI"; 206005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly 207005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly /** 208f76a50ce8fdc6aea22cabc77b2977a1a15a79630Ken Wakasa * Used as a Parcelable {@link BluetoothClass} extra field in {@link 209005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * #ACTION_FOUND} and {@link #ACTION_CLASS_CHANGED} intents. 210005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly */ 211005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly public static final String EXTRA_CLASS = "android.bluetooth.device.extra.CLASS"; 212005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly 213005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly /** 214005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * Used as an int extra field in {@link #ACTION_BOND_STATE_CHANGED} intents. 215005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * Contains the bond state of the remote device. 216005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Possible values are: 217005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * {@link #BOND_NONE}, 218005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * {@link #BOND_BONDING}, 219005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * {@link #BOND_BONDED}. 220005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly */ 221005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly public static final String EXTRA_BOND_STATE = "android.bluetooth.device.extra.BOND_STATE"; 222005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly /** 223005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * Used as an int extra field in {@link #ACTION_BOND_STATE_CHANGED} intents. 224005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * Contains the previous bond state of the remote device. 225005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Possible values are: 226005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * {@link #BOND_NONE}, 227005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * {@link #BOND_BONDING}, 228005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * {@link #BOND_BONDED}. 229005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly */ 230005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly public static final String EXTRA_PREVIOUS_BOND_STATE = 231005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly "android.bluetooth.device.extra.PREVIOUS_BOND_STATE"; 232005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly /** 233005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * Indicates the remote device is not bonded (paired). 234005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>There is no shared link key with the remote device, so communication 235005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * (if it is allowed at all) will be unauthenticated and unencrypted. 236005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly */ 237005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly public static final int BOND_NONE = 10; 238005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly /** 239005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * Indicates bonding (pairing) is in progress with the remote device. 240005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly */ 241005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly public static final int BOND_BONDING = 11; 242005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly /** 243005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * Indicates the remote device is bonded (paired). 244005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>A shared link keys exists locally for the remote device, so 245005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * communication can be authenticated and encrypted. 246005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p><i>Being bonded (paired) with a remote device does not necessarily 247f51eadaf1f83abfe16a609a4ded6d789494689b2Jake Hamby * mean the device is currently connected. It just means that the pending 248f51eadaf1f83abfe16a609a4ded6d789494689b2Jake Hamby * procedure was completed at some earlier time, and the link key is still 249005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * stored locally, ready to use on the next connection. 250005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * </i> 251005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly */ 252005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly public static final int BOND_BONDED = 12; 253005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly 254005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly /** @hide */ 255005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly public static final String EXTRA_REASON = "android.bluetooth.device.extra.REASON"; 256005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly /** @hide */ 257005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly public static final String EXTRA_PAIRING_VARIANT = 258005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly "android.bluetooth.device.extra.PAIRING_VARIANT"; 259005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly /** @hide */ 260c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh public static final String EXTRA_PAIRING_KEY = "android.bluetooth.device.extra.PAIRING_KEY"; 261005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly 262005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly /** 2631caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh * Broadcast Action: This intent is used to broadcast the {@link UUID} 264aef439e6f825c0cb99a2ac08c8207f48b7a9fe10Nick Pelly * wrapped as a {@link android.os.ParcelUuid} of the remote device after it 265aef439e6f825c0cb99a2ac08c8207f48b7a9fe10Nick Pelly * has been fetched. This intent is sent only when the UUIDs of the remote 266aef439e6f825c0cb99a2ac08c8207f48b7a9fe10Nick Pelly * device are requested to be fetched using Service Discovery Protocol 2671caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh * <p> Always contains the extra field {@link #EXTRA_DEVICE} 268ad2321027e9731711544b43378bd7b2f01890774Matthew Xie * <p> Always contains the extra field {@link #EXTRA_UUID} 2691caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh * <p>Requires {@link android.Manifest.permission#BLUETOOTH} to receive. 2701caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh */ 2711caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 2721caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh public static final String ACTION_UUID = 273ad2321027e9731711544b43378bd7b2f01890774Matthew Xie "android.bluetooth.device.action.UUID"; 2741caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh 2751caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh /** 276005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * Broadcast Action: Indicates a failure to retrieve the name of a remote 277005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * device. 278005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Always contains the extra field {@link #EXTRA_DEVICE}. 279005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Requires {@link android.Manifest.permission#BLUETOOTH} to receive. 280005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * @hide 281005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly */ 282005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly //TODO: is this actually useful? 283005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 284005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly public static final String ACTION_NAME_FAILED = 285005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly "android.bluetooth.device.action.NAME_FAILED"; 286005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly 287005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly /** @hide */ 288005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 289005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly public static final String ACTION_PAIRING_REQUEST = 290005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly "android.bluetooth.device.action.PAIRING_REQUEST"; 291005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly /** @hide */ 292005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 293005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly public static final String ACTION_PAIRING_CANCEL = 294005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly "android.bluetooth.device.action.PAIRING_CANCEL"; 295a4433af5ac677be7c1f63447c0cd78829bdee159Yue Lixin 296a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie /** @hide */ 297a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 298a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie public static final String ACTION_CONNECTION_ACCESS_REQUEST = 299a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie "android.bluetooth.device.action.CONNECTION_ACCESS_REQUEST"; 300a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie 301a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie /** @hide */ 302a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 303a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie public static final String ACTION_CONNECTION_ACCESS_REPLY = 304a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie "android.bluetooth.device.action.CONNECTION_ACCESS_REPLY"; 305a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie 306a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie /** @hide */ 307a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 308a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie public static final String ACTION_CONNECTION_ACCESS_CANCEL = 309a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie "android.bluetooth.device.action.CONNECTION_ACCESS_CANCEL"; 310a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie 311a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie /** 312a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie * Used as an extra field in {@link #ACTION_CONNECTION_ACCESS_REQUEST} intent. 313a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie * @hide 314a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie */ 315a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie public static final String EXTRA_ACCESS_REQUEST_TYPE = 316a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie "android.bluetooth.device.extra.ACCESS_REQUEST_TYPE"; 317a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie 318a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie /**@hide*/ 319a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie public static final int REQUEST_TYPE_PROFILE_CONNECTION = 1; 320a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie 321a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie /**@hide*/ 322a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie public static final int REQUEST_TYPE_PHONEBOOK_ACCESS = 2; 323a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie 324a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie /** 325a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie * Used as an extra field in {@link #ACTION_CONNECTION_ACCESS_REQUEST} intents, 326a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie * Contains package name to return reply intent to. 327a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie * @hide 328a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie */ 329a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie public static final String EXTRA_PACKAGE_NAME = "android.bluetooth.device.extra.PACKAGE_NAME"; 330a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie 331a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie /** 332a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie * Used as an extra field in {@link #ACTION_CONNECTION_ACCESS_REQUEST} intents, 333a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie * Contains class name to return reply intent to. 334a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie * @hide 335a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie */ 336a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie public static final String EXTRA_CLASS_NAME = "android.bluetooth.device.extra.CLASS_NAME"; 337a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie 338a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie /** 339a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie * Used as an extra field in {@link #ACTION_CONNECTION_ACCESS_REPLY} intent. 340a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie * @hide 341a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie */ 342a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie public static final String EXTRA_CONNECTION_ACCESS_RESULT = 343a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie "android.bluetooth.device.extra.CONNECTION_ACCESS_RESULT"; 344a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie 345a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie /**@hide*/ 346a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie public static final int CONNECTION_ACCESS_YES = 1; 347a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie 348a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie /**@hide*/ 349a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie public static final int CONNECTION_ACCESS_NO = 2; 350a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie 351a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie /** 352a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie * Used as an extra field in {@link #ACTION_CONNECTION_ACCESS_REPLY} intents, 353a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie * Contains boolean to indicate if the allowed response is once-for-all so that 354a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie * next request will be granted without asking user again. 355a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie * @hide 356a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie */ 357a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie public static final String EXTRA_ALWAYS_ALLOWED = 358a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie "android.bluetooth.device.extra.ALWAYS_ALLOWED"; 359a0c680393f2dd03a937c598b2cb9abf98a58152cMatthew Xie 360c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh /** 361c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * A bond attempt succeeded 362c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * @hide 363c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh */ 364b24e11baac589fe16426f2d243b460ab84991c7bNick Pelly public static final int BOND_SUCCESS = 0; 365c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh 366c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh /** 367c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * A bond attempt failed because pins did not match, or remote device did 36832d8571f509c392dca732c243e9b2138c15daecfJaikumar Ganesh * not respond to pin request in time 369c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * @hide 370c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh */ 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int UNBOND_REASON_AUTH_FAILED = 1; 372c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh 373c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh /** 374c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * A bond attempt failed because the other side explicitly rejected 37545e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * bonding 376c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * @hide 377c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh */ 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int UNBOND_REASON_AUTH_REJECTED = 2; 379c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh 380c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh /** 381c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * A bond attempt failed because we canceled the bonding process 382c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * @hide 383c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh */ 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int UNBOND_REASON_AUTH_CANCELED = 3; 385c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh 386c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh /** 387c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * A bond attempt failed because we could not contact the remote device 388c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * @hide 389c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh */ 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int UNBOND_REASON_REMOTE_DEVICE_DOWN = 4; 391c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh 392c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh /** 393c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * A bond attempt failed because a discovery is in progress 394c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * @hide 395c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh */ 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int UNBOND_REASON_DISCOVERY_IN_PROGRESS = 5; 397c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh 398c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh /** 399c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * A bond attempt failed because of authentication timeout 400c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * @hide 401c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh */ 40232d8571f509c392dca732c243e9b2138c15daecfJaikumar Ganesh public static final int UNBOND_REASON_AUTH_TIMEOUT = 6; 403c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh 404c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh /** 405c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * A bond attempt failed because of repeated attempts 406c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * @hide 407c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh */ 40832d8571f509c392dca732c243e9b2138c15daecfJaikumar Ganesh public static final int UNBOND_REASON_REPEATED_ATTEMPTS = 7; 409c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh 410c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh /** 411c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * A bond attempt failed because we received an Authentication Cancel 412c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * by remote end 413c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * @hide 414c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh */ 415e5d93b7ed983f98855555d560faf060836f1a52fJaikumar Ganesh public static final int UNBOND_REASON_REMOTE_AUTH_CANCELED = 8; 416c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh 417c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh /** 418c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * An existing bond was explicitly revoked 419c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * @hide 420c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh */ 421e5d93b7ed983f98855555d560faf060836f1a52fJaikumar Ganesh public static final int UNBOND_REASON_REMOVED = 9; 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 423c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh /** 424c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * The user will be prompted to enter a pin 425c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * @hide 426c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh */ 427b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh public static final int PAIRING_VARIANT_PIN = 0; 428c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh 429c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh /** 430c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * The user will be prompted to enter a passkey 431c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * @hide 432c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh */ 433b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh public static final int PAIRING_VARIANT_PASSKEY = 1; 434c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh 435c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh /** 436c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * The user will be prompted to confirm the passkey displayed on the screen 437c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * @hide 438c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh */ 43932d8571f509c392dca732c243e9b2138c15daecfJaikumar Ganesh public static final int PAIRING_VARIANT_PASSKEY_CONFIRMATION = 2; 440c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh 441c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh /** 442c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * The user will be prompted to accept or deny the incoming pairing request 443c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * @hide 444c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh */ 44532d8571f509c392dca732c243e9b2138c15daecfJaikumar Ganesh public static final int PAIRING_VARIANT_CONSENT = 3; 446c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh 447c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh /** 448c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * The user will be prompted to enter the passkey displayed on remote device 449c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * This is used for Bluetooth 2.1 pairing. 450c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * @hide 451c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh */ 45232d8571f509c392dca732c243e9b2138c15daecfJaikumar Ganesh public static final int PAIRING_VARIANT_DISPLAY_PASSKEY = 4; 453c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh 454c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh /** 455c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * The user will be prompted to enter the PIN displayed on remote device. 456c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * This is used for Bluetooth 2.0 pairing. 457c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * @hide 458c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh */ 459c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh public static final int PAIRING_VARIANT_DISPLAY_PIN = 5; 460c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh 461c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh /** 462c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * The user will be prompted to accept or deny the OOB pairing request 463c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh * @hide 464c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh */ 465c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh public static final int PAIRING_VARIANT_OOB_CONSENT = 6; 466c88b0c62c52ab76f1277f3c999d795d8ba527028Jaikumar Ganesh 4671caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh /** 4681caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh * Used as an extra field in {@link #ACTION_UUID} intents, 469aef439e6f825c0cb99a2ac08c8207f48b7a9fe10Nick Pelly * Contains the {@link android.os.ParcelUuid}s of the remote device which 470aef439e6f825c0cb99a2ac08c8207f48b7a9fe10Nick Pelly * is a parcelable version of {@link UUID}. 4711caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh */ 4721caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh public static final String EXTRA_UUID = "android.bluetooth.device.extra.UUID"; 4731caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh 47416fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly /** 47516fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly * Lazy initialization. Guaranteed final after first object constructed, or 47616fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly * getService() called. 47716fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly * TODO: Unify implementation of sService amongst BluetoothFoo API's 47816fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly */ 47916fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly private static IBluetooth sService; 480bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly 481bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly private final String mAddress; 482d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh 48316fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly /*package*/ static IBluetooth getService() { 484bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly synchronized (BluetoothDevice.class) { 485bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly if (sService == null) { 486f242b7b931898856bcbcb7ec36cacf43098ba544Nick Pelly IBinder b = ServiceManager.getService(BluetoothAdapter.BLUETOOTH_SERVICE); 487bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly if (b == null) { 488bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly throw new RuntimeException("Bluetooth service not available"); 489bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly } 490bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly sService = IBluetooth.Stub.asInterface(b); 491bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly } 492bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly } 49316fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly return sService; 49416fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly } 495bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly 49616fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly /** 49716fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly * Create a new BluetoothDevice 49816fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly * Bluetooth MAC address must be upper case, such as "00:11:22:33:AA:BB", 49916fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly * and is validated in this constructor. 50016fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly * @param address valid Bluetooth MAC address 50116fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly * @throws RuntimeException Bluetooth is not available on this platform 50216fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly * @throws IllegalArgumentException address is invalid 50316fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly * @hide 50416fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly */ 50516fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly /*package*/ BluetoothDevice(String address) { 50616fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly getService(); // ensures sService is initialized 507005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly if (!BluetoothAdapter.checkBluetoothAddress(address)) { 508bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly throw new IllegalArgumentException(address + " is not a valid Bluetooth address"); 509bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly } 510bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly 511bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly mAddress = address; 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 514bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly @Override 515bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public boolean equals(Object o) { 516bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly if (o instanceof BluetoothDevice) { 517bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return mAddress.equals(((BluetoothDevice)o).getAddress()); 518bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly } 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 522bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly @Override 523bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public int hashCode() { 524bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return mAddress.hashCode(); 525105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 526105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 52745e2704ff512d41e22af2801d76e96955469ce8dNick Pelly /** 52845e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * Returns a string representation of this BluetoothDevice. 52945e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * <p>Currently this is the Bluetooth hardware address, for example 53045e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * "00:11:22:AA:BB:CC". However, you should always use {@link #getAddress} 53145e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * if you explicitly require the Bluetooth hardware address in case the 53245e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * {@link #toString} representation changes in the future. 53345e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * @return string representation of this BluetoothDevice 53445e2704ff512d41e22af2801d76e96955469ce8dNick Pelly */ 535bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly @Override 536bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public String toString() { 537bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return mAddress; 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 540bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public int describeContents() { 541bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return 0; 542bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly } 543bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly 544bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public static final Parcelable.Creator<BluetoothDevice> CREATOR = 545bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly new Parcelable.Creator<BluetoothDevice>() { 546bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public BluetoothDevice createFromParcel(Parcel in) { 547bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return new BluetoothDevice(in.readString()); 548bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly } 549bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public BluetoothDevice[] newArray(int size) { 550bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return new BluetoothDevice[size]; 551bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly } 552bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly }; 553bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly 554bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public void writeToParcel(Parcel out, int flags) { 555bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly out.writeString(mAddress); 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 55845e2704ff512d41e22af2801d76e96955469ce8dNick Pelly /** 55945e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * Returns the hardware address of this BluetoothDevice. 56045e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * <p> For example, "00:11:22:AA:BB:CC". 56145e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * @return Bluetooth hardware address as string 56245e2704ff512d41e22af2801d76e96955469ce8dNick Pelly */ 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getAddress() { 564bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return mAddress; 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 56845e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * Get the friendly Bluetooth name of the remote device. 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 57045e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * <p>The local adapter will automatically retrieve remote names when 57145e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * performing a device scan, and will cache them. This method just returns 57245e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * the name for this device from the cache. 573de893f550301a60274e87aa8168225e7a7a42184Nick Pelly * <p>Requires {@link android.Manifest.permission#BLUETOOTH} 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the Bluetooth name, or null if there was a problem. 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getName() { 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 579bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return sService.getRemoteName(mAddress); 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) {Log.e(TAG, "", e);} 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 585269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie * Get the Bluetooth alias of the remote device. 586269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie * <p>Alias is the locally modified name of a remote device. 587269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie * 588269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie * @return the Bluetooth alias, or null if no alias or there was a problem 589269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie * @hide 590269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie */ 591269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie public String getAlias() { 592269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie try { 593269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie return sService.getRemoteAlias(mAddress); 594269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie } catch (RemoteException e) {Log.e(TAG, "", e);} 595269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie return null; 596269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie } 597269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie 598269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie /** 599269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie * Set the Bluetooth alias of the remote device. 600269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie * <p>Alias is the locally modified name of a remote device. 601269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie * <p>This methoid overwrites the alias. The changed 602269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie * alias is saved in the local storage so that the change 603269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie * is preserved over power cycle. 604269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie * 605269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie * @return true on success, false on error 606269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie * @hide 607269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie */ 608269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie public boolean setAlias(String alias) { 609269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie try { 610269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie return sService.setRemoteAlias(mAddress, alias); 611269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie } catch (RemoteException e) {Log.e(TAG, "", e);} 612269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie return false; 613269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie } 614269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie 615269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie /** 616269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie * Get the Bluetooth alias of the remote device. 617269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie * If Alias is null, get the Bluetooth name instead. 618269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie * @see #getAlias() 619269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie * @see #getName() 620269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie * 621269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie * @return the Bluetooth alias, or null if no alias or there was a problem 622269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie * @hide 623269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie */ 624269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie public String getAliasName() { 625269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie String name = getAlias(); 626269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie if (name == null) { 627269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie name = getName(); 628269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie } 629269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie return name; 630269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie } 631269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie 632269e81a563cfe080d7f241d0d46411d3c946c111Matthew Xie /** 633005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * Start the bonding (pairing) process with the remote device. 634005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>This is an asynchronous call, it will return immediately. Register 635005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * for {@link #ACTION_BOND_STATE_CHANGED} intents to be notified when 636005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * the bonding process completes, and its result. 637005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Android system services will handle the necessary user interactions 638005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * to confirm and complete the bonding process. 639005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN}. 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 641005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * @return false on immediate error, true if bonding will begin 64218b1e79a123b979d25bfa5d0b0ee5d0382dbd64bNick Pelly * @hide 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 644bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public boolean createBond() { 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 646bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return sService.createBond(mAddress); 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) {Log.e(TAG, "", e);} 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 652cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * Start the bonding (pairing) process with the remote device using the 653cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * Out Of Band mechanism. 654cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * 655cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * <p>This is an asynchronous call, it will return immediately. Register 656cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * for {@link #ACTION_BOND_STATE_CHANGED} intents to be notified when 657cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * the bonding process completes, and its result. 658cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * 659cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * <p>Android system services will handle the necessary user interactions 660cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * to confirm and complete the bonding process. 661cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * 662cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN}. 663cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * 664cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * @param hash - Simple Secure pairing hash 665cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * @param randomizer - The random key obtained using OOB 666cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * @return false on immediate error, true if bonding will begin 667cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * 668cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * @hide 669cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh */ 670cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh public boolean createBondOutOfBand(byte[] hash, byte[] randomizer) { 671cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh try { 672cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh return sService.createBondOutOfBand(mAddress, hash, randomizer); 673cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh } catch (RemoteException e) {Log.e(TAG, "", e);} 674cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh return false; 675cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh } 676cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh 677cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh /** 678cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * Set the Out Of Band data for a remote device to be used later 679cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * in the pairing mechanism. Users can obtain this data through other 680cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * trusted channels 681cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * 682cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN}. 683cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * 684cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * @param hash Simple Secure pairing hash 685cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * @param randomizer The random key obtained using OOB 686cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * @return false on error; true otherwise 687cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * 688cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh * @hide 689cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh */ 690cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh public boolean setDeviceOutOfBandData(byte[] hash, byte[] randomizer) { 691cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh try { 692cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh return sService.setDeviceOutOfBandData(mAddress, hash, randomizer); 693cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh } catch (RemoteException e) {Log.e(TAG, "", e);} 694cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh return false; 695cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh } 696cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh 697cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh /** 698005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * Cancel an in-progress bonding request started with {@link #createBond}. 699005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN}. 700005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * 701f51eadaf1f83abfe16a609a4ded6d789494689b2Jake Hamby * @return true on success, false on error 70218b1e79a123b979d25bfa5d0b0ee5d0382dbd64bNick Pelly * @hide 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 704bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public boolean cancelBondProcess() { 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 706bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return sService.cancelBondProcess(mAddress); 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) {Log.e(TAG, "", e);} 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 712005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * Remove bond (pairing) with the remote device. 713005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Delete the link key associated with the remote device, and 714005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * immediately terminate connections to that device that require 715005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * authentication and encryption. 716005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN}. 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 718f51eadaf1f83abfe16a609a4ded6d789494689b2Jake Hamby * @return true on success, false on error 71918b1e79a123b979d25bfa5d0b0ee5d0382dbd64bNick Pelly * @hide 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 721bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public boolean removeBond() { 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 723bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return sService.removeBond(mAddress); 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) {Log.e(TAG, "", e);} 725bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return false; 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 729005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * Get the bond state of the remote device. 730005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Possible values for the bond state are: 731005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * {@link #BOND_NONE}, 732005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * {@link #BOND_BONDING}, 733005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * {@link #BOND_BONDED}. 734005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Requires {@link android.Manifest.permission#BLUETOOTH}. 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 736005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * @return the bond state 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 738bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public int getBondState() { 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 740bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return sService.getBondState(mAddress); 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) {Log.e(TAG, "", e);} 742005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly return BOND_NONE; 743005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly } 744005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly 745005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly /** 746005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * Get the Bluetooth class of the remote device. 747005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * <p>Requires {@link android.Manifest.permission#BLUETOOTH}. 748005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * 749005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly * @return Bluetooth class object, or null on error 750005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly */ 751005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly public BluetoothClass getBluetoothClass() { 752005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly try { 753005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly int classInt = sService.getRemoteClass(mAddress); 754005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly if (classInt == BluetoothClass.ERROR) return null; 755005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly return new BluetoothClass(classInt); 756005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly } catch (RemoteException e) {Log.e(TAG, "", e);} 757005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly return null; 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 760efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue /** 761efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue * Get trust state of a remote device. 762e6ee3be1c254404dad842298f6f56c11cc6c7ac8Nick Pelly * <p>Requires {@link android.Manifest.permission#BLUETOOTH}. 763efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue * @hide 764efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue */ 765efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue public boolean getTrustState() { 766efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue try { 767efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue return sService.getTrustState(mAddress); 768efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue } catch (RemoteException e) { 769efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue Log.e(TAG, "", e); 770efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue } 771efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue return false; 772efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue } 773efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue 774efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue /** 775efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue * Set trust state for a remote device. 776e6ee3be1c254404dad842298f6f56c11cc6c7ac8Nick Pelly * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN}. 777efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue * @param value the trust state value (true or false) 778efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue * @hide 779efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue */ 780efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue public boolean setTrust(boolean value) { 781efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue try { 782efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue return sService.setTrust(mAddress, value); 783efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue } catch (RemoteException e) { 784efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue Log.e(TAG, "", e); 785efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue } 786efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue return false; 787efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue } 788efa1dd716da3372cc74a201d11de5e0ef1a9fe9aLixin Yue 789ad2321027e9731711544b43378bd7b2f01890774Matthew Xie /** 790ad2321027e9731711544b43378bd7b2f01890774Matthew Xie * Returns the supported features (UUIDs) of the remote device. 791ad2321027e9731711544b43378bd7b2f01890774Matthew Xie * 792ad2321027e9731711544b43378bd7b2f01890774Matthew Xie * <p>This method does not start a service discovery procedure to retrieve the UUIDs 793ad2321027e9731711544b43378bd7b2f01890774Matthew Xie * from the remote device. Instead, the local cached copy of the service 794ad2321027e9731711544b43378bd7b2f01890774Matthew Xie * UUIDs are returned. 795ad2321027e9731711544b43378bd7b2f01890774Matthew Xie * <p>Use {@link #fetchUuidsWithSdp} if fresh UUIDs are desired. 796ad2321027e9731711544b43378bd7b2f01890774Matthew Xie * <p>Requires {@link android.Manifest.permission#BLUETOOTH}. 797ad2321027e9731711544b43378bd7b2f01890774Matthew Xie * 798ad2321027e9731711544b43378bd7b2f01890774Matthew Xie * @return the supported features (UUIDs) of the remote device, 799ad2321027e9731711544b43378bd7b2f01890774Matthew Xie * or null on error 800ad2321027e9731711544b43378bd7b2f01890774Matthew Xie */ 801dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh public ParcelUuid[] getUuids() { 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 803bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return sService.getRemoteUuids(mAddress); 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) {Log.e(TAG, "", e);} 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 807d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh 8081caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh /** 809ad2321027e9731711544b43378bd7b2f01890774Matthew Xie * Perform a service discovery on the remote device to get the UUIDs supported. 810ad2321027e9731711544b43378bd7b2f01890774Matthew Xie * 811ad2321027e9731711544b43378bd7b2f01890774Matthew Xie * <p>This API is asynchronous and {@link #ACTION_UUID} intent is sent, 812ad2321027e9731711544b43378bd7b2f01890774Matthew Xie * with the UUIDs supported by the remote end. If there is an error 813ad2321027e9731711544b43378bd7b2f01890774Matthew Xie * in getting the SDP records or if the process takes a long time, 814ad2321027e9731711544b43378bd7b2f01890774Matthew Xie * {@link #ACTION_UUID} intent is sent with the UUIDs that is currently 815ad2321027e9731711544b43378bd7b2f01890774Matthew Xie * present in the cache. Clients should use the {@link #getUuids} to get UUIDs 816ad2321027e9731711544b43378bd7b2f01890774Matthew Xie * if service discovery is not to be performed. 817ad2321027e9731711544b43378bd7b2f01890774Matthew Xie * <p>Requires {@link android.Manifest.permission#BLUETOOTH}. 8181caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh * 819ad2321027e9731711544b43378bd7b2f01890774Matthew Xie * @return False if the sanity check fails, True if the process 8201caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh * of initiating an ACL connection to the remote device 8211caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh * was started. 8221caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh */ 8231caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh public boolean fetchUuidsWithSdp() { 8241caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh try { 82516fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly return sService.fetchRemoteUuids(mAddress, null, null); 8261caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh } catch (RemoteException e) {Log.e(TAG, "", e);} 8271caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh return false; 8281caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh } 8291caa6d111eff6814760ec156b14adc29aa3aae6cJaikumar Ganesh 83045e2704ff512d41e22af2801d76e96955469ce8dNick Pelly /** @hide */ 831dd0463aef18d251c741bfc9dc7a2787443ef36f1Jaikumar Ganesh public int getServiceChannel(ParcelUuid uuid) { 832d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh try { 833bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return sService.getRemoteServiceChannel(mAddress, uuid); 834d5ac1ae36b4e096eb97984334f86d0c68abea2f7Jaikumar Ganesh } catch (RemoteException e) {Log.e(TAG, "", e);} 835b24e11baac589fe16426f2d243b460ab84991c7bNick Pelly return BluetoothDevice.ERROR; 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 83845e2704ff512d41e22af2801d76e96955469ce8dNick Pelly /** @hide */ 839bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public boolean setPin(byte[] pin) { 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 841bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return sService.setPin(mAddress, pin); 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) {Log.e(TAG, "", e);} 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 845b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh 84645e2704ff512d41e22af2801d76e96955469ce8dNick Pelly /** @hide */ 847bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public boolean setPasskey(int passkey) { 848b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh try { 849bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return sService.setPasskey(mAddress, passkey); 850b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh } catch (RemoteException e) {Log.e(TAG, "", e);} 851b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh return false; 852b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh } 853b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh 85445e2704ff512d41e22af2801d76e96955469ce8dNick Pelly /** @hide */ 855bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public boolean setPairingConfirmation(boolean confirm) { 856b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh try { 857bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return sService.setPairingConfirmation(mAddress, confirm); 858b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh } catch (RemoteException e) {Log.e(TAG, "", e);} 859b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh return false; 860b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh } 861b0eca41de0bb6747d8648b134912782e45e4cbefJaikumar Ganesh 86245e2704ff512d41e22af2801d76e96955469ce8dNick Pelly /** @hide */ 863cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh public boolean setRemoteOutOfBandData() { 864cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh try { 865cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh return sService.setRemoteOutOfBandData(mAddress); 866cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh } catch (RemoteException e) {Log.e(TAG, "", e);} 867cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh return false; 868cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh } 869cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh 870cc5494c9996f809e36539b24e8b6b67683383d29Jaikumar Ganesh /** @hide */ 871bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public boolean cancelPairingUserInput() { 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 873bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly return sService.cancelPairingUserInput(mAddress); 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) {Log.e(TAG, "", e);} 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8783fbf7b62bb48b10316353087d09cc3720af00642Jaikumar Ganesh /** @hide */ 8793fbf7b62bb48b10316353087d09cc3720af00642Jaikumar Ganesh public boolean isBluetoothDock() { 8803fbf7b62bb48b10316353087d09cc3720af00642Jaikumar Ganesh try { 8813fbf7b62bb48b10316353087d09cc3720af00642Jaikumar Ganesh return sService.isBluetoothDock(mAddress); 8823fbf7b62bb48b10316353087d09cc3720af00642Jaikumar Ganesh } catch (RemoteException e) {Log.e(TAG, "", e);} 8833fbf7b62bb48b10316353087d09cc3720af00642Jaikumar Ganesh return false; 8843fbf7b62bb48b10316353087d09cc3720af00642Jaikumar Ganesh } 8853fbf7b62bb48b10316353087d09cc3720af00642Jaikumar Ganesh 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 88745e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * Create an RFCOMM {@link BluetoothSocket} ready to start a secure 88816fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly * outgoing connection to this remote device on given channel. 88945e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * <p>The remote device will be authenticated and communication on this 89045e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * socket will be encrypted. 891c8fa4ff838a0c3d2c67db65540fa751e5abe27edJaikumar Ganesh * <p> Use this socket only if an authenticated socket link is possible. 892c8fa4ff838a0c3d2c67db65540fa751e5abe27edJaikumar Ganesh * Authentication refers to the authentication of the link key to 893c8fa4ff838a0c3d2c67db65540fa751e5abe27edJaikumar Ganesh * prevent man-in-the-middle type of attacks. 894c8fa4ff838a0c3d2c67db65540fa751e5abe27edJaikumar Ganesh * For example, for Bluetooth 2.1 devices, if any of the devices does not 895c8fa4ff838a0c3d2c67db65540fa751e5abe27edJaikumar Ganesh * have an input and output capability or just has the ability to 896c8fa4ff838a0c3d2c67db65540fa751e5abe27edJaikumar Ganesh * display a numeric key, a secure socket connection is not possible. 897c8fa4ff838a0c3d2c67db65540fa751e5abe27edJaikumar Ganesh * In such a case, use {#link createInsecureRfcommSocket}. 898c8fa4ff838a0c3d2c67db65540fa751e5abe27edJaikumar Ganesh * For more details, refer to the Security Model section 5.2 (vol 3) of 899c8fa4ff838a0c3d2c67db65540fa751e5abe27edJaikumar Ganesh * Bluetooth Core Specification version 2.1 + EDR. 900f51eadaf1f83abfe16a609a4ded6d789494689b2Jake Hamby * <p>Use {@link BluetoothSocket#connect} to initiate the outgoing 90145e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * connection. 90245e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * <p>Valid RFCOMM channels are in range 1 to 30. 903cf44059813539bf7f36dabd278cef93ba3122c56Nick Pelly * <p>Requires {@link android.Manifest.permission#BLUETOOTH} 904de893f550301a60274e87aa8168225e7a7a42184Nick Pelly * 90545e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * @param channel RFCOMM channel to connect to 90645e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * @return a RFCOMM BluetoothServerSocket ready for an outgoing connection 907bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * @throws IOException on error, for example Bluetooth not available, or 90845e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * insufficient permissions 90916fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly * @hide 910bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly */ 91145e2704ff512d41e22af2801d76e96955469ce8dNick Pelly public BluetoothSocket createRfcommSocket(int channel) throws IOException { 91216fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly return new BluetoothSocket(BluetoothSocket.TYPE_RFCOMM, -1, true, true, this, channel, 91316fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly null); 91416fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly } 91516fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly 91616fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly /** 91716fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly * Create an RFCOMM {@link BluetoothSocket} ready to start a secure 91816fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly * outgoing connection to this remote device using SDP lookup of uuid. 91916fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly * <p>This is designed to be used with {@link 92016fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly * BluetoothAdapter#listenUsingRfcommWithServiceRecord} for peer-peer 92116fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly * Bluetooth applications. 922f51eadaf1f83abfe16a609a4ded6d789494689b2Jake Hamby * <p>Use {@link BluetoothSocket#connect} to initiate the outgoing 92316fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly * connection. This will also perform an SDP lookup of the given uuid to 92416fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly * determine which channel to connect to. 92516fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly * <p>The remote device will be authenticated and communication on this 92616fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly * socket will be encrypted. 927c8fa4ff838a0c3d2c67db65540fa751e5abe27edJaikumar Ganesh * <p> Use this socket only if an authenticated socket link is possible. 928c8fa4ff838a0c3d2c67db65540fa751e5abe27edJaikumar Ganesh * Authentication refers to the authentication of the link key to 929c8fa4ff838a0c3d2c67db65540fa751e5abe27edJaikumar Ganesh * prevent man-in-the-middle type of attacks. 930c8fa4ff838a0c3d2c67db65540fa751e5abe27edJaikumar Ganesh * For example, for Bluetooth 2.1 devices, if any of the devices does not 931c8fa4ff838a0c3d2c67db65540fa751e5abe27edJaikumar Ganesh * have an input and output capability or just has the ability to 932c8fa4ff838a0c3d2c67db65540fa751e5abe27edJaikumar Ganesh * display a numeric key, a secure socket connection is not possible. 933c8fa4ff838a0c3d2c67db65540fa751e5abe27edJaikumar Ganesh * In such a case, use {#link createInsecureRfcommSocketToServiceRecord}. 934c8fa4ff838a0c3d2c67db65540fa751e5abe27edJaikumar Ganesh * For more details, refer to the Security Model section 5.2 (vol 3) of 935c8fa4ff838a0c3d2c67db65540fa751e5abe27edJaikumar Ganesh * Bluetooth Core Specification version 2.1 + EDR. 936ea5056e5a705048f8495131ab0dcf087a2633fedNick Pelly * <p>Hint: If you are connecting to a Bluetooth serial board then try 937ea5056e5a705048f8495131ab0dcf087a2633fedNick Pelly * using the well-known SPP UUID 00001101-0000-1000-8000-00805F9B34FB. 938ea5056e5a705048f8495131ab0dcf087a2633fedNick Pelly * However if you are connecting to an Android peer then please generate 939ea5056e5a705048f8495131ab0dcf087a2633fedNick Pelly * your own unique UUID. 94016fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly * <p>Requires {@link android.Manifest.permission#BLUETOOTH} 94116fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly * 94216fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly * @param uuid service record uuid to lookup RFCOMM channel 94316fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly * @return a RFCOMM BluetoothServerSocket ready for an outgoing connection 94416fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly * @throws IOException on error, for example Bluetooth not available, or 94516fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly * insufficient permissions 94616fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly */ 94716fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly public BluetoothSocket createRfcommSocketToServiceRecord(UUID uuid) throws IOException { 94816fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly return new BluetoothSocket(BluetoothSocket.TYPE_RFCOMM, -1, true, true, this, -1, 94916fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly new ParcelUuid(uuid)); 950bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly } 951bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly 952bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly /** 9536eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh * Create an RFCOMM {@link BluetoothSocket} socket ready to start an insecure 9546eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh * outgoing connection to this remote device using SDP lookup of uuid. 9556eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh * <p> The communication channel will not have an authenticated link key 9566eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh * i.e it will be subject to man-in-the-middle attacks. For Bluetooth 2.1 9576eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh * devices, the link key will be encrypted, as encryption is mandatory. 9586eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh * For legacy devices (pre Bluetooth 2.1 devices) the link key will 9596eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh * be not be encrypted. Use {@link #createRfcommSocketToServiceRecord} if an 9606eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh * encrypted and authenticated communication channel is desired. 9616eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh * <p>This is designed to be used with {@link 9626eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh * BluetoothAdapter#listenUsingInsecureRfcommWithServiceRecord} for peer-peer 9636eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh * Bluetooth applications. 9646eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh * <p>Use {@link BluetoothSocket#connect} to initiate the outgoing 9656eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh * connection. This will also perform an SDP lookup of the given uuid to 9666eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh * determine which channel to connect to. 9676eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh * <p>The remote device will be authenticated and communication on this 9686eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh * socket will be encrypted. 9696eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh * <p>Hint: If you are connecting to a Bluetooth serial board then try 9706eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh * using the well-known SPP UUID 00001101-0000-1000-8000-00805F9B34FB. 9716eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh * However if you are connecting to an Android peer then please generate 9726eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh * your own unique UUID. 9736eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh * <p>Requires {@link android.Manifest.permission#BLUETOOTH} 9746eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh * 9756eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh * @param uuid service record uuid to lookup RFCOMM channel 9766eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh * @return a RFCOMM BluetoothServerSocket ready for an outgoing connection 9776eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh * @throws IOException on error, for example Bluetooth not available, or 9786eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh * insufficient permissions 9796eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh */ 9806eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh public BluetoothSocket createInsecureRfcommSocketToServiceRecord(UUID uuid) throws IOException { 9816eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh return new BluetoothSocket(BluetoothSocket.TYPE_RFCOMM, -1, false, false, this, -1, 9826eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh new ParcelUuid(uuid)); 9836eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh } 9846eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh 9856eef14a7fcf6b6338f21f760830abf369ca0137dJaikumar Ganesh /** 986bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * Construct an insecure RFCOMM socket ready to start an outgoing 987bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * connection. 988bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * Call #connect on the returned #BluetoothSocket to begin the connection. 989bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * The remote device will not be authenticated and communication on this 990bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * socket will not be encrypted. 991e6ee3be1c254404dad842298f6f56c11cc6c7ac8Nick Pelly * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN} 992e6ee3be1c254404dad842298f6f56c11cc6c7ac8Nick Pelly * 993bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * @param port remote port 994bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * @return An RFCOMM BluetoothSocket 995bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * @throws IOException On error, for example Bluetooth not available, or 996bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * insufficient permissions. 99745e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * @hide 998bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly */ 999bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public BluetoothSocket createInsecureRfcommSocket(int port) throws IOException { 100016fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly return new BluetoothSocket(BluetoothSocket.TYPE_RFCOMM, -1, false, false, this, port, 100116fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly null); 1002bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly } 1003bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly 1004bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly /** 1005bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * Construct a SCO socket ready to start an outgoing connection. 1006bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * Call #connect on the returned #BluetoothSocket to begin the connection. 1007e6ee3be1c254404dad842298f6f56c11cc6c7ac8Nick Pelly * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN} 1008e6ee3be1c254404dad842298f6f56c11cc6c7ac8Nick Pelly * 1009bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * @return a SCO BluetoothSocket 1010bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * @throws IOException on error, for example Bluetooth not available, or 1011bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly * insufficient permissions. 101245e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * @hide 1013bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly */ 1014bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly public BluetoothSocket createScoSocket() throws IOException { 101516fb88a673c41b93c5d57ccb28c2697e7d87701aNick Pelly return new BluetoothSocket(BluetoothSocket.TYPE_SCO, -1, true, true, this, -1, null); 1016bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly } 1017bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly 1018bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly /** 10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Check that a pin is valid and convert to byte array. 10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1021f51eadaf1f83abfe16a609a4ded6d789494689b2Jake Hamby * Bluetooth pin's are 1 to 16 bytes of UTF-8 characters. 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pin pin as java String 1023f51eadaf1f83abfe16a609a4ded6d789494689b2Jake Hamby * @return the pin code as a UTF-8 byte array, or null if it is an invalid 10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Bluetooth pin. 102545e2704ff512d41e22af2801d76e96955469ce8dNick Pelly * @hide 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static byte[] convertPinToBytes(String pin) { 10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pin == null) { 10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] pinBytes; 10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1033f51eadaf1f83abfe16a609a4ded6d789494689b2Jake Hamby pinBytes = pin.getBytes("UTF-8"); 10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (UnsupportedEncodingException uee) { 1035f51eadaf1f83abfe16a609a4ded6d789494689b2Jake Hamby Log.e(TAG, "UTF-8 not supported?!?"); // this should not happen 10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pinBytes.length <= 0 || pinBytes.length > 16) { 10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pinBytes; 10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1045