2011年5月17日火曜日

AndroidStudyMemo=Working with Bluetooth

Bluetooth APIs were made available as part of the Android 2.0 SDK. Clearly, that means

that not all Android devices have Bluetooth hardware. However, this is a popular consumer

feature that Android developers can use to their advantage.When Bluetooth hardware

is present,Android applications can

Scan for and discover Bluetooth devices and interact with the Bluetooth adapter.

n Establish RFCOMM connections and transfer data to and from devices via data

streams.

Maintain point-to-point and multipoint connections with Bluetooth devices and

manage multiple connections.

 

The Bluetooth APIs are part of the android.bluetooth package.As you might expect,

the application must have permission to use the Bluetooth services.The

android.permission.BLUETOOTH permission is required to connect to Bluetooth devices.

Similarly,Android applications must have the android.permission.BLUETOOTH_ADMIN

permission in order to administer Bluetooth hardware and related services, including tasks

enabling or disabling the hardware and performing discovery scans.

 

The Bluetooth APIs are divided into several useful classes, including

n The BluetoothAdapter class represents the Bluetooth radio hardware on the

local device.

The BluetoothDevice class represents a remote Bluetooth device.

The BluetoothServerSocket class is used to open a socket to listen for incoming

connections and provides a BluetoothSocket object when a connection is made.

The BluetoothSocket class is used by the client to establish a connection to a remote

device.After the device is connected, BluetoothSocket object is used by both

sides to handle the connection and retrieve the input and output streams.

 

 

Checking for the Existence of Bluetooth Hardware

The first thing to do when trying to enable Bluetooth functionality within your application

is to establish whether or not the device has a Bluetooth radio.You can do this by

calling and checking the return value of the BluetoothAdapter class's static method

called getDefaultAdapter().

              BluetoothAdapter btAdapter = BluetoothAdapter.getDefaultAdapter();

              if (btAdapter == null) {

                            Log.d(DEBUG_TAG, "No bluetooth available.");

                            // ...

              } else {

                            // bt available

              }

 

 

Enabling Bluetooth

After you have determined that the device has a Bluetooth radio, you need to check to

see if it is enabled using the BluetoothAdapter class method called isEnabled(). If the

Bluetooth adapter is enabled, you can proceed. Otherwise, you need to request that it is

turned on.This can be done in several ways:

 

Fire off the BluetoothAdapter.ACTION_REQUEST_ENABLE Intent using the

startActivityForResult() method.This launches an Activity that enables the

user to choose to turn on the Bluetooth adapter. If the result is RESULT_OK, then

Bluetooth has been enabled; otherwise, the user canceled the Bluetooth-enabling

process.

 

Call the BluetoothAdapter enable() method.This method should only be used

by applications that need to explicitly enable the Bluetooth radio and requires the

BLUETOOTH_ADMIN permission. In addition, it should only be performed as the

result of a direct request from the user, such as through a button, menu item, and

query dialog.

 

The process of making an Android device discoverable also automatically enables

Bluetooth.This can be achieved by firing off the BluetoothAdapter.ACTION_

REQUEST_DISCOVERABLE Intent using the startActivityForResult() method.

This launches an Activity that presents the user with a choice to make their

device discoverable for a set amount of time.

 

 

Querying for Paired Devices

You can use the BluetoothAdapter to query for available Bluetooth devices to connect

to.The getBondedDevices() method returns a set of BluetoothDevice objects that represent

the devices paired to the Bluetooth adapter.

              Set<BluetoothDevice> pairedBtDevices = btAdapt.getBondedDevices();

 

 

Discovering Devices

New Bluetooth devices must be discovered and paired to the adapter before use.You can

use the BluetoothAdapter to start and stop the discovery process for available Bluetooth

devices to connect to.The startDiscovery() method starts the discovery process asynchronously.

This method requires the android.permission.BLUETOOTH_ADMIN permission.

 

After you have initiated the discovery process, your application needs to register to

receive broadcasts for the following Intents:

ACTION_DISCOVERY_STARTED: Occurs when the discovery process initiates

ACTION_FOUND: Occurs each time a remote Bluetooth device is found

ACTION_DISCOVERY_FINISHED: Occurs when the discovery process completes

 

The discovery process is resource and time-intensive.You can use the isDiscovering()

method to test if the discovery process is currently underway.The cancelDiscovery()

method can be used to stop the discovery process.This method should also be used any

time a connection is about to be established with a remote Bluetooth device.

Establishing Connections Between Devices

 

The general idea behind connecting two devices via Bluetooth is for one device to find

the other device via whatever means necessary, depending upon whether it be a previously

paired device or found through discovery. After it's found, the device calls the

connect() method. Both devices then have a valid BluetoothSocket object that can be

used to retrieve the InputStream and OutputStream objects for initiating data communications

between the two devices.

 

 

running

on both devices, as it usually is, this means both devices should find a remote device

and both should be discoverable so they can also be found, as well as open a listening

socket via the BluetoothServerSocket object so they can receive incoming connection

requests, and be able to connect to the other device. Add to that the fact that both the

calls to the accept() method of the BluetoothServerSocket class and to the connect()

method of the BluetoothSocket class are blocking synchronous calls, and you can

quickly see you need to use some threads here. Discovery also uses a fair amount of the

Bluetooth hardware resources, so you need to cancel and then later restart this process as

appropriate. Performing discovery during a connection or even while attempting a connection

likely leads to negative device performance.

 

0 件のコメント:

コメントを投稿