package com.arci.myapplicationimport android.os.Bundleimport android.support.design.widget.Snackbarimport android.support.v7.app.AppCompatActivityimport android.view.Menuimport android.view.MenuItemimport android.view.Viewimport kotlinx.android.synthetic.main.activity_main.*import kotlinx.android.synthetic.main.content_main.*import android.bluetooth.BluetoothManagerimport android.content.Contextimport android.bluetooth.BluetoothAdapterimport android.widget.Toastimport android.content.Intentimport android.bluetooth.BluetoothDeviceimport android.bluetooth.le.BluetoothLeScannerimport android.bluetooth.le.ScanCallbackimport android.bluetooth.le.ScanResultimport android.os.Handlerimport android.os.Looperimport android.os.Messageclass 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) } }}