在做藍牙配對功能時,要開啟藍牙的可見功能才能被對方的裝置搜尋到(要進到藍牙設定畫面才會開啟可見功能),不過要手動切換至設地畫面太麻煩了,所以可以用程式碼來實做這項功能。
1.開啟權限
<!--建立藍牙連接和傳輸權限--> <uses-permission android:name="android.permission.BLUETOOTH" /> <!--掃描藍牙設備或修改藍牙設置權限--> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <!--Android 6.0及後續版本掃描藍牙,需要定位權限(進入GPS設置,可以看到藍牙定位)--> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
2.取得權限(此為範例,也可以用自己的方式)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { String permissions = Manifest.permission.ACCESS_COARSE_LOCATION; if (checkSelfPermission(permissions) != PackageManager.PERMISSION_GRANTED) { requestPermissions(permissions, 100); } }
3.開啟藍牙可被搜索
int discoveryTime = 300;//大部分機種最大值為300,設成0可以永遠開啟可見(每種機種狀況會不太一樣,需要測試) Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); intent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, discoveryTime); startActivity(intent);
如果想要自動永久開啟可被搜尋,但不想要經過使用者確認呢?
這時候就要使用系統的一個隱藏功能:
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); Log.i("setDiscoverableTimeout", "finish"); } catch (Exception e) { e.printStackTrace(); } }
這邊的timeout隨便一個值都行,他沒有實質用處,最後都會是永久可見
-END-
發佈留言