Titas Černiauskas
Titas Černiauskas

Reputation: 1446

How to invoke flutter method from broadcastReceiver class?

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

Upvotes: 3

Views: 2552

Answers (1)

Harsh Kanjariya
Harsh Kanjariya

Reputation: 543

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.

Upvotes: 1

Related Questions