【问题标题】:Make Bluetooth on Android 2.1 discoverable indefinitely使 Android 2.1 上的蓝牙无限期可发现
【发布时间】:2015-05-25 14:00:38
【问题描述】:

我正在从事一个涉及蓝牙和 Android 操作系统的研究项目。我需要让蓝牙无限期地被发现,以便项目继续进行。

问题:

  • Android 将可发现性限制为 300 秒。
  • 我不能每 300 秒要求用户重新打开可发现性,因为我的应用程序设计为在后台运行而不会打扰用户。
  • 据我所知,没有办法通过 Android 的 GUI 来增加时间。一些消息来源称这是一项安全功能,另一些消息来源称这是一个错误。两者可能都有一些道理......

我正在尝试/已经尝试过的:

  • 我正在尝试编辑cyanogenmod 的稳定版本以关闭可发现性计时器(这是可能的;有一个配置文件需要更改一个数字)。这不起作用,因为我对生成的包有验证问题。
  • 在过去的一周里,我下载了cyanogenmod source code,更改了一个相关类,希望它可以无限期地发现蓝牙,并尝试recompile.这不起作用,因为(a)repo经常更改,导致无法编译的不稳定代码库(或者,可能是我使用不正确;仅仅因为在许多情况下它看起来是代码的错误并不意味着我应该将所有问题归咎于我遇到!)和(b)回购决定定期“忽略”我(但总是,因为我之前已经获得了代码库!),回复我的同步/连接尝试:

    致命:远端意外挂断

如您所想,上述两个问题存在问题,处理起来非常令人沮丧。
更多信息:

  • 我正在通过 cyanogenmod(我相信是 v5)运行 Android 2.1。这意味着手机也已植根。
  • 我有一个开发者手机,这意味着引导加载程序已解锁。
  • 我的手机是 HTC Magic (32B)。

大问题:

  • 如何让蓝牙在 Android 上无限期被发现?

【问题讨论】:

  • 如果你有源代码,你可以使用一些私有的 api 每 300 秒直接打开蓝牙。但是我真的不知道这是否可能以及如何做到这一点。
  • 我实际上可以更改源代码中的一些值并(理论上)完全关闭 300 秒计时器。不幸的是,我在编译时遇到了很多问题,这就是我在这里寻找替代方案的原因。但是,如果我可以编译它并且我的第一个想法失败了,那么这是一个非常合理的解决方案。我会记住的,谢谢!
  • 但是关闭 300 秒计时器是否意味着用户需要您的自定义 rom?
  • 由于这是一个研究项目,我们(我自己和其他研究人员)正在分发我们自己的手机,每部手机都有定制的 rom。
  • 哦,那我认为那将是最好的选择。

标签: android bluetooth


【解决方案1】:

请参阅以下链接: http://developer.android.com/guide/topics/wireless/bluetooth.html#ConnectingDevices

具体来说,下段最后一句:

启用可发现性
如果您想让其他设备可以发现本地设备,请使用ACTION_REQUEST_DISCOVERABLE 操作意图调用startActivityForResult(Intent, int)。这将发出通过系统设置启用可发现模式的请求(无需停止您的应用程序)。默认情况下,设备将在 120 秒内变为可发现状态。您可以通过添加 EXTRA_DISCOVERABLE_DURATION Intent extra 来定义不同的持续时间。应用可以设置的最长持续时间为 3600 秒,值为 0 表示设备始终处于可发现状态。

所以,这应该可行:

Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 0);
startActivity(discoverableIntent);

【讨论】:

  • 这在 Android 2.1 中不可用。它至少从 Android 4 开始就可用,所以在较新的设备上,是的,这是一个解决方案。
  • 文档说是在android-5中添加的,所以应该是2.0及以上:developer.android.com/reference/android/bluetooth/…
  • 它仍然会给用户对话框确认,@gymshoe....不是我猜的解决方案
【解决方案2】:

如果您查看the BluetoothAdapter class

你会发现隐藏的方法:

public void setDiscoverableTimeout(int timeout)

现在您只需了解如何使用它。您必须执行方法调用才能这样做。

【讨论】:

  • BTW 怎么用,认不出来亲
  • 在许多 Android 版本中,此方法将可发现性限制在几分钟内。
  • “顺便说一句,你怎么用,它认不出来亲爱的”你说的“认不出来”是什么意思?这个方法肯定是由这个类持有的。它被标记为@hide。你可以调用隐藏的方法......这是一个例子stackoverflow.com/questions/3462968/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-16
相关资源
最近更新 更多