简体   繁体   English

通过EventChannel向Flutter发送Android SMS BroadcastReceiver数据

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM