2015-02-06 3 views
8

Я новичок в разработке приложений для Android. Я пробовал читать документацию, но ничего не получаю (функции в учебнике Android, такие как StartLeScan(), устарели и т. Д.)обнаружение Bluetooth устройств Le в Android

Есть ли простая функция, которая возвращает список Bluetooth-устройств?

что-то вроде getDevices() -> (список)?

Спасибо

ответ

13

в основном это зависит от того, андроид версии вы ориентируетесь. так как api немного изменился в леденец (21).

в вашей деятельности, получить Bluetooth-адаптер

BluetoothManager bm = (BluetoothManager)getSystemService(Context.BLUETOOTH_SERVICE) 
BluetoothAdapter mBluetoothAdapter = bm.getAdapter(); 

// Ensures Bluetooth is available on the device and it is enabled. If not, 
// displays a dialog requesting user permission to enable Bluetooth. 
if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) { 
    Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 
    startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); 
} 

, то вы должны проверить, какой андроид версии вы ориентируетесь

int apiVersion = android.os.Build.VERSION.SDK_INT; 
if (apiVersion > android.os.Build.VERSION_CODES.KITKAT){ 
BluetoothLeScanner scanner = mBluetoothAdapter.getBluetoothLeScanner(); 
// scan for devices 
scanner.startScan(new ScanCallback() { 
     @Override 
     public void onScanResult(int callbackType, ScanResult result) { 
      // get the discovered device as you wish 
      // this will trigger each time a new device is found 

      BluetoothDevice device = result.getDevice(); 
     } 
    }); 
} else { 
    // targetting kitkat or bellow 
    mBluetoothAdapter.startLeScan(new BluetoothAdapter.LeScanCallback() { 
     @Override 
     public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) { 
      // get the discovered device as you wish 

     } 
    }); 

// rest of your code that will run **before** callback is triggered since it's asynchronous 

не забудьте добавить разрешения в манифесте

<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> 
    <uses-permission android:name="android.permission.BLUETOOTH"/> 
+0

Спасибо! что такое 'REQUEST_ENABLE_BT'? Кроме того, что вы помещаете в '// получить обнаруженное устройство по своему усмотрению'? Документация сбивала с толку о том, как получить доступ к устройству в методах 'onLeScan' и' onScanResult'.Можете ли вы привести пример того, как я могу получить доступ к идентификатору найденного устройства, или к MAC-адресу и т. Д., Или к какой-либо строке имени? – kmn

+0

REQUEST_ENABLE_BT - это целое число, которое вы ожидаете вернуть в onActivityResult. в onActivityResult() вы можете проверить, что результат для этого конкретного запроса (включить bt) относительно MAC-адреса. у вас есть BluetoothDevice. вы можете вызвать device.getAddress() или любые другие доступные методы http://developer.android.com/reference/android/bluetooth/BluetoothDevice.html – DanM

2

Если вы используете уровень api менее 21, вы обнаружите, что StartLeScan был устаревший, в Android-леденец StartLeScan() появился с новой функцией настроек сканирования. Вы можете использовать нижеприведенный код для сканирования устройств BLE.

ScanSettings.Builder scanSettingsBuilder = new ScanSettings.Builder(); 
scanSettingsBuilder.setScanMode(ScanSettings.SCAN_MODE_LOW_POWER); 
scanSettings = scanSettingsBuilder.build(); 

BluetoothScanCallback mScanCallback = new BluetoothScanCallback(); 
mBluetoothUtils.getBluetoothAdapter().getBluetoothLeScanner() 
       .startScan(scanFilters, scanSettings, mScanCallback); 
+1

, если вы потратите время на объяснение, почему бы вам не воспользоваться время, чтобы представить его полностью? Что такое «scanSettings»? – Nactus

+0

Вы могли бы показать полный источник? – susemi99

+0

@ Сканирование Nactus используется для изменения мощности сканирования адаптера bluetooth. Это api входит в уровень api 21. С кодом вы можете легко узнать о том, для чего мы это используем. –

0

Я также думал, что эта проблему в течение нескольких часов , и я узнал ответ путем поиска официального документа.
Вы должны знать, 3 класс и метод ScanCallback, BluetoothLeScanner, ScanResult
// мой уровень настолько низок, что я не могу отправить ссылку ....
Вы можете увидеть в андроида веб-разработчиков, веб-страница будет показывать Добавлено уровня API 21" на правой стороне

Вот мой код, модифицированный from these project

//declare  
private BluetoothLeScanner mBluetoothLeScanner; 
mBluetoothLeScanner = mBluetoothAdapter.getBluetoothLeScanner(); 

//start and stop scan 
mBluetoothLeScanner.startScan(mScanCallback); 
mBluetoothLeScanner.stopScan(mScanCallback); 

//Scan call back function 
private ScanCallback mScanCallback = new ScanCallback() { 
    @Override 
    public void onScanResult(int callbackType, ScanResult result) { 
     super.onScanResult(callbackType, result); 
     mLeDeviceListAdapter.addDevice(result.getDevice()); 
     mLeDeviceListAdapter.notifyDataSetChanged(); 
    } 
}; 

мой grandle:.

android { 
    compileSdkVersion 22 
    buildToolsVersion "22.0.1" 

    defaultConfig { 
     applicationId "com.polkapolka.bluetooth.le" 
     minSdkVersion 21 
     targetSdkVersion 22 
    } 

    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' 
     } 
    } 
} 

Этот код хорошо работает на моем телефоне, который является API 21 Надеюсь, он вам поможет.

0

Я некоторое время играл с BLE-сканированием, пока не получил простейшее решение из скандинавской библиотеки.

Добавить строку в build.gradle:

dependencies { 
    .... 
    compile 'no.nordicsemi.android.support.v18:scanner:1.0.0' 
} 

И использовать BluetoothLeScannerCompat:

import no.nordicsemi.android.support.v18.scanner.BluetoothLeScannerCompat; 

... 
BluetoothLeScannerCompat scanner = BluetoothLeScannerCompat.getScanner(); 
scaner.startScan(new ScanCallback { ...}); 

И библиотека делает всю работу.

Смежные вопросы