当前位置: 首页 > 知识库问答 >
问题:

如何从原生(Android)向Flutter发送数据

鲁鹏
2023-03-14

我需要将下面的类中的数据传递到我的Flitter应用程序,其中的数据仅在来电事件发生时可用。我需要将此数据(mobileNumber)传递给颤振(如果可能,即使颤振应用程序终止,我也需要传递数据)

广播接收器。Java语言

package com.ashbu.flutterappbackground;
...

public class MyBroadcastReceiver extends BroadcastReceiver {
    String phoneNumber;

        @Override
        public void onReceive(final Context context, Intent intent) {
            TelephonyManager telephony = (TelephonyManager)context.getSystemService(Service.TELEPHONY_SERVICE);
            telephony.listen(new PhoneStateListener(){
                @Override
                public void onCallStateChanged(int state, String incomingNumber) {
                    super.onCallStateChanged(state, incomingNumber);
                    phoneNumber = incomingNumber;
                    Toast.makeText(context, "TeleDuce Customer "+ incomingNumber,
                Toast.LENGTH_LONG).show();
                }
            },PhoneStateListener.LISTEN_CALL_STATE);
        }


   public  String getData() {
    String number = null;
    if (phoneNumber != null) {
        number = phoneNumber;
    }else {
        number = "noData";
    }
    return number;
    }

}根据以上代码,我需要将incomingNumber传递给Flatter。如果可能-即使应用程序已关闭,也要共享数据。

MainActivity.java

public class MainActivity extends FlutterActivity {
private static final String CHANNEL = "samples.flutter.dev/getNumber";

AlarmManager alarmManager;
PendingIntent pendingIntent;

@Override
public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
    super.configureFlutterEngine(flutterEngine);
    alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    Intent alarmIntent = new Intent(this, MyService.class);
    pendingIntent = PendingIntent.getBroadcast(this, 0, alarmIntent, 0);

    new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL)
            .setMethodCallHandler(
                    (call, result) -> {

                        // Note: this method is invoked on the main thread.
                        if (call.method.equals("getMobileNumber")) {
                            startAlarm();
                            MyBroadcastReceiver dataGEt = new MyBroadcastReceiver();
                            System.out.println(dataGEt.getData());
                            result.success(dataGEt.getData());
                        } else {
                            cancelAlarm();
                        }
                    }
            );
}

private void startAlarm() {

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        alarmManager.setAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, 0, pendingIntent);
    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        alarmManager.setExact(AlarmManager.RTC_WAKEUP, 0, pendingIntent);
    } else {
        alarmManager.set(AlarmManager.RTC_WAKEUP, 0, pendingIntent);
    }
}

private void cancelAlarm() {
    alarmManager.cancel(pendingIntent);
    Toast.makeText(getApplicationContext(), "Alarm Cancelled", Toast.LENGTH_LONG).show();
}
}

目前,即使应用程序被终止,上述代码也能正常工作。但我不知道在应用程序终止后,Flitter是否会接受数据

共有2个答案

牛经赋
2023-03-14

我将列表作为参数从main.dart传递到MainActivity.kt类

总的来说。飞奔

var  items =['hello', 'hii', 'flowers', 'roses','loutes']; 
 Future<void> _getDeviceInfo() async {
    String result;
    try {
      platform.invokeMethod('getDeviceInfo' , items).then((items) {
        result = items.toString();
        setState(() {
          deviceInfo = result;
        });
      });
    } on PlatformException catch (e) {
      print("_getDeviceInfo==>${e.message}");
    }
  }

在MainActivity中。kt级

package com.example.flutter_to_native


import android.content.Intent
import android.os.Bundle
import android.os.PersistableBundle
import android.util.Log

import androidx.annotation.NonNull
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel

class MainActivity : FlutterActivity() {
    private val CHANNEL = "com.example.flutter/device_info" // Unique Channel


    override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)

        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler {
            // Note: this method is invoked on the main thread.
                call, result ->
            if (call.method == "getDeviceInfo") {
                val data = call.arguments
                Log.d("data1", "$data")
                val intent = Intent(this, DemoActivity::class.java)
                intent.putExtra("data",data.toString())
                startActivity(intent)

              else {
                result.notImplemented()
            }

        }
    }


    
}
郦何平
2023-03-14

您应该在flatterside中实现methodHandler,并且应该使methodchannel成为静态对象

例如

class MethodChannelHelper {
  static const MethodChannel channel = const MethodChannel('method_channal_name');
}
class MethodChannelCall{
        static initMethodChannel({Function onCallBack}) async {
            MethodChannelHelper.channel.setMethodCallHandler((MethodCall call) async {
              switch (call.method) {
                case 'callback_from_native':
                  print("This method will be called when native fire")
              }
            });
     await MethodChannelHelper.channel.invokeMethod('call_native');
          }
}

总的来说。飞奔

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await MethodChannelCall.initMethodChannel(onCallBack: (payload) {

  });
  runApp(MyApp());
}

现在在Android端

 override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: Result) {
 when (call.method) {
            "call_native" -> {
            methodChannel?.invokeMethod("callback_from_native","")

}
}
 类似资料:
  • 我需要将一些数据从 Angular 传递到 Node.js 服务器。这是我的角度帖子列表组件:从“@angular/核心”导入 { 组件,OnInit };从 “@angular/common/http” 导入 { HttpClient }; 我的node.js服务器: 我想安慰一下。记录数据,但什么都没有发生。

  • 我一直在尝试调试通过平台通道在颤振中调用的本机android代码,调试仅在颤振端进行。在本机android中,执行不会命中断点。应用程序按预期工作,但调试没有。我正在使用Android studio。有人能告诉我如何调试原生android代码吗?

  • 本文向大家介绍Android如何在原生App中嵌入Flutter,包括了Android如何在原生App中嵌入Flutter的使用技巧和注意事项,需要的朋友参考一下 本文参考文档Add Flutter to existing apps。 首先有一个可以运行的原生项目 第一步:新建Flutter module Terminal进入到项目根目录,执行flutter create -t module ‘m

  • 我正在开发一个应用程序,该应用程序收集用户选择(从复选框中)并将其发送到一个新活动(当按下按钮时)。在新活动中,将收集一个新数据(editText)并将新收集的接收数据合并并通过电子邮件发送。 当我按下第一个按钮将复选框数据发送到新活动时,我得到一个错误: 应用程序意外停止 下面是代码: 复选框转换方法为: 所以,如果有任何错误,请告诉我。

  • 我似乎不知道如何使通过平台频道从颤振应用程序调用的本机Android模块的调试工作正常。我使用的是颤振文档中的样本(https://flutter.dev/docs/development/platform-integration/platform-channels).我试过以下方法: 在IntelliJ中打开Flutter项目 右键单击android文件夹,选择Flutter|Open Andr

  • 我正在尝试从Android向我的php服务器提交数据。然而,所有的答案似乎都使用了不推荐使用的ApacheHTTP库。我不想用它,当我试着用的时候,它不起作用。 现在它似乎什么也没做。它似乎连接到web服务器,但服务器不写入任何数据。如果我只是用浏览器访问url,它会写入一个文件。 php代码是 然后在Android studio中,我会在按下按钮后放入所有代码