Flutter分享功能插件bemeli_sharing_intent的使用

发布于 1周前 作者 wuwangju 来自 Flutter

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 创建共享扩展:

  1. 打开 Xcode,选择 File > New > Target,然后选择 “Share Extension”。
  2. 给它命名,例如 “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 中,确保正确加载 hostAppBundleIdentifierAppGroupId

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 和共享扩展添加到同一组
  1. 转到 Capabilities 选项卡,为两个目标打开 App Groups 开关。
  2. 添加一个新的组,例如 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

1 回复

更多关于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!)),
            ],
          ),
        ),
      ),
    );
  }
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!