Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android4.4(MT8685)源碼藍牙解析--BLE搜索

Android4.4(MT8685)源碼藍牙解析--BLE搜索

編輯:關於Android編程

BLE:全稱為Bluetooth Low Energy。藍牙規范4.0最重要的一個特性就是低功耗。BLE使得藍牙設備可通過一粒紐扣電池供電以維持續工作數年之久。很明顯,BLE使得藍牙設備在鐘表、遠程控制、醫療保健及運動感應器等市場具有極光明的應用場景。

Google從Android 4.3開始添加了對藍牙4.0的支持。本文一個demo為入口分析 BLE 搜索的流程。

package com.dy.ble;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {
	private static final String TAG = "BLE";
	private Button scanBtn;
	private BluetoothAdapter bluetoothAdapter;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		
		bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
		if(!bluetoothAdapter.isEnabled()){
			bluetoothAdapter.enable();
		}
		scanBtn = (Button) this.findViewById(R.id.btn_scan);
		scanBtn.setOnClickListener(new OnClickListener(){

			@SuppressLint("NewApi")
			@Override
			public void onClick(View arg0) {
				if(bluetoothAdapter.isEnabled()){
					bluetoothAdapter.startLeScan(callback);
				}
			}
			
		});
		
	}
	
	@SuppressLint("NewApi")
	private BluetoothAdapter.LeScanCallback callback = new BluetoothAdapter.LeScanCallback(){

		@Override
		public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) {
			Log.d(TAG, "onLeScan device = " + device + ",rssi = " + rssi + "scanRecord = " + scanRecord);
		}
	};

}

點擊按鈕就會開始掃描,掃描到設備時,就會觸發onLeScan這個回調方法,並且可以從參數中獲取掃描到的藍牙設備信息。下面分析BluetoothAdapter中的startLeScan方法。

 public boolean startLeScan(LeScanCallback callback) {
        return startLeScan(null, callback);
    }

這裡調用了一個同名的方法,

public boolean startLeScan(UUID[] serviceUuids, LeScanCallback callback) {
        if (DBG) Log.d(TAG, "startLeScan(): " + serviceUuids);

        if (callback == null) {
            if (DBG) Log.e(TAG, "startLeScan: null callback");
            return false;
        }

        synchronized(mLeScanClients) {
            if (mLeScanClients.containsKey(callback)) {
                if (DBG) Log.e(TAG, "LE Scan has already started");
                return false;
            }

            try {
                IBluetoothGatt iGatt = mManagerService.getBluetoothGatt();
                if (iGatt == null) {
					 if (DBG) Log.e("BluetoothAdapterReceiver", "iGatt == null");
                    // BLE is not supported
                    return false;
                }

                UUID uuid = UUID.randomUUID();
                GattCallbackWrapper wrapper = new GattCallbackWrapper(this, callback, serviceUuids);
                iGatt.registerClient(new ParcelUuid(uuid), wrapper);
                if (wrapper.scanStarted()) {
					if (DBG) Log.e("BluetoothAdapterReceiver", "wrapper.scanStarted()==true");
                    mLeScanClients.put(callback, wrapper);
                    return true;
                }
            } catch (RemoteException e) {
                Log.e(TAG,"",e);
            }
        }
        return false;
    }

這個方法需要BLUETOOTH_ADMIN權限,第一個參數是各種藍牙服務的UUID數組,UUID是“Universally Unique Identifier”的簡稱,通用唯一識別碼的意思。對於藍牙設備,每個服務都有通用、獨立、唯一的UUID與之對應。也就是說,在同一時間、同一地點,不可能有兩個相同的UUID標識的不同服務。第二個參數是前面傳進來的LeScanCallback對象。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved