Как вызвать метод flutter из класса BroadcastReceiver?

#android #flutter #dart #background-service #flutter-method-channel

#Android #flutter #dart #фоновая служба #flutter-метод-канал

Вопрос:

Я пытаюсь активировать метод flutter при полученном вызове. Я уже выполнил приемную часть, но пока не могу пробудить метод flutter.

Я попытался вызвать метод channel в методе onReceive() в классе MainActivity.kt, но он выдает ошибку. канал метода, похоже, работает только в методе onCreate().

Вопрос в том, как я могу вызвать метод flutter в onReceive() или есть другой способ сделать это?

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

Ответ №1:

По сути, вы не можете напрямую получить доступ к methodChannel в BroadcastReceiver, поэтому вам нужно создать methodChannel в объекте compaion, чтобы,

Добавьте эти строки в свой MainActivity

 companion object {
    lateinit var methodChannel: MethodChannel
}
  

И в onCreate метод MainActivity заменить

 val methodChannel = MethodChannel(flutterView, channel)
  

Для :

 methodChannel = MethodChannel(flutterView, channel)
  

теперь вы можете использовать MainActivity.methodChannel в любом месте вашего приложения.