如何從後臺開啓android藍牙的可見性以及始終保持可見性

最近工做中遇到一個特殊的需求,要求代碼可以從後臺開機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

postDelayed(Runnable r, long delayMillis)

就能夠輕鬆實現這個功能。blog

 

 

以上代碼在android4.2以上能夠容許,4.2如下會由於缺乏系統權限而運行失敗。get

相關文章
相關標籤/搜索