android开发蓝牙是否可见开关_如何从后台开启android蓝牙的可见性以及始终保持可见性...
最近工作中遇到一個特殊的需求,要求代碼能夠從后臺開機android手機藍牙的可見性。而framework提供了一種打開可見性的操作,就是通過向用戶彈出一個提示框,來詢問是否允許開啟可見性。而且限制了最長時間為300秒,代碼如下:
//啟動修改藍牙可見性的Intent
Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
//設(shè)置藍牙可見性的時間,方法本身規(guī)定最多可見300秒
intent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
startActivity(intent);
但通過android的自帶的settings程序,我們可以直接開機藍牙可見性。所以下載settings的源碼,進行分析。找到了開啟藍牙可見性的代碼,如下:
public void setDiscoverableTimeout(inttimeout) {
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值并沒有起到作用,可見性是一直保持的??梢酝ㄐ邢旅骖愃频拇a進行關(guān)閉:
public voidcloseDiscoverableTimeout() {
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是關(guān)鍵。
如果想實現(xiàn)超時后自動關(guān)閉可見性的效果,使用Handler
postDelayed(Runnable r, long delayMillis)
就可以輕松實現(xiàn)這個功能。
以上代碼在android4.2以上可以允許,4.2以下會因為缺少系統(tǒng)權(quán)限而運行失敗。
總結(jié)
以上是生活随笔為你收集整理的android开发蓝牙是否可见开关_如何从后台开启android蓝牙的可见性以及始终保持可见性...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js中级(1)
- 下一篇: HTTP协议(3)浏览器的使用之查看源码