android开发蓝牙是否可见开关_如何从后台开启android蓝牙的可见性以及始终保持可见性...
最近工作中遇到一個特殊的需求,要求代碼能夠從后臺開機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的源碼,進行分析。找到了開啟藍牙可見性的代碼,如下:
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值并沒有起到作用,可見性是一直保持的。可以通行下面類似的代碼進行關閉:
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是關鍵。
如果想實現超時后自動關閉可見性的效果,使用Handler
postDelayed(Runnable r, long delayMillis)
就可以輕松實現這個功能。
以上代碼在android4.2以上可以允許,4.2以下會因為缺少系統權限而運行失敗。
總結
以上是生活随笔為你收集整理的android开发蓝牙是否可见开关_如何从后台开启android蓝牙的可见性以及始终保持可见性...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js中级(1)
- 下一篇: 达信:深度解读COSO新版企业风险管理框