7

I have a wrapper class (BluetoothDiscoverer) which is instantiated within a Service. This class obtains a BluetoothAdapter and checks whether Bluetooth is enabled before scanning for neighbouring devices.

Now if Bluetooth is not enabled I want to be able to do the following within this class (BluetoothDiscoverer):

Intent enableBluetoothIntent  = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

startActivityForResult(enableBluetoothIntent, BLUETOOTH_ENABLER);

Now I have read this: use startActivityForResult from non-activity

but I don't want to pass my Main Activity into this object since I want to deal with the result (whether the user accepts to enable bluetooth or not) within the BluetoothDiscoverer class.

Now If I make BluetoothDiscoverer a subclass of Activity

I seem to be getting a NullPointerException when the startActivityForResult is about to be called.

I think this is because I need to add an onCreate()/onDestroy() method, but this defeats the purpose of what I am doing as I need to be able to call methods on the BluetoothDiscoverer object within the service that instantiates this class.

I also need to register a broadcast receiver for retrieving neighbouring devices when a scan is initiated. If the BluetoothDiscoverer class is not an Activity, how do I register this receiver?

Is there a work around for this?

Thank you Andreas

Community
  • 1
  • 1
kkudi
  • 1,625
  • 4
  • 25
  • 47

2 Answers2

6

startActivityForResult() is only available from real on-screen activities. Please redesign your application so that the user interface is driven from activities, then have your service scan for devices.

I also need to register a broadcast receiver for retrieving neighbouring devices when a scan is initiated. If the BluetoothDiscoverer class is not an Activity, how do I register this receiver?

You get rid of BluetoothDiscoverer and move its logic into the Service, which is a Context and therefore can register receivers.

CommonsWare
  • 986,068
  • 189
  • 2,389
  • 2,491
0

In your Service, create an Activity whose purpose is to request Bluetooth discoverability. Pass a Messenger along with the Intent for this Activity and have the Activity start the discoverability activity:

Intent enableBluetoothIntent  = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBluetoothIntent, BLUETOOTH_ENABLER);

Then, inside onActivityResult() send a message via the Messenger back to your service.

Little Endian
  • 784
  • 8
  • 19