關於 Android 連線藍芽的方法
阿新 • • 發佈:2019-01-26
尊重原創,轉載請註明出處
我是原文
今天在看自己的專案時,看到了關於藍芽連線的這部分,在此做個筆記。在之前,藍芽連線的方法為:
BluetoothDevice.createBond();
不過我記得那時所用的 API 版本這個方法是隱藏的 `@hide` ,具體是哪個版本的 API 我也不記得了,
然後今天無意間看了下原始碼,發現:
/** * Start the bonding (pairing) process with the remote device. * <p>This is an asynchronous call, it will return immediately. Register * for {@link #ACTION_BOND_STATE_CHANGED} intents to be notified when * the bonding process completes, and its result. * <p>Android system services will handle the necessary user interactions * to confirm and complete the bonding process. * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN}. * * @return false on immediate error, true if bonding will begin */ public boolean createBond() { if (sService == null) { Log.e(TAG, "BT not enabled. Cannot create bond to Remote Device"); return false; } try { return sService.createBond(this); } catch (RemoteException e) {Log.e(TAG, "", e);} return false; }
是的,這個方法是公開的了。
當我直接將程式碼改為直接使用後
deviceItem.createBond();
發現了這樣的提示
意思是說這個方法是在API版本為19後(Android 4.4)才開始可以使用的。
所以建議在Android版本為4.4以下的手機上,這麼使用:
try { Method bondDevice = BluetoothDevice.class .getMethod("createBond"); bondDevice.invoke(deviceItem); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); }
整理過後,可以變為:
if(android.os.Build.VERSION.SDK_INT<19){ try { Method bondDevice = BluetoothDevice.class .getMethod("createBond"); bondDevice.invoke(deviceItem); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } else { deviceItem.createBond(); }
注:deviceItem 為 BluetoothDevice 物件。