您现在的位置是:网站首页> Flutter

Flutter与原生交互技术收集

  • Flutter
  • 2025-10-14
  • 12人已阅读
摘要

Flutter与原生交互技术收集


1.jpg


Flutter 与 原生代码 的相互调用

Flutter调用系统Activity并获得返回值例子



Flutter调用系统Activity并获得返回值例子

1. Flutter 端代码

system_activity_util.dart

import 'package:flutter/services.dart';


class SystemActivityUtil {

  // 创建MethodChannel,用于与原生通信

  static const MethodChannel _channel = MethodChannel('com.example/system_activity');


  // 调用系统图片选择Activity

  static Future<String?> pickImage() async {

    try {

      // 调用原生方法,并等待返回结果

      final String? result = await _channel.invokeMethod('pickImage');

      return result;

    } on PlatformException catch (e) {

      print('调用失败: ${e.message}');

      return null;

    }

  }

}


ImagePickerPage.dart

import 'package:flutter/material.dart';

import 'system_activity_util.dart';


class ImagePickerPage extends StatefulWidget {

  @override

  _ImagePickerPageState createState() => _ImagePickerPageState();

}


class _ImagePickerPageState extends State<ImagePickerPage> {

  String? _imagePath;


  // 打开系统图片选择器

  void _selectImage() async {

    String? path = await SystemActivityUtil.pickImage();

    setState(() {

      _imagePath = path;

    });

  }


  @override

  Widget build(BuildContext context) {

    return Scaffold(

      appBar: AppBar(

        title: const Text('调用系统Activity示例'),

      ),

      body: Center(

        child: Column(

          mainAxisAlignment: MainAxisAlignment.center,

          children: <Widget>[

            ElevatedButton(

              onPressed: _selectImage,

              child: const Text('选择图片'),

            ),

            const SizedBox(height: 20),

            if (_imagePath != null)

              Text(

                '选中的图片路径: \n$_imagePath',

                textAlign: TextAlign.center,

                style: const TextStyle(fontSize: 16),

              )

            else

              const Text('尚未选择图片')

          ],

        ),

      ),

    );

  }

}


2. Android 原生 Java 代码

SystemActivityPlugin.java

import android.app.Activity;

import android.content.Intent;

import android.net.Uri;

import android.provider.MediaStore;


import androidx.annotation.NonNull;


import io.flutter.plugin.common.MethodCall;

import io.flutter.plugin.common.MethodChannel;

import io.flutter.plugin.common.MethodChannel.MethodCallHandler;

import io.flutter.plugin.common.MethodChannel.Result;

import io.flutter.plugin.common.PluginRegistry.ActivityResultListener;


public class SystemActivityPlugin implements MethodCallHandler, ActivityResultListener {

    // 请求码,用于识别返回结果

    private static final int REQUEST_CODE_PICK_IMAGE = 1001;

    // 保存上下文

    private final Activity activity;

    // 保存结果回调

    private Result result;


    public SystemActivityPlugin(Activity activity) {

        this.activity = activity;

    }


    @Override

    public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {

        // 处理Flutter端调用的方法

        if (call.method.equals("pickImage")) {

            this.result = result;

            openImagePicker();

        } else {

            result.notImplemented();

        }

    }


    // 打开系统图片选择器

    private void openImagePicker() {

        Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

        activity.startActivityForResult(intent, REQUEST_CODE_PICK_IMAGE);

    }


    // 处理Activity返回结果

    @Override

    public boolean onActivityResult(int requestCode, int resultCode, Intent data) {

        // 检查请求码是否匹配

        if (requestCode == REQUEST_CODE_PICK_IMAGE) {

            if (result != null) {

                // 处理返回结果

                if (resultCode == Activity.RESULT_OK && data != null) {

                    Uri uri = data.getData();

                    // 将Uri转换为字符串返回给Flutter

                    result.success(uri.toString());

                } else if (resultCode == Activity.RESULT_CANCELED) {

                    result.success(null);

                } else {

                    result.error("ERROR", "选择图片失败", null);

                }

                result = null;

            }

            return true;

        }

        return false;

    }

}


MainActivity.java

import io.flutter.embedding.android.FlutterActivity;

import io.flutter.embedding.engine.FlutterEngine;

import io.flutter.plugin.common.MethodChannel;


public class MainActivity extends FlutterActivity {

    private SystemActivityPlugin systemActivityPlugin;


    @Override

    public void configureFlutterEngine(FlutterEngine flutterEngine) {

        super.configureFlutterEngine(flutterEngine);

        

        // 初始化插件

        systemActivityPlugin = new SystemActivityPlugin(this);

        

        // 注册MethodChannel,用于与Flutter通信

        new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), 

                          "com.example/system_activity")

            .setMethodCallHandler(systemActivityPlugin);

            

        // 注册ActivityResultListener,用于接收Activity返回结果

        getPluginRegistry().addActivityResultListener(systemActivityPlugin);

    }

}


3. 配置文件修改

需要在 AndroidManifest.xml 中添加相应权限:

<!-- 在AndroidManifest.xml中添加 -->

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />


<application

    ...

    <!-- 对于Android 10及以上版本 -->

    android:requestLegacyExternalStorage="true">

    ...

</application>









上一篇:AI辅助Flutter编程

Top