android中通過代碼來設置藍牙永久可見性


廢話不多說,直接闡述:

  前段時間在搞一個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(); }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM