如何从broadcastReceiver类调用flutter方法?

如何解决如何从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。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?