Android 6.0 Kotlin 蓝牙BLE扫描
2017-12-29 16:27
543 查看
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 class MainActivity : AppCompatActivity() { private val REQUEST_BLUETOOTH_TURN_ON = 1 private val BLE_SCAN_PERIOD : Long = 10000 private lateinit var bleAdapter: BluetoothAdapter private lateinit var bleManager: BluetoothManager private lateinit var bleScanner: BluetoothLeScanner private lateinit var bleScanCallback: BleScanCallback private var bleScanResults = mutableMapOf<String?, BluetoothDevice?>() private lateinit var bleScanHandler:Handler 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.setContext(this.applicationContext) bleScanner.startScan(bleScanCallback) Toast.makeText(this.applicationContext, "蓝牙BLE扫描开始", Toast.LENGTH_SHORT).show() bleScanHandler.postDelayed(bleStopScan, this.BLE_SCAN_PERIOD) } private val bleStopScan = Runnable { if (bleScanner != null) { bleScanner.stopScan(bleScanCallback) } Toast.makeText(this.applicationContext, "蓝牙BLE扫描结束", Toast.LENGTH_SHORT).show() } class BleScanCallback(resultMap: MutableMap<String?, BluetoothDevice?>) : ScanCallback() { var resultOfScan = resultMap private var context: Context? = null fun setContext(context: Context) { this.context = context } 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) { Toast.makeText(this.context, "蓝牙BLE扫描失败" + "Error Code: " + errorCode, Toast.LENGTH_SHORT).show() } fun addScanResult(scanResult: ScanResult?) { val bleDevice = scanResult?.device val deviceAddress = bleDevice?.address if (!resultOfScan.contains(deviceAddress)) { resultOfScan.put(deviceAddress, bleDevice) if (this.context != null) { Toast.makeText(this.context, bleDevice?.name + ": " + bleDevice?.address, Toast.LENGTH_SHORT).show() } } } } 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扫描(改为指定时间没有发现新设备后停止扫描使用interface)
- Android 6.0 Kotlin 蓝牙扫描
- android 蓝牙BLE扫描和wifi扫描总结
- Android BLE低功耗蓝牙开发极简系列(一)之扫描与连接
- Android 6.0 扫描不到 Ble 设备需开启位置权限
- Android 6.0 BluetoothAdapter.startDiscovery()扫描不到蓝牙的问题分析及解决
- Android 6.0 使用蓝牙BLE 时 报错:java.lang.SecurityException:Need ACCESS_COARSE_LOCATION or ACCESS_FINE_LOC
- Android 6.0 扫描不到 Ble 设备需开启位置权限的方法
- Android M(6.0)扫描不到蓝牙设备的处理办法
- Android 6.0 使用蓝牙BLE 时 报错:java.lang.SecurityException:Need ACCESS_COARSE_LOCATION or ACCESS_FINE_LOC
- android BluetoothAdapter蓝牙BLE扫描总结
- Android 低功耗蓝牙(BLE)开发(4)-- 蓝牙扫描和连接
- Android M(6.0)扫描不到蓝牙设备的处理办法
- Android ble扫描版本高于6.0后需要定位权限
- Android 6.0 使用蓝牙BLE 时 报错:java.lang.SecurityException:Need ACCESS_COARSE_LOCATION or ACCESS_FINE_LOC
- android 6.0系统扫不到Ble蓝牙问题
- Android 6.0 扫描不到 Ble 设备需开启位置权限
- Android 6.0 扫描不到 Ble 设备需开启位置权限
- android 6.0升级 对应蓝牙扫描 和二维码扫描