import android.app.Activity import android.bluetooth.BluetoothAdapter import android.bluetooth.BluetoothDevice import android.bluetooth.BluetoothManager import android.bluetooth.le.ScanCallback import android.content.Context import android.os.Bundle import android.os.Handler import android.os.Parcel import android.os.Parcelable import android.widget.* import androidx.appcompat.app.AppCompatActivity import com.hiramine.blecommunicator.R import android.widget.Toast import android.content.Intent import android.view.* import android.widget.AdapterView import android.bluetooth.le.ScanResult as ScanResult1 abstract class DeviceListActivity() : AppCompatActivity(), Parcelable, AdapterView.OnItemClickListener { internal class DeviceListAdapter(activity: Activity) : BaseAdapter() { private val mDeviceList: ArrayList<BluetoothDevice> private val mInflator: LayoutInflater init { mDeviceList = ArrayList() mInflator = activity.layoutInflater } // リストへの追加 fun addDevice(device: BluetoothDevice) { if (!mDeviceList.contains(device)) { // 加えられていなければ加える mDeviceList.add(device) notifyDataSetChanged() // ListViewの更新 } } // リストのクリア fun clear() { mDeviceList.clear() notifyDataSetChanged() // ListViewの更新 } override fun getCount(): Int { return mDeviceList.size } override fun getItem(position: Int): Any { return mDeviceList[position] } override fun getItemId(position: Int): Long { return position.toLong() } internal class ViewHolder { var deviceName: TextView? = null var deviceAddress: TextView? = null } override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { var convertView = convertView val viewHolder: ViewHolder // General ListView optimization code. if (null == convertView) { convertView = mInflator.inflate(R.layout.listitem_device, parent, false) viewHolder = ViewHolder() viewHolder.deviceAddress = convertView!!.findViewById(R.id.textview_deviceaddress) viewHolder.deviceName = convertView.findViewById(R.id.textview_devicename) convertView.setTag(viewHolder) } else { viewHolder = convertView.getTag() as ViewHolder } val device = mDeviceList[position] val deviceName = device.name if (null != deviceName && 0 < deviceName.length) { viewHolder.deviceName!!.text = deviceName } else { viewHolder.deviceName!!.setText(R.string.unknown_device) } viewHolder.deviceAddress!!.text = device.address return convertView } } // 定数 private val REQUEST_ENABLEBLUETOOTH = 1 // Bluetooth機能の有効化要求時の識別コード private val SCAN_PERIOD: Long = 10000 // スキャン時間。単位はミリ秒。 val EXTRAS_DEVICE_NAME = "DEVICE_NAME" val EXTRAS_DEVICE_ADDRESS = "DEVICE_ADDRESS" // メンバー変数 private var mBluetoothAdapter: BluetoothAdapter? = null // BluetoothAdapter : Bluetooth処理で必要 private var mDeviceListAdapter: DeviceListAdapter? = null // リストビューの内容 private var mHandler: Handler? = null // UIスレッド操作ハンドラ : 「一定時間後にスキャンをやめる処理」で必要 private var mScanning = false // スキャン中かどうかのフラグ // デバイススキャンコールバック private val mLeScanCallback = object : ScanCallback() { // スキャンに成功(アドバタイジングは一定間隔で常に発行されているため、本関数は一定間隔で呼ばれ続ける) override fun onScanResult(callbackType: Int, result: ScanResult1) { super.onScanResult(callbackType, result) runOnUiThread { mDeviceListAdapter!!.addDevice(result.getDevice()) } } // スキャンに失敗 override fun onScanFailed(errorCode: Int) { super.onScanFailed(errorCode) } } constructor(parcel: Parcel) : this() { } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(com.hiramine.blecommunicator.R.layout.activity_device_list) // 戻り値の初期化 setResult(Activity.RESULT_CANCELED) // リストビューの設定 mDeviceListAdapter = DeviceListAdapter(this) // ビューアダプターの初期化 val listView = findViewById(R.id.devicelist) as ListView // リストビューの取得 listView.adapter = mDeviceListAdapter // リストビューにビューアダプターをセット listView.setOnItemClickListener(this) // クリックリスナーオブジェクトのセット // UIスレッド操作ハンドラの作成(「一定時間後にスキャンをやめる処理」で使用する) mHandler = Handler() // Bluetoothアダプタの取得 val bluetoothManager = getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager mBluetoothAdapter = bluetoothManager.adapter if (null == mBluetoothAdapter) { // デバイス(=スマホ)がBluetoothをサポートしていない Toast.makeText(this, R.string.bluetooth_is_not_supported, Toast.LENGTH_SHORT).show() finish() // アプリ終了宣言 return } } override fun onResume() { super.onResume() // デバイスのBluetooth機能の有効化要求 requestBluetoothFeature() // スキャン開始 startScan() } // 別のアクティビティ(か別のアプリ)に移行したことで、バックグラウンドに追いやられた時 override fun onPause() { super.onPause() // スキャンの停止 stopScan() } // デバイスのBluetooth機能の有効化要求 private fun requestBluetoothFeature() { if (mBluetoothAdapter!!.isEnabled()) { return } // デバイスのBluetooth機能が有効になっていないときは、有効化要求(ダイアログ表示) val enableBtIntent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE) startActivityForResult(enableBtIntent, REQUEST_ENABLEBLUETOOTH) } // 機能の有効化ダイアログの操作結果 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { when (requestCode) { REQUEST_ENABLEBLUETOOTH // Bluetooth有効化要求 -> if (Activity.RESULT_CANCELED == resultCode) { // 有効にされなかった Toast.makeText(this, R.string.bluetooth_is_not_working, Toast.LENGTH_SHORT).show() finish() // アプリ終了宣言 return } } super.onActivityResult(requestCode, resultCode, data) } // スキャンの開始 private fun startScan() { // リストビューの内容を空にする。 mDeviceListAdapter?.clear() // BluetoothLeScannerの取得 // ※Runnableオブジェクト内でも使用できるようfinalオブジェクトとする。 val scanner = mBluetoothAdapter!!.getBluetoothLeScanner() ?: return // スキャン開始(一定時間後にスキャン停止する) mHandler?.postDelayed(Runnable { mScanning = false scanner.stopScan(mLeScanCallback) // メニューの更新 invalidateOptionsMenu() }, SCAN_PERIOD) mScanning = true scanner.startScan(mLeScanCallback) // メニューの更新 invalidateOptionsMenu() } // スキャンの停止 private fun stopScan() { // 一定期間後にスキャン停止するためのHandlerのRunnableの削除 mHandler?.removeCallbacksAndMessages(null) // BluetoothLeScannerの取得 val scanner = mBluetoothAdapter?.getBluetoothLeScanner() ?: return mScanning = false scanner.stopScan(mLeScanCallback) // メニューの更新 invalidateOptionsMenu() } override fun onItemClick(parent: AdapterView<*>, view: View, position: Int, id: Long) { // クリックされたアイテムの取得 val device = mDeviceListAdapter?.getItem(position) as BluetoothDevice // 戻り値の設定 val intent = Intent() intent.putExtra(EXTRAS_DEVICE_NAME, device.name) intent.putExtra(EXTRAS_DEVICE_ADDRESS, device.address) setResult(Activity.RESULT_OK, intent) finish() } // オプションメニュー作成時の処理 override fun onCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.activity_device_list, menu) if (mScanning) { menu.findItem(R.id.menuitem_stop).setVisible(false) menu.findItem(R.id.menuitem_scan).setVisible(true) menu.findItem(R.id.menuitem_progress).setActionView(null) } else { menu.findItem(R.id.menuitem_stop).setVisible(true) menu.findItem(R.id.menuitem_scan).setVisible(false) menu.findItem(R.id.menuitem_progress) .setActionView(R.layout.actionbar_indeterminate_progress) } return true } // オプションメニューのアイテム選択時の処理 override fun onOptionsItemSelected(item: MenuItem): Boolean { when (item.getItemId()) { R.id.menuitem_scan -> startScan() // スキャンの開始 R.id.menuitem_stop -> stopScan() // スキャンの停止 } return true } } コード ```[イメージ説明](1aaa490cbf8722c93171b0eac7f9541d.png) MainActivityの分です。deviceListActivity.で引っ張ってきているはずなのに、赤字の部分が直りません。わかるかたお願いします。 ちなみにBLEのアプリを作っています