如何从后台开启android蓝牙的可见性以及始终保持可见性
来源:互联网 发布:java web 分层 编辑:程序博客网 时间:2024/06/05 04:13
最近工作中遇到一个特殊的需求,要求代码能够从后台开机android手机蓝牙的可见性。而framework提供了一种打开可见性的操作,就是通过向用户弹出一个提示框,来询问是否允许开启可见性。而且限制了最长时间为300秒,代码如下:
//启动修改蓝牙可见性的IntentIntent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);//设置蓝牙可见性的时间,方法本身规定最多可见300秒intent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);startActivity(intent);
但通过android的自带的settings程序,我们可以直接开机蓝牙可见性。所以下载settings的源码,进行分析。找到了开启蓝牙可见性的代码,如下:
private void setEnabled(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蓝牙的可见性以及始终保持可见性
- 如何从后台开启android蓝牙的可见性以及始终保持可见性
- 如何从后台开启android蓝牙的可见性以及始终保持可见性
- android-设置蓝牙的可见性
- Android通过反射机制实现后台设置蓝牙可见性
- 关于android蓝牙可见性设置
- android 蓝牙通讯实现手机蓝牙的开启,并扫描附近可见的蓝牙设备
- 扫描周围可用蓝牙设备、以及设置蓝牙设备的可见性
- 关于android蓝牙开发中 蓝牙可见性设置
- android系统app打开蓝牙+设置可见性
- 如何保持交互的可见性
- 继承的可见性
- 可见性的问题
- HTTP的可见性
- 多线程的可见性
- 标识符的可见性
- android 设置按钮的可见性
- IsDebuggerPresent VC6.0编译时会报连接错误
- 阿里淘宝体验系列1-店铺装修这点事儿
- RSA算法实现与蒙哥马利算法(转)
- 冒泡 输入
- RAC10g环境修改VIP地址
- 如何从后台开启android蓝牙的可见性以及始终保持可见性
- 数学空间引论
- const总结
- 素数筛选法----孪生素数问题
- 《UNIX环境高级编程》笔记--孤儿进程组
- 省市数据库资源
- 没事儿找事儿————gtk学习(Hello World)
- ado.net 如何读取 excel
- HDU 4800 DP