Java 通过EventChannel向Flatter发送Android SMS广播接收器数据
我试图在Android设备上收听任何传入的短信,然后在收到短信时在我的Flitter应用程序中显示祝酒词。我通过EventChannel连接到Flatter,并使用广播接收器检测短信。每当我的广播接收器检测到短信时,如何发送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
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)
}