Android 6.0 Kotlin 藍牙BLE掃描(改成指定時間沒有發現新設備後中止掃描使用interface)

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)        }    }}
相關文章
相關標籤/搜索