美文网首页
如何从后台开启android蓝牙的可见性以及始终保持可见性

如何从后台开启android蓝牙的可见性以及始终保持可见性

作者: 杰子他爸 | 来源:发表于2019-08-14 17:09 被阅读0次

最近工作中遇到一个特殊的需求,要求代码能够从后台开机android手机蓝牙的可见性。而framework提供了一种打开可见性的操作,就是通过向用户弹出一个提示框,来询问是否允许开启可见性。而且限制了最长时间为300秒,代码如下:

        //启动修改蓝牙可见性的Intent

Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);

//设置蓝牙可见性的时间,方法本身规定最多可见300秒

intent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);

startActivity(intent);

但通过android的自带的settings程序,我们可以直接开机蓝牙可见性。所以下载settings的源码,进行分析。找到了开启蓝牙可见性的代码,如下:

private voidsetEnabled(boolean enable) {

if (enable) {

int timeout = getDiscoverableTimeout();

mLocalAdapter.setDiscoverableTimeout(timeout);

long endTimestamp = System.currentTimeMillis() + timeout * 1000L;

LocalBluetoothPreferences.persistDiscoverableEndTimestamp(mContext, endTimestamp);

mLocalAdapter.setScanMode(BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE, timeout);

updateCountdownSummary();

} else {

mLocalAdapter.setScanMode(BluetoothAdapter.SCAN_MODE_CONNECTABLE);

}

}

这下就清楚了,是BluetoothAdapter 里面的setDiscoverableTimeout和setScanMode起到了关键性左右,再看BluetoothAdapter源码,发现这2个方法都被隐藏(hide)了。如何能访问到被隐藏的方法呢?自然是用强大的反射:

public void setDiscoverableTimeout(int timeout) {

BluetoothAdapter adapter=BluetoothAdapter.getDefaultAdapter();

try {

Method setDiscoverableTimeout = BluetoothAdapter.class.getMethod("setDiscoverableTimeout", int.class);

setDiscoverableTimeout.setAccessible(true);

Method setScanMode =BluetoothAdapter.class.getMethod("setScanMode", int.class,int.class);

setScanMode.setAccessible(true);

setDiscoverableTimeout.invoke(adapter, timeout);

setScanMode.invoke(adapter, BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE,timeout);

} catch (Exception e) {

e.printStackTrace();

}

}

用这种方法开启的可见性,还有个附件的属性,timeout值并没有起到作用,可见性是一直保持的。可以通行下面类似的代码进行关闭:

public void closeDiscoverableTimeout() {

BluetoothAdapter adapter=BluetoothAdapter.getDefaultAdapter();

try {

Method setDiscoverableTimeout = BluetoothAdapter.class.getMethod("setDiscoverableTimeout", int.class);

setDiscoverableTimeout.setAccessible(true);

Method setScanMode =BluetoothAdapter.class.getMethod("setScanMode", int.class,int.class);

setScanMode.setAccessible(true);

setDiscoverableTimeout.invoke(adapter, 1);

setScanMode.invoke(adapter, BluetoothAdapter.SCAN_MODE_CONNECTABLE,1);

} catch (Exception e) {

e.printStackTrace();

}

}

改变BluetoothAdapter.SCAN_MODE_CONNECTABLE是关键。

如果想实现超时后自动关闭可见性的效果,使用Handler

postDelayed(Runnable r, long delayMillis)

就可以轻松实现这个功能。

以上代码在android4.2以上可以允许,4.2以下会因为缺少系统权限而运行失败。

相关文章

  • 如何从后台开启android蓝牙的可见性以及始终保持可见性

    最近工作中遇到一个特殊的需求,要求代码能够从后台开机android手机蓝牙的可见性。而framework提供了一种...

  • Android 蓝牙可见性开启与关闭

    Android 蓝牙可见性开启与关闭 定制的Android设备只有在蓝牙页面才能被扫描搜索到,要求软件开启启动后作...

  • Android 蓝牙可见性开启与关闭

    定制的Android设备只有在蓝牙页面才能被扫描搜索到,要求软件开启启动后作为服务端被蓝牙连接,且一直处于被发现状...

  • 何为明心见性?如何塑梦圆梦?

    何为明心见性?如何塑梦圆梦? ----明心见性,自性具足;净心圆梦,觉悟人民。 何为明心见性?如何明心见性? 明心...

  • Android – 密码可见度切换

    密码可见性切换:在Android支持库24.2.0中,引入了“密码可见性切换”。 TextInputLayout ...

  • android 蓝牙可见性配置(Android R)

    客户反馈:正常来说,机器启动系统蓝牙是一直打开的,手机直接能搜索到他, 不需要去点开蓝牙部分才能搜索。 在做And...

  • 见性见性见性

    人活着活着就迷失了忘记了自己是谁迷失了本性,活着活着想死了。 其实是没有见性,人如何见性,见什么性得通过人生经历来...

  • 多线程 | Volatile到底有什么用?

    Volatile的作用: 保持内存可见性.内存可见性:多个线程操作同一个变量,可确保写线程更新变量,其他读线程可以...

  • 浅谈明心见性

    明心见性在大乘通途法门来说,是修行人要达到的第一个目标。那么,什么是明心见性?如何做到明心见性?明心见性的后...

  • 美好生活排行榜|酒桌即中国

    酒精不燃烧,不算搞社交。 喝酒可大俗可大雅,可论国是可谈风月,可攀交情可见性情,可怡情可乱性,可养生可伤身,可豪饮...

网友评论

      本文标题:如何从后台开启android蓝牙的可见性以及始终保持可见性

      本文链接:https://www.haomeiwen.com/subject/vsrnjctx.html