2010-03-09 85 views
3

我有一项理论上可以在没有与其关联的活动(因为“服务”在Android平台上)的情况下工作的服务。Android内部的蓝牙服务

此服务使用蓝牙,特别是注册具有侦听通信的给定名称的蓝牙服务。当然要工作它必须让蓝牙处于活动状态。

正如Bluetooth api文档中所示,我使用BluetoothAdapter.ACTION_REQUEST_ENABLE来提示用户启用蓝牙,以防它已经不在。其实,这不过是一个活动,因此需要从另一个活动调用,即:

Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 
InstanceOfAnActivity.startActivity(enableIntent); 

我想实现的是有服务(其中,例如,在开机启动时)与任何活动完全分离,因此不会让InstanceOfAnActivity启动弹出窗口,指示用户打开蓝牙。

现在,我知道有BluetoothAdapter.enable()这个(臭名昭着的)调用,但是由于doc说它不应该直接调用。

那么,任何提示/解决这个困境? (也许是容易的,我只是失去了一些东西......)

+0

这是几个月后的现在,我想知道,如果你能解决这个问题? – 2010-05-12 12:19:02

+0

“漂亮的小工具”如何在没有用户许可的情况下打开蓝牙? – Pachanka 2010-08-28 08:02:57

回答

2

这里的医生说什么

蓝牙不应该没有直接的用户同意的情况下启用。如果要打开蓝牙以创建无线连接,则应使用ACTION_REQUEST_ENABLE意图,这会引发请求用户许可以打开蓝牙的对话框。 enable()方法仅适用于包含用于更改系统设置的用户界面的应用程序,例如“电源管理器”应用程序。

注意,它并没有说直接调用BluetoothAdapter.enable(),只说要打电话,如果你已经得到了确定从用户。这意味着你需要一个配置屏幕,询问用户你的服务是否可以打开蓝牙,这样他们就可以控制它。

4

startActivity()并非严格意义上的Activity方法 - 它是Context方法,由Activity 服务继承。 但有一点需要注意,正如Service.startActivity()文档中指出的那样,“如果此方法是从活动上下文外部调用的,则意图必须包含FLAG_ACTIVITY_NEW_TASK启动标志”。

因此,与绑定到服务实例“语境”,下面应该工作:

Intent btIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 
btIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
context.startActivity(btIntent); 
+0

我该如何处理活动的结果? – dnkilic 2017-11-24 02:44:33