废话不多说,直接阐述:
前段时间在搞一个android项目,其中有一个功能要求需要蓝牙可见性永久打开,但是开发过android蓝牙的程序员应该都知道,goole提供的api中没有设置蓝牙永久可见性的接口,但是在实际的项目中的确需要用到这个功能,所以这就难为到楼主了,楼主开始百度各种资料,查阅api,然后找到下边一种可以设置蓝牙可见性时间的函数:
Intent discoveryIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); discoveryIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION,300); startActivity(discoveryIntent);
这个可以在android api中查询到,里边是这样描述这个接口的:
意思大约则是这个常量作用是可以打开蓝牙,并且设置可见模式,默认的为了保护隐私,设置为不可见的,但是可以在intent中传入字段EXTRA_DISCOVERABLE_DURATION
来请求可发现的持续时间。目前,默认持续时间为120秒,每个请求的最长持续时间为300秒。因此,这个方法最多一次只能显示300秒,如果想要永久打开可见性,可以开一个线程,然后每300秒后执行下上述的代码,但是执行这块代码的同时,会在app中向用户显示打开蓝牙可见性,这样的话用户体验则较差,那有没有其他的办法呢?在后台默默的打开,然后永久可见。答案当然是有的,这时候我们就要去看下BluetoothAdapter的源代码了。
在源代码中,我们可以看到有这样一个函数:
这个函数的功能就是设置蓝牙可见性持续的时间。
但是这个函数会发现在api文档中找不到,原因是goole将其隐藏掉了,但是这个函数仍然是可以调用的,调用的方式可能和普通的不一样,不能够直接调用,需要使用java的反射机制,二话不说上代码:
//声明一个class类
Class serviceManager = null; try {
//得到这个class的类 serviceManager = Class.forName("android.bluetooth.BluetoothAdapter"); } catch (ClassNotFoundException e) { e.printStackTrace(); } //声明一个方法 Method method = null; try {
//得到指定的类中的方法 method = serviceManager.getMethod("setDiscoverableTimeout", String.class); } catch (NoSuchMethodException e) { e.printStackTrace(); } try {
//调用这个方法 method.invoke(serviceManager.newInstance(), 30);//根据测试,发现这一函数的参数无论传递什么值,都是永久可见的 } catch (Exception e) { e.printStackTrace(); }