廢話很少說,直接闡述:html
前段時間在搞一個android項目,其中有一個功能要求須要藍牙可見性永久打開,可是開發過android藍牙的程序員應該都知道,goole提供的api中沒有設置藍牙永久可見性的接口,可是在實際的項目中的確須要用到這個功能,因此這就難爲到樓主了,樓主開始百度各類資料,查閱api,而後找到下邊一種能夠設置藍牙可見性時間的函數:java
Intent discoveryIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); discoveryIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION,300); startActivity(discoveryIntent);
這個能夠在android api中查詢到,裏邊是這樣描述這個接口的:android
意思大約則是這個常量做用是能夠打開藍牙,而且設置可見模式,默認的爲了保護隱私,設置爲不可見的,可是能夠在intent中傳入字段EXTRA_DISCOVERABLE_DURATION
來請求可發現的持續時間。目前,默認持續時間爲120秒,每一個請求的最長持續時間爲300秒。所以,這個方法最多一次只能顯示300秒,若是想要永久打開可見性,能夠開一個線程,而後每300秒後執行下上述的代碼,可是執行這塊代碼的同時,會在app中向用戶顯示打開藍牙可見性,這樣的話用戶體驗則較差,那有沒有其餘的辦法呢?在後臺默默的打開,而後永久可見。答案固然是有的,這時候咱們就要去看下BluetoothAdapter的源代碼了。程序員
在源代碼中,咱們能夠看到有這樣一個函數:api
這個函數的功能就是設置藍牙可見性持續的時間。 app
可是這個函數會發如今api文檔中找不到,緣由是goole將其隱藏掉了,可是這個函數仍然是能夠調用的,調用的方式可能和普通的不同,不可以直接調用,須要使用java的反射機制,二話不說上代碼:函數
//聲明一個class類
Class serviceManager = null; try {
//獲得這個class的類 serviceManager = Class.forName("android.bluetooth.BluetoothAdapter"); } catch (ClassNotFoundException e) { e.printStackTrace(); } //聲明一個方法 Method method = null; try {
//獲得指定的類中的方法 method = serviceManager.getMethod("setDiscoverableTimeout", String.class); } catch (NoSuchMethodException e) { e.printStackTrace(); } try {
//調用這個方法 method.invoke(serviceManager.newInstance(), 30);//根據測試,發現這一函數的參數不管傳遞什麼值,都是永久可見的 } catch (Exception e) { e.printStackTrace(); }