在服务中使用Android蓝牙

5

我有一个服务,理论上可以在没有与之关联的Activity的情况下工作(就像“服务”在Android平台上的意图一样)。

该服务使用蓝牙,特别是注册了一个具有给定名称的蓝牙服务来侦听通信。当然,为了使其工作,必须启用蓝牙。

正如蓝牙api文档所示,我正在使用BluetoothAdapter.ACTION_REQUEST_ENABLE来提示用户在情况下启用蓝牙,如果它尚未打开。然而,这是一个活动,因此需要从另一个活动中调用,即:

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

我希望实现的是服务(例如在启动时启动)与任何活动完全解耦,因此不需要InstanceOfAnActivity来启动弹出窗口指示用户打开蓝牙。
我知道有(臭名昭着的)调用BluetoothAdapter.enable(),但文档说不应直接调用。
那么,有什么提示/解决方案可以解决这个问题吗?(也许很容易,只是我漏掉了什么…)

现在已经过了几个月,我想知道您是否能够解决这个问题? - Brad Hein
"Beautiful widgets" 如何在未经用户允许的情况下打开蓝牙? - Pachanka
2个回答

5

startActivity() 不是一个严格的 Activity 方法 - 它是一个 Context 方法,被 Activity Service 继承。

但有一件事需要注意 - 如 Service.startActivity() 文档所指出的那样,"如果该方法是从 Activity 上下文之外调用的,则 Intent 必须包含 FLAG_ACTIVITY_NEW_TASK 启动标志"。

因此,将 'context' 绑定到 Service 实例后,以下代码应该可以正常工作:

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

我该如何处理活动的结果? - dnkilic

1

以下是文档内容:

未经用户直接同意,不应启用蓝牙。 如果要打开蓝牙以创建无线连接,您应该使用ACTION_REQUEST_ENABLE意图,它会引发一个对话框,请求用户权限打开蓝牙。 enable()方法仅适用于包括用于更改系统设置的用户界面(例如“电源管理器”应用程序)的应用程序。

请注意,文档没有说不要直接调用BluetoothAdapter.enable(),它只是说如果从用户那里得到了允许,才要调用它。这意味着您需要一个配置屏幕,询问用户是否同意您的服务打开蓝牙,以便他们可以对此进行控制。


问题是是否可以要求用户打开蓝牙,然后处理结果,而不需要专门创建用于处理该操作的活动上下文。 - bochko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接