Flutter打开外部应用并获取返回数据的方法

在Flutter中如何打开外部应用并在返回时获取数据?我正在开发一个需要调用第三方应用(如地图或支付APP)的功能,使用url_launcher可以打开应用,但无法接收返回的数据。有没有方法可以实现类似Android的startActivityForResult效果?具体需要注意哪些平台差异(iOS/Android)?最好能提供完整的示例代码,包括权限和manifest的配置要点。

3 回复

在Flutter中,你可以使用url_launcher插件来打开外部应用。首先,添加依赖:

dependencies:
  url_launcher: ^6.0.9

然后,通过以下代码打开外部应用:

import 'package:url_launcher/url_launcher.dart';

Future<void> _launchApp() async {
  const uri = "targetapp://someaction";
  if (await canLaunch(uri)) {
    await launch(uri);
  } else {
    throw '无法打开应用';
  }
}

对于返回数据,Android可以使用Intent传递数据,而iOS则不支持直接返回数据。因此,你需要在打开外部应用时,预先定义好回调的URL Scheme或Universal Links,并在原生代码中处理返回的数据。

在Android中,修改MainActivity.java

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    String action = intent.getAction();
    Uri data = intent.getData();
    // 处理返回数据并存储到SharedPreferences
}

在Flutter端,监听路由变化:

import 'package:flutter/services.dart';

class AppLifeCycleManager {
  static final MethodChannel _channel = const MethodChannel('app_life_cycle');

  static Future<String?> get returnedData async {
    return await _channel.invokeMethod('getData');
  }
}

这样就可以实现打开外部应用并获取返回数据的功能。

更多关于Flutter打开外部应用并获取返回数据的方法的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在 Flutter 中,你可以使用 url_launcher 插件打开外部应用,但该插件本身不支持获取返回数据。如果需要获取返回数据,可以通过自定义的平台特定代码(Platform-Specific Code)实现。

  1. 打开外部应用
    使用 url_launcher 打开外部应用:

    import 'package:url_launcher/url_launcher.dart';
    
    Future<void> openApp() async {
      const url = 'myapp://'; // 目标应用的URI Scheme
      if (await canLaunch(url)) {
        await launch(url);
      } else {
        throw '无法打开链接: $url';
      }
    }
    
  2. 处理返回数据
    Android 和 iOS 的实现不同:

    • Android: 使用 Intent 返回数据,监听 onActivityResult
    • iOS: 使用 URL Scheme 并通过 AppDelegate 获取参数。

    在 Android 上,你需要写原生代码来接收返回值,并通过 MethodChannel 将数据传递给 Flutter。

  3. 示例代码(MethodChannel) Android 原生部分:

    [@Override](/user/Override)
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 100) {
            String result = data.getStringExtra("result");
            methodChannel.invokeMethod("setData", result);
        }
    }
    

    Flutter 部分:

    const platform = MethodChannel('your.channel.name');
    platform.setMethodCallHandler((call) async {
      if (call.method == "setData") {
        final data = call.arguments;
        print("接收到的数据: $data");
      }
    });
    

通过这种方式,你可以实现打开外部应用并获取返回数据的功能。

在Flutter中打开外部应用并获取返回数据可以通过url_launcherandroid_intent(Android)或uni_links(iOS)配合使用。以下是实现方法:

  1. 首先添加依赖(pubspec.yaml):
dependencies:
  url_launcher: ^6.1.11
  android_intent: ^2.0.2  # 仅Android需要
  uni_links: ^0.5.1       # 仅iOS需要
  1. 基本实现代码:
import 'package:url_launcher/url_launcher.dart';

// 打开外部应用
Future<void> openExternalApp() async {
  const url = 'yourappscheme://returndata'; // 替换为实际的应用scheme
  if (await canLaunch(url)) {
    await launch(url);
  } else {
    throw '无法打开应用';
  }
}
  1. 获取返回数据的方法:

Android方案(使用Intent和deep link):

// 在AndroidManifest.xml中配置intent-filter
Future<String?> getAndroidResponse() async {
  final AndroidIntent intent = AndroidIntent(
    action: 'action_view',
    data: 'yourappscheme://returndata',
    package: 'com.example.externalapp', // 外部应用包名
  );
  try {
    await intent.launch();
    // 通过deep link监听返回数据
  } catch (e) {
    print('Error: $e');
  }
  return null;
}

iOS方案(使用Universal Links):

// 在Info.plist中配置URL Types
Future<String?> getIOSResponse() async {
  const url = 'yourappscheme://returndata';
  if (await canLaunch(url)) {
    await launch(url, forceSafariVC: false);
    // 通过uni_links监听返回数据
  }
  return null;
}
  1. 接收返回数据: 使用uni_links包监听返回的URL:
import 'package:uni_links/uni_links.dart';

void initUniLinks() {
  uriLinkStream.listen((Uri? uri) {
    if (uri != null) {
      print('收到返回数据: ${uri.queryParameters}');
    }
  }, onError: (err) {
    print('错误: $err');
  });
}

注意事项:

  1. 需要提前和外部应用约定好URL scheme和返回数据格式
  2. 在Android和iOS的配置文件中注册你的URL scheme
  3. 测试时确保目标应用已安装且支持你调用的scheme
回到顶部