Revision as of 18:03, 19 February 2009 by namesan (Talk | contribs)

Changing Bluetooth discoverability in Java ME

From Nokia Developer Wiki
Jump to: navigation, search


Article Metadata
Tested with
Devices(s): Nokia N78, Nokia 5800 XM, Nokia 6131
Keywords: javax.bluetooth.BluetoothStateException, javax.bluetooth.DiscoveryAgent, javax.bluetooth.LocalDevice
Created: (31 Jan 2009)
Last edited: namesan (19 Feb 2009)


The folowing code snippet demonstrates how to change discoverability using Bluetooth API.

Discoverability mode can be set using LocalDevice.setDiscoverable method. This method takes discoverability Id as a parameter. This parameter must hold one of the folowing values:


More information on discoverability modes can be found in JSR-82 specification.


In order to test this snippet there should be at least one event in the database. Application needs permission to read and write PIM database data.

Source file: DeleteEvent.java

* Allows to select discoer mode from Bluetooth device.

private List listModes;
* Discoverability mode id array.

private int[] modeArray;
* Instantiates a listModes.

private void setupModeList() {
listModes = new List( "Mode list", Choice.IMPLICIT );
listModes.setSelectCommand( CHANGE_COMMAND );
listModes.addCommand( BACK_COMMAND );
listModes.setCommandListener( this );
// adding discoverability modes to the list
listModes.append( "GIAC", null );
listModes.append( "LIAC", null );
listModes.append( "NOT DISCOVERABLE", null );
//setting mode id array values
modeArray[0] = DiscoveryAgent.GIAC;
modeArray[1] = DiscoveryAgent.LIAC;
modeArray[2] = DiscoveryAgent.NOT_DISCOVERABLE;
* From CommandListener.
* Called by the system to indicate that a command has been invoked on a
* particular displayable.
* @param command the command that was invoked
* @param displayable the displayable where the command was invoked

public void commandAction(Command command, Displayable displayable) {
if (command == EXIT_COMMAND) {
// Exit the MIDlet
} else if (command == EXECUTE_COMMAND) {
// Open discoverability mode list
display.setCurrent( listModes );
} else if ( command == CHANGE_COMMAND ) {
//get currently selected contact
int i = listModes.getSelectedIndex();
String item = listModes.getString( i );
printString( "Selected mode: " + item );
// Bringing back main form to the foreground
display.setCurrent( mainForm );
// Changing discoverability mode
changeMode( i );
} else if ( command == BACK_COMMAND ) {
display.setCurrent( mainForm );
* @param modeIndex

private void changeMode( int modeIndex ) {
LocalDevice devLocal = null;
try {
printString( "Getting local device ..." );
devLocal = LocalDevice.getLocalDevice();
} catch ( BluetoothStateException e ) {
printString( e.toString() );
try {
printString( "Chaning discoverability mode" );
devLocal.setDiscoverable( modeArray[ modeIndex ] );
} catch ( BluetoothStateException e ) {
printString( e.toString() );
printString( "Discoverability mode changed." );


When the MIDlet is started the main form with text field will be displayed. To change current bluetooth device mode you should press 'Modes' softkey, then a list of available modes will be displayed.

When the list appeared select a specific mode from the list and press 'Change' softkey. Main form will be brought to the foreground. If discoverability mode changing procedure succeeded, a Discoverability mode changed' mesage will appear.

Supplementary material

  • You can test the changing of Bluetooth discoverability in action in a simple, executable application into which this code snippet has been patched. The executables and source files are available for download at: Media:BtDiscoverabilityMode.zip.
  • You can examine all the changes that are required to implement the above mentioned features in an application. The changes are provided in unified diff and color-coded diff formats: Media:BtDiscoverabilityMode.diff.zip
165 page views in the last 30 days.