猛禽洛的程式筆記庫

[Android] 使藍牙可被搜索(可見度)

在做藍牙配對功能時,要開啟藍牙的可見功能才能被對方的裝置搜尋到(要進到藍牙設定畫面才會開啟可見功能),不過要手動切換至設地畫面太麻煩了,所以可以用程式碼來實做這項功能。

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-

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *