1. 程式人生 > >關於 Android 連線藍芽的方法

關於 Android 連線藍芽的方法

尊重原創,轉載請註明出處 我是原文

今天在看自己的專案時,看到了關於藍芽連線的這部分,在此做個筆記。在之前,藍芽連線的方法為:

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 物件。