Флаттер Kotlin Получение данных от приемника вещания - PullRequest
0 голосов
/ 17 апреля 2020

Я пытаюсь использовать собственную реализацию 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");
    });
  }
}

1 Ответ

0 голосов
/ 17 апреля 2020

Я вижу, что вы не запустили процесс обнаружения. вам нужно выполнить

        val myAdapter = BluetoothAdapter.getDefaultAdapter();
        myAdapter.startDiscovery();

также, поскольку это asyn c задача в kotlin. вернуть результат в

BluetoothAdapter.ACTION_DISCOVERY_FINISHED

Таким образом, ваш MainActivity.kt будет

package com.example.testapp

import android.annotation.SuppressLint
import android.app.Activity
import android.bluetooth.BluetoothAdapter
import android.bluetooth.BluetoothDevice
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import androidx.annotation.NonNull
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugins.GeneratedPluginRegistrant


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)
                "allPaired" -> getConnectedDevices(result)
            }
        }
    }

    private fun getConnectedDevices(result: MethodChannel.Result) {
        val mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter()
        val pairedDevices = mBluetoothAdapter.bondedDevices

        val s: MutableList<String> = ArrayList()
        for (bt in pairedDevices) s.add(bt.name)
        result.success(s);
    }

    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 myAdapter = BluetoothAdapter.getDefaultAdapter();
        myAdapter.startDiscovery();

        val filter = IntentFilter(BluetoothDevice.ACTION_FOUND)
        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")
                    }
                    BluetoothAdapter.ACTION_DISCOVERY_FINISHED -> {
                        result.success(deviceList)
                    }
                    "" -> println("broadcast receiver intent.action has no attribute")
                    null -> println("broadcast receiver intent.action was null")
                }
            }
        }
        registerReceiver(receiver, filter)
    }


}

, а 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: Container(
        width: double.infinity,
        child: Column(
          mainAxisSize: MainAxisSize.max,
          crossAxisAlignment: CrossAxisAlignment.center,
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            RaisedButton(
              color: Colors.blue[500],
              onPressed: () {
                printMethod();
              },
              child: Text('connect to Devices'),
            ),
            RaisedButton(
              color: Colors.blue[500],
              onPressed: () {
                discoverBlue();
              },
              child: Text('Discover devices'),
            ),
            RaisedButton(
              color: Colors.blue[500],
              onPressed: () {
                getAllPaired();
              },
              child: Text('All paired 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");
    });
  }

  void getAllPaired() async {
    var value = await platform.invokeListMethod("allPaired");
    print(value);
  }
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...