Android 6.0 Kotlin 蓝牙BLE扫描(改为指定时间没有发现新设备后停止扫描使用interface)
2018-01-04 13:52
363 查看
package com.arci.myapplication import android.os.Bundle import android.support.design.widget.Snackbar import android.support.v7.app.AppCompatActivity import android.view.Menu import android.view.MenuItem import android.view.View import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.content_main.* import android.bluetooth.BluetoothManager import android.content.Context import android.bluetooth.BluetoothAdapter import android.widget.Toast import android.content.Intent import android.bluetooth.BluetoothDevice import android.bluetooth.le.BluetoothLeScanner import android.bluetooth.le.ScanCallback import android.bluetooth.le.ScanResult import android.os.Handler import android.os.Looper import android.os.Message class MainActivity : AppCompatActivity() { private val BLE_SCAN_PERIOD : Long = 10000 private val REQUEST_BLUETOOTH_TURN_ON = 1 private lateinit var bleAdapter: BluetoothAdapter private lateinit var bleManager: BluetoothManager private lateinit var bleScanner: BluetoothLeScanner private lateinit var bleScanCallback: BleScanCallback private lateinit var bleScanHandler: Handler private var bleScanResults = mutableMapOf<String?, BluetoothDevice?>() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) setSupportActionBar(toolbar) fab.setOnClickListener { view -> Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) .setAction("Action", null).show() } bleScanHandler = Handler() //蓝牙管理,这是系统服务可以通过getSystemService(BLUETOOTH_SERVICE)的方法获取实例 bleManager = getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager //通过蓝牙管理实例获取适配器,然后通过扫描方法(scan)获取设备(device) bleAdapter = bleManager.adapter if (!bleAdapter.isEnabled) { val bluetoothTurnOn = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE) startActivityForResult(bluetoothTurnOn, REQUEST_BLUETOOTH_TURN_ON) } else { bleStartScan.run() } } //start scan private val bleStartScan = Runnable { bleScanner = bleAdapter.bluetoothLeScanner // bleScanCallback = BleScanCallback(bleScanResults) bleScanCallback.setNewScanResultListener(object : bleNewScanResultListener { override fun onNewScanResult(scanResult: ScanResult?) { TextView1.text = scanResult?.device?.name + ": " + scanResult?.device?.address Handler(Looper.getMainLooper()).post { Toast.makeText(this@MainActivity, scanResult?.device?.name + ": " + scanResult?.device?.address, Toast.LENGTH_SHORT).show() } bleScanHandler.removeCallbacks(bleStopScan) bleScanHandler.postDelayed(bleStopScan, BLE_SCAN_PERIOD) } }); // Toast.makeText(this.applicationContext, "蓝牙BLE扫描开始", Toast.LENGTH_SHORT).show() bleScanner.startScan(bleScanCallback) bleScanHandler.postDelayed(bleStopScan, BLE_SCAN_PERIOD) } private val bleStopScan = Runnable { bleScanner.stopScan(bleScanCallback) Toast.makeText(this.applicationContext, "蓝牙BLE扫描结束", Toast.LENGTH_SHORT).show() } //定义接口 interface bleNewScanResultListener { fun onNewScanResult(scanResult: ScanResult?) } class BleScanCallback(resultMap: MutableMap<String?, BluetoothDevice?>) : ScanCallback() { private var resultOfScan = resultMap var listener: bleNewScanResultListener? = null fun setNewScanResultListener(listener: bleNewScanResultListener) { this.listener = listener } override fun onScanResult(callbackType: Int, result: ScanResult?) { addScanResult(result) } override fun onBatchScanResults(results: MutableList<ScanResult>?) { results?.forEach { result -> addScanResult(result) } } override fun onScanFailed(errorCode: Int) { } private fun addScanResult(scanResult: ScanResult?) { val bleDevice = scanResult?.device val deviceAddress = bleDevice?.address if (!resultOfScan.contains(deviceAddress)) { resultOfScan.put(deviceAddress, bleDevice) this.listener?.onNewScanResult(scanResult) } } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) when (requestCode) { REQUEST_BLUETOOTH_TURN_ON->{ when (resultCode) { RESULT_OK->{ Toast.makeText(this.applicationContext, "蓝牙开启成功", Toast.LENGTH_SHORT).show() bleStartScan.run() } RESULT_CANCELED->{ Toast.makeText(this.applicationContext, "蓝牙开启失败", Toast.LENGTH_SHORT).show() } } } } } override fun onCreateOptionsMenu(menu: Menu): Boolean { // Inflate the menu; this adds items to the action bar if it is present. menuInflater.inflate(R.menu.menu_main, menu) return true } override fun onOptionsItemSelected(item: MenuItem): Boolean { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. return when (item.itemId) { R.id.action_settings -> true else -> super.onOptionsItemSelected(item) } } }
相关文章推荐
- Android 6.0 Kotlin 蓝牙BLE扫描(改为指定时间没有发现新设备后停止扫描)
- Android 6.0 Kotlin 蓝牙BLE扫描
- Android 6.0 扫描不到 Ble 设备需开启位置权限
- Android 6.0 使用蓝牙BLE 时 报错:java.lang.SecurityException:Need ACCESS_COARSE_LOCATION or ACCESS_FINE_LOC
- Android 6.0 使用蓝牙BLE 时 报错:java.lang.SecurityException:Need ACCESS_COARSE_LOCATION or ACCESS_FINE_LOC
- BluetoothAdapter在Android6.0/7.0+以上startDiscovery不能发现蓝牙设备问题
- Android M(6.0)扫描不到蓝牙设备的处理办法
- Android 6.0 扫描不到 Ble 设备需开启位置权限
- Android 6.0 扫描不到 Ble 设备需开启位置权限的方法
- Android M(6.0)扫描不到蓝牙设备的处理办法
- Android 6.0 使用蓝牙BLE 时 报错:java.lang.SecurityException:Need ACCESS_COARSE_LOCATION or ACCESS_FINE_LOC
- 蓝牙(WLAN)扫描发现设备在6.0以上的bug
- Android 6.0 Kotlin 蓝牙扫描
- Android 6.0 扫描不到 Ble 设备需开启位置权限
- BluetoothAdapter在Android6.0/7.0+以上startDiscovery不能发现蓝牙设备问题
- Android 扫描蓝牙设备
- 基于源码开机蓝牙一直扫描并自动连接指定的蓝牙设备
- Android 蓝牙开发(二)开启蓝牙,获取状态,发现设备。
- Android bluetooth介绍(三): 蓝牙扫描(scan)设备分析
- Android BLE与终端通信(一)——Android Bluetooth基础API以及简单使用获取本地蓝牙名称地址