最近工做中遇到一個特殊的需求,要求代碼可以從後臺開機android手機藍牙的可見性。而framework提供了一種打開可見性的操做,就是經過向用戶彈出一個提示框,來詢問是否容許開啓可見性。並且限制了最長時間爲300秒,代碼以下:java
//啓動修改藍牙可見性的Intent Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); //設置藍牙可見性的時間,方法自己規定最多可見300秒 intent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300); startActivity(intent);
但經過android的自帶的settings程序,咱們能夠直接開機藍牙可見性。因此下載settings的源碼,進行分析。找到了開啓藍牙可見性的代碼,以下:android
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值並無起到做用,可見性是一直保持的。能夠通行下面相似的代碼進行關閉:post
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是關鍵。spa
若是想實現超時後自動關閉可見性的效果,使用Handlercode
就能夠輕鬆實現這個功能。blog
以上代碼在android4.2以上能夠容許,4.2如下會由於缺乏系統權限而運行失敗。get