Получение данных со сканера [код Котлина] и отправка их во Флаттер через MethodChannel - PullRequest
0 голосов
/ 29 января 2019

[Изменить 4 февраля 2019]
Я отказался от Kotlin, и я действительно из моей зоны комфорта, используя Java, я думаю, что я почти там, но я получаю эту ошибку

MissingPluginException (Не найдена реализация для метода прослушивания на канальном сканере)

Вот мой последний код, я мог бы использовать некоторую помощь:

сторона Java

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import io.flutter.app.FlutterActivity;
import io.flutter.plugin.common.EventChannel;
import io.flutter.plugin.common.PluginRegistry;
import io.flutter.plugins.GeneratedPluginRegistrant;

public class MainActivity extends FlutterActivity implements EventChannel.StreamHandler {

  static IntentFilter filter = new IntentFilter();
  static String mAction = "++++CENSOR++++";
  static final String mKey = "++++CENSOR++++";
  static final String mEventCall = "scanner";
  private PluginRegistry.Registrar mRegistrar;
  private EventChannel.EventSink mEventSink;

  public void registerWith(Registrar registrar) {
      MainActivity plugin = new MainActivity();
      final EventChannel channel = new EventChannel(registrar.messenger(),mEventCall);
      channel.setStreamHandler(plugin);
  }

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    filter.addCategory(Intent.CATEGORY_DEFAULT);
    filter.addAction(mAction);
    registerReceiver(myBroadcastReceiver, filter);
    GeneratedPluginRegistrant.registerWith(this);
  }

  @Override
  protected void onDestroy()
  {
    super.onDestroy();
    unregisterReceiver(myBroadcastReceiver);
  }

  private BroadcastReceiver myBroadcastReceiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {
      String action = intent.getAction();
      if (action.equals(mAction)) {
        try {
            String data = intent.getStringExtra(mKey);
            mEventSink.success(data);
        } catch (Exception e) {
        }
      }
    }
  };

    public void onListen(Object o, EventChannel.EventSink eventSink) {
      mEventSink=eventSink;
    }

    public void onCancel(Object arguments) {
      mEventSink=null;
    }
}

сторона флаттера

scanner.dart

import 'package:flutter/services.dart';
import 'dart:async';

class Scanner {
  static const String mEventCall = 'scanner';
  static const EventChannel _eventChannel = const EventChannel(mEventCall);
  static Stream<String> _readingStream;
  static Stream<String> get readingStream {
    if(_readingStream== null){
      _readingStream =_eventChannel.receiveBroadcastStream().map<String>((value)=> value);
    }
    return _readingStream;
  }

}

main.dart

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Scanner Beta',
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {

  Stream<String> _stream = Scanner.readingStream;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("test"),
      ),
      body: Center(
        child: StreamBuilder(
          initialData: "",
          stream: _stream,
            builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
            return Text(snapshot.data);
            }
        )
      ),
    );
  }
}

[редактировать: 30 января]
Я проверил предлагаемую ссылку , конечно, это дает мне лучшее понимание контекста, с которым я еще не знаком, но я считаю, что моя проблема имеет другую природу:
Я пытаюсь объяснить себя лучше:
1. (нативное приложениена устройстве) -> широковещательная интенция и действие
2. (мой приемник широковещательной рассылки kotlin) -> получить интент и действие
3. (ЧАСТЬ ПРОПУСКА) необходимо получить данные из намерения/ действие для MethodChannel
4. (мой kotlin MethodChannel) -> отправлять данные в Flutter через платформу invokeMethod

еще раз спасибо заранее за любую помощь, которую вы можете оказать мне Francesco

[оригинальный пост]
Я пытаюсь создать приложение для чтения данных сканера (и другиевсе с этим) Я (вроде / думаю, я) знаю, как использовать methodChannel для передачи данных от kotlin к флаттеру, сканер не имеет реального плагина, но я могу использовать BroadcastReceiver + IntentFilter для прослушивания 'действие сканера ';

моя проблема - соединить их вместе, как я могу убедиться, что всякий раз, когда Br..Receiver «получает» что-то, он передает его в канал метода (БЕЗ касания экрана это устройство )

Бонус, я действительно вне этой зоны комфорта с этой задачей, я мог бы (вероятно) сделать некоторую ошибку, я действительно могу использовать другую пару глаз

Вот мой код: //////////////// KOTLIN

// get data from scanner API
import android.os.Bundle
import io.flutter.plugins.GeneratedPluginRegistrant
import android.content.BroadcastReceiver
import android.content.Context
import android.content.IntentFilter
import android.content.Intent;

//send data to flutter
import io.flutter.app.FlutterActivity
import io.flutter.plugin.common.MethodChannel;

class MainActivity:FlutterActivity() {

    private var scanData:String? = null


    private val SCANNER_ACTION = "++++censored++++"
    private val SCANNER_INTENT_DATA = "++++censored++++"
    private val FLUTTER_CHANNEL = "scanner.data"
    private val FLUTTER_METHOD = "getScannerData"

    override fun onCreate(savedInstanceState:Bundle?) {


        private const method_flutter = MethodChannel(flutterView, FLUTTER_CHANNEL)

    super.onCreate(savedInstanceState)

        //send intent to flutter
        GeneratedPluginRegistrant.registerWith(this)
       method_flutter.setMethodCallHandler{
            methodCall, result ->
            if (methodCall.method == FLUTTER_METHOD) {
                if (scanData!=null) {
                    result.success(scanData)
                } else {
                    result.error(null,null,null)
                }
            } else {
                result.notImplemented()
            }
        }

        ///scanner INTENT FILTER
        val filter = IntentFilter()
        filter.addCategory(Intent.CATEGORY_DEFAULT)
        filter.addAction(SCANNER_ACTION)
        registerReceiver(receiver, filter)
    }

     // END OF 'onCreate'
     // SCANNER RECEIVER
     private val receiver = object : BroadcastReceiver() {
         override fun onReceive(contxt: Context?, intent: Intent?) {
             if (intent?.action == SCANNER_ACTION) {
                scanData = intent.getStringExtra(SCANNER_INTENT_DATA)
             }
         }
     }

    override fun onDestroy() {
        super.onDestroy()
        unregisterReceiver(receiver)
    }
}

////////////////// DART

import 'dart:async';
import 'package:flutter/services.dart';

    class Plugin {
      static const platform =  MethodChannel('scanner.data');
      Future<String> get data async => await platform.invokeMethod('getScannerData');
      }
...