[英]Sending Android SMS BroadcastReceiver data to Flutter through EventChannel
I am trying to listen for any incoming SMS messages on an Android device and then showing a toast in my Flutter app whenever an SMS is received.我正在尝试在 Android 设备上侦听任何传入的 SMS 消息,然后在收到 SMS 时在我的 Flutter 应用程序中显示吐司。 I am connecting to Flutter through EventChannel and detecting SMS using a BroadcastReceiver.我通过 EventChannel 连接到 Flutter 并使用 BroadcastReceiver 检测 SMS。 How do I send an events.success(message)
whenever my broadcast receiver detects an SMS?每当我的广播接收器检测到 SMS 时,我如何发送events.success(message)
?
I tried adding the BroadcastReceiver directly inside the EventChannel but that did not work.我尝试将 BroadcastReceiver 直接添加到 EventChannel 中,但这没有用。 The flutter SMS package also doesn't seem to work. flutter SMS 包似乎也不起作用。
This is what my MainActivity looks like:这是我的 MainActivity 的样子:
public class MainActivity extends FlutterActivity{
public static final String STREAM = "com.myapp.thisapp/stream";
public static final String TAG = "THIS IS A MESSAGE: ";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
GeneratedPluginRegistrant.registerWith(this);
new EventChannel(getFlutterView(), STREAM).setStreamHandler(
new EventChannel.StreamHandler() {
@Override
public void onListen(Object args, final
EventChannel.EventSink events) {
//Send events.success() when SMS received
Log.w(TAG, "adding listener");
}
@Override
public void onCancel(Object args) {
Log.w(TAG, "cancelling listener");
}
}
);
}
}
And this is the code for my BroadcastReceiver:这是我的 BroadcastReceiver 的代码:
public class IncomingSmsBroadcastReceiver extends BroadcastReceiver {
private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
@Override
public void onReceive(final Context context, final Intent intent) {
if (intent != null && SMS_RECEIVED.equals(intent.getAction())) {
final SmsMessage smsMessage = extractSmsMessage(intent);
processMessage(context, smsMessage);
}
}
private SmsMessage extractSmsMessage(final Intent intent) {
final Bundle pudsBundle = intent.getExtras();
final Object[] pdus = (Object[]) pudsBundle.get("pdus");
final SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) pdus[0]);
return smsMessage;
}
private void processMessage(final Context context, final SmsMessage smsMessage) {
//TODO: Send message to event channel
}
}
Whenever the BroadCastReceiver encounters an SMS, I want the content of the message to be sent to the EventChannel which will send the message text to the Flutter front-end.每当 BroadCastReceiver 遇到 SMS 时,我都希望将消息内容发送到 EventChannel,EventChannel 会将消息文本发送到 Flutter 前端。 How do I do this?我该怎么做呢?
This is what you should be using in MainActivity, store the Result这是你应该在 MainActivity 中使用的,存储结果
public class MainActivity extends FlutterActivity{
public static final String STREAM = "com.myapp.thisapp/stream";
public static final String TAG = "THIS IS A MESSAGE: ";
public Result resultLater;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
GeneratedPluginRegistrant.registerWith(this);
new MethodChannel(getFlutterView(), CHANNEL).setMethodCallHandler(
new MethodCallHandler() {
@Override
public void onMethodCall(MethodCall call, Result result) {
//store the reference for later access
resultLater = result;
}
});
}
public class IncomingSmsBroadcastReceiver extends BroadcastReceiver {
private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
@Override
public void onReceive(final Context context, final Intent intent) {
if (intent != null && SMS_RECEIVED.equals(intent.getAction())) {
final SmsMessage smsMessage = extractSmsMessage(intent);
processMessage(context, smsMessage);
}
}
private SmsMessage extractSmsMessage(final Intent intent) {
final Bundle pudsBundle = intent.getExtras();
final Object[] pdus = (Object[]) pudsBundle.get("pdus");
final SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) pdus[0]);
return smsMessage;
}
}
private void processMessage(final Context context, final SmsMessage smsMessage) {
//here send back result, like this
if(smsMessage.getMessageBody()!=null){
result.success(smsMessage.getMessageBody());
}else{
result.error("Error", "Sms not found", null);
}
}
}
now make the sms broadcast sub class in your main activity and declare below.现在在您的主要活动中创建 sms 广播子类并在下面声明。 and access the result when you get the sms.并在收到短信时访问结果。 And from your flutter side just make channel call as usual.从你的颤振方面,只需像往常一样进行通道调用。
Follow the reference for docs sample .按照文档示例的参考。
Based on your first comment Laksh22 YES it can be possible.根据您的第一条评论Laksh22是的,这是可能的。
Create a constructor for your 'Activity' like this :为您的“活动”创建一个构造函数,如下所示:
_yourclassnameState() {
platform.setMethodCallHandler(JavaMethodHandler);
}
and then implement a handler for response然后实现一个响应处理程序
Future<dynamic> JavaMethodHandler(MethodCall methodcall) async
{
switch(methodcall.method)
{
case 'SMSRecived':
print('DataRecived is' + methodcall.arguments);
break;
default:
break;
}
}
then in your 'BroadcastReceiver' use this code to call a flutter method :然后在您的“广播接收器”中使用此代码调用颤振方法:
MethodChannel channel =new MethodChannel(view,CHANNEL);
channel.invokeMethod("SMSRecived",args, new MethodChannel.Result() {
@Override
public void success(Object o) {
System.out.println(o);
}
@Override
public void error(String s, String s1, Object o) {
}
@Override
public void notImplemented() {
}
});
Don't forget about CHANNEL.不要忘记频道。 It should be the same both side.两边应该是一样的。
Don't forget about manifest file.不要忘记清单文件。
For receiving SMS while your app is closed use 'ForegroundService'.Unfortunately Flutter dosen't support ForegroundService yet.要在您的应用关闭时接收短信,请使用“ForegroundService”。不幸的是,Flutter 尚不支持 ForegroundService。 you should implement it in Java.你应该用Java实现它。
Register your broadcast receiver in EventChannel's onListen
method在 EventChannel 的onListen
方法中注册您的广播接收器
override fun onListen(arguments: Any?, eventSink: EventSink) {
val receiver = IncomingSmsBroadcastReceiver()
receiver.setListener(object : SmsReceiveListener() {
override fun onSmsReceive(sms: String?) {
eventSink.success(sms)
}
})
val filter = IntentFilter(IncomingSmsBroadcastReceiver.SMS_RECEIVED)
context.registerReceiver(receiver, filter)
}
A SmsReceiveListener
is registered to IncomingSmsBroadcastReceiver
to listen to the received message. SmsReceiveListener
注册到IncomingSmsBroadcastReceiver
以收听接收到的消息。
For more detail check the below URL:-有关更多详细信息,请查看以下网址:-
https://medium.com/cashify-engineering/event-channel-to-listen-to-broadcast-events-from-android-43a813672896 https://medium.com/cashify-engineering/event-channel-to-listen-to-broadcast-events-from-android-43a813672896
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.