Я пытаюсь использовать собственную реализацию Bluetooth kotlin, но столкнулся с проблемой.
Я запускаю широковещательный приемник для сканирования устройств Bluetooth, следуя инструкции kotlin здесь .
Проблема в том, что когда я пытаюсь добавить каждое обнаруженное устройство в изменяемый список основной активности из широковещательного приемника, чтобы я мог отправить список на флаттер, я всегда получаю ноль.
Поскольку я новичок в kotlin и android, я не могу по-настоящему понять, где именно я ошибаюсь, и какие концепции мне нужно понять, чтобы делать то, что мне нужно.
Kotlin MainActivity.kt
class MainActivity : FlutterActivity() {
private val CHANNEL = "bluetooth.channel"
var deviceList: MutableList<BluetoothDevice>?=null;
override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
GeneratedPluginRegistrant.registerWith(flutterEngine);
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
when (call.method) {
"getBlue" -> bluetoothWrapper(result)
"discoverBlue" -> discoverDevices(deviceList,result)
}
}
}
private fun bluetoothWrapper(result: MethodChannel.Result) {
val defaultAdapter: BluetoothAdapter? = BluetoothAdapter.getDefaultAdapter()
checkAdapter(result, defaultAdapter);
enableAdapter(defaultAdapter!!);
}
private fun checkAdapter(result: MethodChannel.Result, defaultAdapter: BluetoothAdapter?) { // check if adapter exists
if (defaultAdapter == null) {
result.error("Bluetooth adapter doesn't exist on this device", null, null)
} else {
result.success("bluetooth adapter exists on device")
}
}
// check if adapter is enabled if it exists, enable it if it isnt
@SuppressLint("MissingPermission")
private fun enableAdapter(bluetoothAdapter: BluetoothAdapter) {
val requestEnableBt = 1;
if (!bluetoothAdapter.isEnabled) {
val enableIntent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)
startActivityForResult(enableIntent, requestEnableBt)
}
}
// register broadcast receiver in order to discover available devices
private fun discoverDevices(deviceList: MutableList<BluetoothDevice>?, result: MethodChannel.Result) {
val filter = IntentFilter(BluetoothDevice.ACTION_FOUND)
registerReceiver(receiver, filter);
result.success(deviceList)
}
private val receiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
when (intent.action) {
BluetoothDevice.ACTION_FOUND -> {
val device: BluetoothDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE)
deviceList?.add(device)
println("device found has selected parameters inside the broadcast receivver function $device")
}
"" -> println("broadcast receiver intent.action has no attribute")
null -> println("broadcast receiver intent.action was null")
}
}
}
}
Флаттер Main.Dart
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
void main() => runApp(MaterialApp(home: HomePage()));
class HomePage extends StatelessWidget {
static const platform = const MethodChannel('bluetooth.channel');
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Bluetooth Native'),
centerTitle: true,
),
body: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
RaisedButton(
color: Colors.blue[500],
onPressed: () {
printMethod();
},
child: Text('connect to Devices'),
)
],
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
RaisedButton(
color: Colors.blue[500],
onPressed: () {
discoverBlue();
},
child: Text('Discover devices'),
)
],
)
],
),
);
}
void printMethod() async {
String value;
try {
value = await platform.invokeMethod("getBlue");
} catch (e) {
print(e);
}
print('printing from dart: $value');
}
void discoverBlue() async {
Future<List> list;
list = platform.invokeListMethod("discoverBlue", list);
list.then((val) {
print("got values from kotlin $val");
});
}
}