如何在后台检测调用并在本机代码和dart代码之间建立桥梁

mxg2im7a  于 2023-02-17  发布在  其他
关注(0)|答案(1)|浏览(96)

我正尝试从dart代码发送一个通知,当收到来电时,我无法在android原生代码和flutter代码之间建立一个桥梁,问题是我需要这个功能在后台工作,我会这样描述这个循环:

  1. Flutter Android原生代码必须检测后台调用
    1.本机代码必须调用Flutter dart代码中的某个类
    1.此类在数据库中查找有关调用方的某些信息
    1.找到以后呢要弹出一个通知,里面有一些细节。
    我设法做了第三部分和第四部分,但我需要帮助的第一部分和第二部分。
    我试图找出this给定的例子,但它太复杂了
    我发现这个方法可以检测传入的调用,但是我无法将它附加到mainActivity类,第2部分如何
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.PhoneStateListener;
import android.widget.Toast;
import android.telephony.TelephonyManager;

public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(final Context context, Intent intent) {
        TelephonyManager telephony = (TelephonyManager)context.getSystemService(Service.TELEPHONY_SERVICE);
        telephony.listen(new PhoneStateListener(){
            @Override
            public void onCallStateChanged(int state, String incomingNumber) {

// I think this is the part, where I should call my dart class.

            }
        },PhoneStateListener.LISTEN_CALL_STATE);
    }
}

问题是如何正确地检测一个调用,以及如何从android本机代码调用dart类?

7d7tgy0s

7d7tgy0s1#

您可以在native和dart之间创建MethodChannel。

String channel = "my.data";
    MethodChannel methodChannel = new MethodChannel(Objects.requireNonNull(getFlutterEngine()).getDartExecutor().getBinaryMessenger(), channel);
    final HashMap<String, String> map = new HashMap<>();
    map.put("yourvar", "myvar");

    methodChannel.setMethodCallHandler(
            new MethodChannel.MethodCallHandler() {
                @Override
                public void onMethodCall(MethodCall call, MethodChannel.Result result) {
                    if (call.method.equals("onFinish")) {
                        finish();
                    }
                }
            });
    methodChannel.invokeMethod("callMyFunction", map);

在你的dart文件中写下这段代码,

static const platform = const MethodChannel('my.data"');

  _MyPageState() {
    platform.setMethodCallHandler(_receiveFromNative);
  }

  Future<void> _receiveFromNative(MethodCall call) async {
    try {
      print(call.method);
      if (call.method == "callMyFunction") {
        print(call.arguments['yourvar']);
        //write your code here
       }
      } on PlatformException catch (e) {}
   }

您也可以引用this document

相关问题