Java 通过EventChannel向Flatter发送Android SMS广播接收器数据

Java 通过EventChannel向Flatter发送Android SMS广播接收器数据,java,android,flutter,Java,Android,Flutter,我试图在Android设备上收听任何传入的短信,然后在收到短信时在我的Flitter应用程序中显示祝酒词。我通过EventChannel连接到Flatter,并使用广播接收器检测短信。每当我的广播接收器检测到短信时,如何发送events.success(消息) 我尝试将BroadcastReceiver直接添加到EventChannel中,但没有成功。Flitter短信包似乎也不起作用 这就是我的主要活动: public class MainActivity extends FlutterAct

我试图在Android设备上收听任何传入的短信,然后在收到短信时在我的Flitter应用程序中显示祝酒词。我通过EventChannel连接到Flatter,并使用广播接收器检测短信。每当我的广播接收器检测到短信时,如何发送
events.success(消息)

我尝试将BroadcastReceiver直接添加到EventChannel中,但没有成功。Flitter短信包似乎也不起作用

这就是我的主要活动:

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

}
这是我的广播接收器的代码:

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
    }

}

每当BroadCastReceiver遇到SMS时,我希望消息的内容被发送到EventChannel,EventChannel将消息文本发送到Flatter前端。如何执行此操作?

这是您应该在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);
            }

         }

  }
现在在你的主要活动中制作sms广播子类,并在下面声明。并在收到短信后访问结果。和往常一样,从你的颤振面打电话给频道


根据您的第一条评论,遵循参考。

是的,这是可能的

为“活动”创建构造函数,如下所示:

     _yourclassnameState() {
       platform.setMethodCallHandler(JavaMethodHandler);
     }
然后实现响应的处理程序

       Future<dynamic> JavaMethodHandler(MethodCall methodcall) async
       {
         switch(methodcall.method)
          {
           case 'SMSRecived':
            print('DataRecived is' + methodcall.arguments);
            break;
           default:
            break;
         }
       }
别忘了频道。两边都应该是一样的

不要忘记清单文件

要在应用程序关闭时接收短信,请使用“ForegroundService”。不幸的是,Fatter目前还不支持ForegroundService。您应该用Java实现它


在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)
}
SmsReceiveListener
注册到
IncomingSmsBroadcastReceiver
以侦听收到的消息

有关更多详细信息,请查看以下URL:-


收到短信时,有没有办法让短信正文自动摆动?现在,Flatter需要在每次希望看到传入的SMS时调用一个方法。到目前为止,Flatter无法直接访问SMS代码。但我的建议也应该起作用,因为它只是从本机回调到颤振,短信被接收,应该能够自动填充。你试过这个方法吗?您将如何以这种方式在清单中注册接收方?hi@DevilWarrior您可以按照通常的方式注册广播,只需静态地将其添加到清单文件中,并为其声明的类指定一个回调机制,以使用另一个广播或某个rxjava可观测或某个事件总线通知主活动。如果您在主活动中动态地添加了它,那么就将其细分并采取行动。希望这有帮助。我应该把我的问题说得更清楚。我已正确设置了广播接收器,并且能够通过intents将信息发送给FLIFTER。我在接收器中捕捉到事件,然后通过意图将事件发送到主要活动,而不是通过事件通道抖动。当我试图在应用程序关闭时发送事件时,问题就出现了。你知道怎么做吗?
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)
}