Flutter分享功能插件flutter_sharing_intent的使用
Flutter分享功能插件flutter_sharing_intent的使用
flutter_sharing_intent
是一个Flutter插件,允许Flutter应用程序接收来自其他应用程序的照片、视频、文本、网址或任何其他文件类型。
功能特性
- 支持从其他应用向Flutter应用分享图片、文本、视频、网址和文件。
- 支持从其他应用向Flutter应用分享多张图片、多个视频和多个文件。
安装
使用命令安装
$ flutter pub add flutter_sharing_intent
在pubspec.yaml中添加依赖
dependencies:
flutter_sharing_intent: ^latest_version
使用方法
我们主要使用以下几种方法:
getMediaStream()
:设置广播流以接收传入的媒体共享更改事件。getInitialSharing()
:在应用程序启动时获取共享数据。reset()
:清除所有共享数据。
Android配置
在android/app/src/main/manifest.xml
中添加以下代码片段,以支持不同的分享意图过滤器(例如分享文本、图片、视频等)。
<activity
android:name=".MainActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:exported="true"
android:theme="@style/LaunchTheme"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize"
android:screenOrientation="portrait"
android:launchMode="singleTask">
<!-- 分享文本 -->
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/*" />
</intent-filter>
<!-- 分享单张图片 -->
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="image/*" />
</intent-filter>
<!-- 分享多张图片 -->
<intent-filter>
<action android:name="android.intent.action.SEND_MULTIPLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="image/*" />
</intent-filter>
<!-- 分享单个视频 -->
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="video/*" />
</intent-filter>
<!-- 分享多个视频 -->
<intent-filter>
<action android:name="android.intent.action.SEND_MULTIPLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="video/*" />
</intent-filter>
<!-- 分享任意类型的文件 -->
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="*/*" />
</intent-filter>
<!-- 分享多个任意类型的文件 -->
<intent-filter>
<action android:name="android.intent.action.SEND_MULTIPLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="*/*" />
</intent-filter>
</activity>
iOS配置
1. 修改info.plist
在ios/Runner/info.plist
中添加以下内容:
<key>AppGroupId</key>
<string>$(CUSTOM_GROUP_ID)</string>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>SharingMedia-$(PRODUCT_BUNDLE_IDENTIFIER)</string>
</array>
</dict>
</array>
<key>NSPhotoLibraryUsageDescription</key>
<string>To upload photos, please allow permission to access your photo library.</string>
2. 创建Share Extension
通过Xcode创建一个新的目标(Target),选择“Share Extension”。确保Runner.app和share extension的部署目标相同。然后,在ios/Share Extension/info.plist
中添加如下代码:
<key>NSExtension</key>
<dict>
<key>NSExtensionAttributes</key>
<dict>
<key>PHSupportedMediaTypes</key>
<array>
<string>Video</string>
<string>Image</string>
</array>
<key>NSExtensionActivationRule</key>
<dict>
<key>NSExtensionActivationSupportsText</key>
<true/>
<key>NSExtensionActivationSupportsWebURLWithMaxCount</key>
<integer>1</integer>
<key>NSExtensionActivationSupportsImageWithMaxCount</key>
<integer>20</integer>
<key>NSExtensionActivationSupportsMovieWithMaxCount</key>
<integer>10</integer>
<key>NSExtensionActivationSupportsFileWithMaxCount</key>
<integer>10</integer>
</dict>
</dict>
<key>NSExtensionMainStoryboard</key>
<string>MainInterface</string>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.share-services</string>
</dict>
还需要编写Swift代码来处理接收到的数据,并将这些数据传递给主应用程序。这部分涉及到较为复杂的iOS开发知识,包括如何处理不同类型的附件(如文本、图片、视频等),以及如何通过UserDefaults或更安全的方式在扩展和主应用之间传递数据。
3. 将Runner和Share Extension加入同一个组
进入能力(Capabilities)标签页,为两个目标启用App Groups开关,并创建一个新的组(例如group.YOUR_HOST_APP_BUNDLE_IDENTIFIER
)。
4. 修改AppDelegate.swift
最后,在ios/Runner/AppDelegate.swift
中添加以下代码:
import flutter_sharing_intent
//...
override func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
let sharingIntent = SwiftFlutterSharingIntentPlugin.instance
if sharingIntent.hasSameSchemePrefix(url: url) {
return sharingIntent.application(app, open: url, options: options)
}
// 处理其他库(如uni_links)的url
return super.application(app, open: url, options:options)
}
示例Demo
这里给出一个完整的示例demo,用于展示如何使用flutter_sharing_intent
插件实现分享功能。
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:flutter_sharing_intent/flutter_sharing_intent.dart';
import 'package:flutter_sharing_intent/model/sharing_file.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({super.key});
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
late StreamSubscription _intentDataStreamSubscription;
List<SharedFile>? list;
@override
void initState() {
initSharingListener();
super.initState();
}
initSharingListener() {
// 当应用在内存中时,监听外部应用分享进来的媒体
_intentDataStreamSubscription = FlutterSharingIntent.instance.getMediaStream().listen((List<SharedFile> value) {
setState(() {
list = value;
});
print("Shared: getMediaStream ${value.map((f) => f.value).join(",")}");
}, onError: (err) {
print("getIntentDataStream error: $err");
});
// 应用关闭状态下接收到的分享数据
FlutterSharingIntent.instance.getInitialSharing().then((List<SharedFile> value) {
print("Shared: getInitialMedia => ${value.map((f) => f.value).join(",")}");
setState(() {
list = value;
});
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('Plugin example app'),
),
body: Center(
child: Container(
margin: const EdgeInsets.symmetric(horizontal: 24),
child: Text('Sharing data:\n${list?.join("\n\n")}\n'),
),
),
),
);
}
@override
void dispose() {
_intentDataStreamSubscription.cancel();
super.dispose();
}
}
以上就是关于flutter_sharing_intent
插件的详细介绍和使用指南,希望对您有所帮助!如果您有任何问题或需要进一步的帮助,请随时提问。
更多关于Flutter分享功能插件flutter_sharing_intent的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter分享功能插件flutter_sharing_intent的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用flutter_sharing_intent
插件来实现分享功能的示例代码。
首先,你需要在你的pubspec.yaml
文件中添加对flutter_sharing_intent
插件的依赖:
dependencies:
flutter:
sdk: flutter
flutter_sharing_intent: ^0.2.0 # 请注意版本号,使用最新版本
然后运行flutter pub get
来安装依赖。
接下来,在你的Flutter项目中,你可以按照以下步骤使用flutter_sharing_intent
来实现分享功能:
- 导入插件:
在你的Dart文件中导入flutter_sharing_intent
插件:
import 'package:flutter_sharing_intent/flutter_sharing_intent.dart';
- 实现分享功能:
以下是一个简单的按钮点击事件,当按钮被点击时,会触发分享功能:
import 'package:flutter/material.dart';
import 'package:flutter_sharing_intent/flutter_sharing_intent.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Share Example',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter Share Example'),
),
body: Center(
child: ElevatedButton(
onPressed: () {
_shareText("这是一个分享的示例文本!");
},
child: Text('分享文本'),
),
),
);
}
void _shareText(String text) async {
try {
final SharePosition position = await FlutterSharingIntent.share(
text: text,
title: '分享标题',
subject: '分享主题', // 可选参数
mimeType: 'text/plain', // MIME类型,对于文本分享通常是'text/plain'
);
// position 是一个枚举类型,表示分享操作的结果
// SharePosition.appSpecific 表示分享到了特定的应用
// SharePosition.systemShareDialog 表示通过系统分享对话框分享
// SharePosition.canceled 表示分享被取消
print("Share position: ${position.toString()}");
} catch (e) {
print("分享失败: ${e.toString()}");
}
}
}
在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个按钮。当按钮被点击时,会调用_shareText
函数,该函数使用FlutterSharingIntent.share
方法来触发分享操作。你可以根据需要修改分享的文本、标题、主题和MIME类型。
这个示例展示了如何使用flutter_sharing_intent
插件来在Flutter应用中实现基本的分享功能。如果你需要分享更多类型的内容(如图像、链接等),你可以调整mimeType
和传递给share
方法的其他参数。