廢話不多說,直接闡述:
前段時間在搞一個android項目,其中有一個功能要求需要藍牙可見性永久打開,但是開發過android藍牙的程序員應該都知道,goole提供的api中沒有設置藍牙永久可見性的接口,但是在實際的項目中的確需要用到這個功能,所以這就難為到樓主了,樓主開始百度各種資料,查閱api,然后找到下邊一種可以設置藍牙可見性時間的函數:
Intent discoveryIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); discoveryIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION,300); startActivity(discoveryIntent);
這個可以在android api中查詢到,里邊是這樣描述這個接口的:
意思大約則是這個常量作用是可以打開藍牙,並且設置可見模式,默認的為了保護隱私,設置為不可見的,但是可以在intent中傳入字段EXTRA_DISCOVERABLE_DURATION
來請求可發現的持續時間。目前,默認持續時間為120秒,每個請求的最長持續時間為300秒。因此,這個方法最多一次只能顯示300秒,如果想要永久打開可見性,可以開一個線程,然后每300秒后執行下上述的代碼,但是執行這塊代碼的同時,會在app中向用戶顯示打開藍牙可見性,這樣的話用戶體驗則較差,那有沒有其他的辦法呢?在后台默默的打開,然后永久可見。答案當然是有的,這時候我們就要去看下BluetoothAdapter的源代碼了。
在源代碼中,我們可以看到有這樣一個函數:
這個函數的功能就是設置藍牙可見性持續的時間。
但是這個函數會發現在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(); }