您现在的位置是:网站首页> Flutter
Flutter与原生交互技术收集
- Flutter
- 2025-10-14
- 12人已阅读
Flutter与原生交互技术收集
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编程