Flutter分享功能插件flutter_sharing_intent的使用

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

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

1 回复

更多关于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来实现分享功能:

  1. 导入插件

在你的Dart文件中导入flutter_sharing_intent插件:

import 'package:flutter_sharing_intent/flutter_sharing_intent.dart';
  1. 实现分享功能

以下是一个简单的按钮点击事件,当按钮被点击时,会触发分享功能:

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方法的其他参数。

回到顶部