如何解决如何从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)
}
}
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 举报,一经查实,本站将立刻删除。