Flutter分享功能插件bemeli_sharing_intent的使用
Flutter分享功能插件bemeli_sharing_intent的使用
flutter_sharing_intent
flutter_sharing_intent
是一个用于允许 Flutter 应用接收来自其他应用程序的照片、视频、文本、URL 或其他文件类型的插件。
特性
- 允许从其他应用程序共享图像、文本、视频、URL 和文件到 Flutter 应用。
- 支持从其他应用程序共享多个图像、多个视频和多个文件到 Flutter 应用。
安装
在 pubspec.yaml
文件中添加依赖项:
dependencies:
flutter_sharing_intent: ^latest_version
然后运行以下命令安装插件:
$ flutter pub add flutter_sharing_intent
使用方法
我们使用以下方法:
getMediaStream()
=> 设置广播流以接收传入的媒体共享更改事件。getInitialSharing()
=> 在应用启动时获取共享数据。reset()
=> 清除所有共享数据。
Android
无需额外设置。
iOS
1. 添加以下配置
编辑 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>ShareMedia-$(PRODUCT_BUNDLE_IDENTIFIER)</string>
</array>
</dict>
</array>
<key>NSPhotoLibraryUsageDescription</key>
<string>为了上传照片,请允许访问您的相册。</string>
2. 创建共享扩展
通过 Xcode 创建共享扩展:
- 打开 Xcode,选择 File > New > Target,然后选择 “Share Extension”。
- 给它命名,例如 “Share Extension”。
确保 Runner.app
和共享扩展的部署目标一致。
添加以下代码到 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/>
<!-- 共享 URL 到您的应用 -->
<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>
在 ios/Share Extension/ShareViewController.swift
中,确保正确加载 hostAppBundleIdentifier
和 AppGroupId
:
override func viewDidLoad() {
super.viewDidLoad()
loadIds();
}
private func loadIds() {
let shareExtensionAppBundleIdentifier = Bundle.main.bundleIdentifier!;
let lastIndexOfPoint = shareExtensionAppBundleIdentifier.lastIndex(of: ".");
hostAppBundleIdentifier = String(shareExtensionAppBundleIdentifier[..<lastIndexOfPoint!]);
appGroupId = (Bundle.main.object(forInfoDictionaryKey: "AppGroupId") as? String) ?? "group.\(hostAppBundleIdentifier)";
}
3. 将 Runner 和共享扩展添加到同一组
- 转到 Capabilities 选项卡,为两个目标打开 App Groups 开关。
- 添加一个新的组,例如
group.YOUR_HOST_APP_BUNDLE_IDENTIFIER
(我的情况是group.com.techind.flutterSharingIntentExample
)。
4. 在主应用的 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)
}
return super.application(app, open: url, options: options)
}
完整示例
以下是一个完整的 Flutter 示例代码,展示如何使用 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](/user/override)
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
late StreamSubscription _intentDataStreamSubscription;
List<SharedFile>? list;
[@override](/user/override)
void initState() {
super.initState();
// 监听共享数据流
_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](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('插件示例应用'),
),
body: Center(
child: Container(
margin: const EdgeInsets.symmetric(horizontal: 24),
child: Text('共享数据:\n${list?.join("\n\n")}\n'),
),
),
),
);
}
[@override](/user/override)
void dispose() {
_intentDataStreamSubscription.cancel();
super.dispose();
}
}
更多关于Flutter分享功能插件bemeli_sharing_intent的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter分享功能插件bemeli_sharing_intent的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
bemeli_sharing_intent
是一个 Flutter 插件,用于处理来自其他应用程序的分享内容。它允许你的 Flutter 应用接收来自其他应用(如浏览器、社交媒体应用等)的分享数据,比如文本、链接、图片等。
以下是如何使用 bemeli_sharing_intent
插件的步骤:
1. 添加依赖
首先,在 pubspec.yaml
文件中添加 bemeli_sharing_intent
插件的依赖:
dependencies:
flutter:
sdk: flutter
bemeli_sharing_intent: ^最新版本
然后运行 flutter pub get
来安装依赖。
2. 配置 Android 和 iOS 项目
Android
在 AndroidManifest.xml
文件中,添加 intent-filter
以接收分享内容:
<activity
android:name=".MainActivity"
android:launchMode="singleTop"
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="image/*" />
</intent-filter>
</activity>
iOS
在 Info.plist
文件中,添加以下内容以支持分享功能:
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeName</key>
<string>Text</string>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>LSItemContentTypes</key>
<array>
<string>public.text</string>
</array>
</dict>
<dict>
<key>CFBundleTypeName</key>
<string>Image</string>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>LSItemContentTypes</key>
<array>
<string>public.image</string>
</array>
</dict>
</array>
3. 在 Flutter 代码中使用插件
在 Flutter 代码中,你可以使用 bemeli_sharing_intent
来接收分享的内容。
import 'package:flutter/material.dart';
import 'package:bemeli_sharing_intent/bemeli_sharing_intent.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
[@override](/user/override)
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
String? _sharedText;
String? _sharedImage;
[@override](/user/override)
void initState() {
super.initState();
// 监听分享的文本
BemeliSharingIntent.getTextStream().listen((String text) {
setState(() {
_sharedText = text;
});
}, onError: (err) {
print("Error: $err");
});
// 监听分享的图片
BemeliSharingIntent.getImageStream().listen((String image) {
setState(() {
_sharedImage = image;
});
}, onError: (err) {
print("Error: $err");
});
// 获取初始的分享数据
BemeliSharingIntent.getInitialText().then((String? text) {
setState(() {
_sharedText = text;
});
});
BemeliSharingIntent.getInitialImage().then((String? image) {
setState(() {
_sharedImage = image;
});
});
}
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Sharing Intent Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
if (_sharedText != null) Text('Shared Text: $_sharedText'),
if (_sharedImage != null) Image.file(File(_sharedImage!)),
],
),
),
),
);
}
}