How to invoke flutter method from broadcastReceiver class?

1,127

Basically you can't access methodChannel in BroadcastReceiver directly so you have to make methodChannel in compaion object So,

Add these lines to your MainActivity

companion object {
    lateinit var methodChannel: MethodChannel
}

And in onCreate method of MainActivity replace

val methodChannel = MethodChannel(flutterView, channel)

To :

methodChannel = MethodChannel(flutterView, channel)

now you can use MainActivity.methodChannel anywhere in your app.

Share:
1,127
Titas Černiauskas
Author by

Titas Černiauskas

Updated on December 24, 2022

Comments

  • Titas Černiauskas
    Titas Černiauskas over 1 year

    I am trying to awake flutter method on a received call. I already done the receiving part, but I can't awake flutter method yet.

    I tried calling method channel in onReceive() method in MainActivity.kt class, but it gives me error. method channel only seems to work in onCreate() method.

    The question is how can I invoke flutter method in onReceive() or is there another way to do it?

    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 code

     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);