如何从broadcastReceiver类调用flutter方法?

问题描述

我正在尝试在收到的呼叫中唤醒flutter方法。我已经完成了接收部分,但是还不能唤醒颤振方法。

我尝试在MainActivity.kt类的onReceive()方法中调用方法channel,但它给了我错误。方法通道似乎仅在onCreate()方法中起作用。

问题是我该如何在onReceive()中调用flutter方法,或者还有另一种方法?

MainActivity.kt

import android.Manifest
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.content.pm.PackageManager
import android.os.Build
import android.os.Bundle
import android.widget.Toast
import androidx.annotation.RequiresApi
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import io.flutter.app.FlutterActivity
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugins.GeneratedPluginRegistrant


class MainActivity: FlutterActivity(){


    var updateUIReciver: BroadcastReceiver? = null

    @RequiresApi(Build.VERSION_CODES.O)
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        GeneratedPluginRegistrant.registerWith(this)
        registerReceiver(broadcastReceiver,IntentFilter("Service.to.activity"));

        val channel = "my.data"
        val methodChannel = MethodChannel(flutterView,channel)
        val map: HashMap<String,String> = HashMap()


        val permissionCheck: Int = ContextCompat.checkSelfPermission(this,Manifest.permission.READ_PHONE_STATE)
        if (permissionCheck == PackageManager.PERMISSION_GRANTED) {
            Toast.makeText(this,"Permission granted ",Toast.LENGTH_LONG).show();

        } else {
            //TODO
            ActivityCompat.requestPermissions(this,arrayOf(Manifest.permission.READ_PHONE_STATE),4);
            Toast.makeText(this,"Permission not granted ",Toast.LENGTH_LONG).show();
        }

        methodChannel.setMethodCallHandler { call: MethodCall,result: MethodChannel.Result? ->
            if (call.method == "callMyFunction") {
                methodChannel.invokeMethod("callMyFunction",map)

            } else {

            }
        }
    }

    var broadcastReceiver: BroadcastReceiver = object : BroadcastReceiver() {

        override fun onReceive(context: Context,intent: Intent) {

            Toast.makeText(context,"Incoming call received",Toast.LENGTH_LONG).show()
// I can't call "methodChannel.invokeMethod("callMyFunction",map)" here cause of error.
        }
    }
}

MyBroadcastReceiver.kt

import android.app.Service
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.telephony.PhoneStateListener
import android.telephony.TelephonyManager
import androidx.core.app.NotificationCompat
import android.app.NotificationManager;
import android.os.Build;
import android.os.IBinder;
import android.widget.Toast

class MyBroadcastReceiver : BroadcastReceiver() {

    override fun onReceive(context: Context,intent: Intent) {


        val telephony = context.getSystemService(Service.TELEPHONY_SERVICE) as TelephonyManager
        telephony.listen(object : PhoneStateListener() {
            override fun onCallStateChanged(state: Int,incomingNumber: String) {
                super.onCallStateChanged(state,incomingNumber)
                
                context.sendBroadcast(Intent("Service.to.activity"))


            }
        },PhoneStateListener.LISTEN_CALL_STATE)
    }
}

Flutter代码

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

  Future<void> _receiveFromNative(MethodCall call) async {
    try {
      if (call.method == "callMyFunction") {

        print("Received in flutter");
      }
    } on PlatformException catch (e) {}
  }

  platform.setMethodCallHandler(_receiveFromNative);

解决方法

基本上你不能直接访问 BroadcastReceiver 中的 methodChannel 所以你必须在 compaion 对象中创建 methodChannel 所以,

将这些行添加到您的 MainActivity

companion object {
    lateinit var methodChannel: MethodChannel
}

并在 MainActivity 的 onCreate 方法中替换

val methodChannel = MethodChannel(flutterView,channel)

致:

methodChannel = MethodChannel(flutterView,channel)

现在您可以在应用的任何位置使用 MainActivity.methodChannel。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...