Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

A Flutter plugin that enables flutter apps to receive sharing photos, text and url from other apps.

License

NotificationsYou must be signed in to change notification settings

KasemJaffer/receive_sharing_intent

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

pub package

A Flutter plugin that enables flutter apps to receive sharing photos, videos, text, urls or any other file types from another app.

Also, supports iOS Share extension and launching the host app automatically.Check the providedexample for more info.

AndroidiOS
SupportSDK 19+ (Kotlin 1.9.22)12.0+ (Swift 5.0)

Alt Text

Usage

To use this plugin, addreceive_sharing_intent as adependency in your pubspec.yaml file. For example:

dependencies:receive_sharing_intent:^latest

Android

Add the following filters to yourandroid/app/src/main/AndroidManifest.xml:

<manifestxmlns:android="http://schemas.android.com/apk/res/android"..... <uses-permissionandroid:name="android.permission.READ_EXTERNAL_STORAGE"/>  <applicationandroid:name="io.flutter.app.FlutterApplication"        ...        ><!--Set activity launchMode to singleTask, if you want to prevent creating new activity instance everytime there is a new intent.-->    <activityandroid:name=".MainActivity"android:launchMode="singleTask"android:theme="@style/LaunchTheme"android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"android:hardwareAccelerated="true"android:windowSoftInputMode="adjustResize"><!--TODO:  Add this filter, if you want support opening urls into your app-->            <intent-filter>               <actionandroid:name="android.intent.action.VIEW" />               <categoryandroid:name="android.intent.category.DEFAULT" />               <categoryandroid:name="android.intent.category.BROWSABLE" />               <dataandroid:scheme="https"android:host="example.com"android:pathPrefix="/invite"/>            </intent-filter><!--TODO:  Add this filter, if you want support opening files into your app-->            <intent-filter>              <actionandroid:name="android.intent.action.VIEW" />              <categoryandroid:name="android.intent.category.DEFAULT" />              <dataandroid:mimeType="*/*"android:scheme="content" />            </intent-filter><!--TODO: Add this filter, if you want to support sharing text into your app-->            <intent-filter>               <actionandroid:name="android.intent.action.SEND" />               <categoryandroid:name="android.intent.category.DEFAULT" />               <dataandroid:mimeType="text/*" />            </intent-filter><!--TODO: Add this filter, if you want to support sharing images into your app-->            <intent-filter>                <actionandroid:name="android.intent.action.SEND" />                <categoryandroid:name="android.intent.category.DEFAULT" />                <dataandroid:mimeType="image/*" />            </intent-filter>            <intent-filter>                <actionandroid:name="android.intent.action.SEND_MULTIPLE" />                <categoryandroid:name="android.intent.category.DEFAULT" />                <dataandroid:mimeType="image/*" />            </intent-filter><!--TODO: Add this filter, if you want to support sharing videos into your app-->            <intent-filter>                <actionandroid:name="android.intent.action.SEND" />                <categoryandroid:name="android.intent.category.DEFAULT" />                <dataandroid:mimeType="video/*" />            </intent-filter>            <intent-filter>                <actionandroid:name="android.intent.action.SEND_MULTIPLE" />                <categoryandroid:name="android.intent.category.DEFAULT" />                <dataandroid:mimeType="video/*" />            </intent-filter><!--TODO: Add this filter, if you want to support sharing any type of files-->            <intent-filter>                <actionandroid:name="android.intent.action.SEND" />                <categoryandroid:name="android.intent.category.DEFAULT" />                <dataandroid:mimeType="*/*" />            </intent-filter>            <intent-filter>                <actionandroid:name="android.intent.action.SEND_MULTIPLE" />                <categoryandroid:name="android.intent.category.DEFAULT" />                <dataandroid:mimeType="*/*" />            </intent-filter>      </activity>  </application></manifest>....

iOS

1. Create Share Extension

  • Using Xcode, go to File/New/Target and Choose "Share Extension".
  • Give it a name, i.e., "Share Extension".

Make sure the deployment target for Runner.app and the share extension is the same.

2. Replace yourios/Share Extension/Info.plist with the following:

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPEplist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plistversion="1.0">  <dict>    <key>AppGroupId</key>    <string>$(CUSTOM_GROUP_ID)</string><key>CFBundleVersion</key><string>$(FLUTTER_BUILD_NUMBER)</string><key>NSExtension</key><dict><key>NSExtensionAttributes</key>        <dict>            <key>PHSupportedMediaTypes</key>               <array><!--TODO: Add this flag, if you want to support sharing video into your app-->                   <string>Video</string><!--TODO: Add this flag, if you want to support sharing images into your app-->                   <string>Image</string>               </array>            <key>NSExtensionActivationRule</key>            <dict><!--TODO: Add this flag, if you want to support sharing text into your app-->                <key>NSExtensionActivationSupportsText</key>                <true/><!--TODO: Add this tag, if you want to support sharing urls into your app-->            <key>NSExtensionActivationSupportsWebURLWithMaxCount</key>            <integer>1</integer><!--TODO: Add this flag, if you want to support sharing images into your app-->                <key>NSExtensionActivationSupportsImageWithMaxCount</key>                <integer>100</integer><!--TODO: Add this flag, if you want to support sharing video into your app-->                <key>NSExtensionActivationSupportsMovieWithMaxCount</key>                <integer>100</integer><!--TODO: Add this flag, if you want to support sharing other files into your app--><!--Change the integer to however many files you want to be able to share at a time--><key>NSExtensionActivationSupportsFileWithMaxCount</key><integer>1</integer>            </dict>        </dict><key>NSExtensionMainStoryboard</key><string>MainInterface</string><key>NSExtensionPointIdentifier</key><string>com.apple.share-services</string></dict>  </dict></plist>

3. Add the following to yourios/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>To upload photos, please allow permission to access your photo library.</string>...

4. Add the following to yourios/Runner/Runner.entitlements:

....<!--TODO:  Add this tag, if you want support opening urls into your app-->    <key>com.apple.developer.associated-domains</key>    <array>        <string>applinks:example.com</string>    </array>....

5. Add the following to yourios/Podfile:

...target'Runner'douse_frameworks!use_modular_headers!flutter_install_all_ios_podsFile.dirname(File.realpath(__FILE__))# Share Extension is name of Extension which you created which is in this case 'Share Extension'target'Share Extension'doinherit!:search_pathsendend...

6. Add Runner and Share Extension in the same group

  • Go toSigning & Capabilities tab and add App Groups capability inBOTH Targets:Runner andShare Extension
  • Add a new container with the name of your choice. For examplegroup.MyContainer in the example project itsgroup.com.kasem.ShareExtention
  • Add User-defined(Build Settings -> +) stringCUSTOM_GROUP_ID inBOTH Targets:Runner andShare Extension and set value to group id created above. You can use different group ids depends on your flavor schemes

7. Go to Build Phases of your Runner target and moveEmbed Foundation Extension to the top ofThin Binary.

8. Make yourShareViewControllerios/Share Extension/ShareViewController.swift inherit fromRSIShareViewController:

// If you get no such module 'receive_sharing_intent' error. // Go to Build Phases of your Runner target and// move `Embed Foundation Extension` to the top of `Thin Binary`.import receive_sharing_intentclassShareViewController:RSIShareViewController{          // Use this method to return false if you don't want to redirect to host app automatically.    // Default is trueoverridefunc shouldAutoRedirect()->Bool{returnfalse}}

Compiling issues and their fixes

  • Error: No such module 'receive_sharing_intent'

    • Fix: Go to Build Phases of your Runner target and moveEmbed Foundation Extension to the top ofThin Binary.
  • Error: App does not build after adding Share Extension?

    • Fix: Check Build Settings of your share extension and remove everything that tries to import Cocoapods from your main project. i.e. remove everything underLinking/Other Linker Flags
  • You might need to disable bitcode for the extension target

  • Error: Invalid Bundle. The bundle at 'Runner.app/Plugins/Sharing Extension.appex' contains disallowed file 'Frameworks'

Full Example

main.dart

import'package:flutter/material.dart';import'dart:async';import'package:receive_sharing_intent/receive_sharing_intent.dart';voidmain()=>runApp(MyApp());classMyAppextendsStatefulWidget {@override_MyAppStatecreateState()=>_MyAppState();}class_MyAppStateextendsState<MyApp> {lateStreamSubscription _intentSub;final _sharedFiles=<SharedMediaFile>[];@overridevoidinitState() {super.initState();// Listen to media sharing coming from outside the app while the app is in the memory.    _intentSub=ReceiveSharingIntent.instance.getMediaStream().listen((value) {setState(() {        _sharedFiles.clear();        _sharedFiles.addAll(value);print(_sharedFiles.map((f)=> f.toMap()));      });    }, onError: (err) {print("getIntentDataStream error: $err");    });// Get the media sharing coming from outside the app while the app is closed.ReceiveSharingIntent.instance.getInitialMedia().then((value) {setState(() {        _sharedFiles.clear();        _sharedFiles.addAll(value);print(_sharedFiles.map((f)=> f.toMap()));// Tell the library that we are done processing the intent.ReceiveSharingIntent.instance.reset();      });    });  }@overridevoiddispose() {    _intentSub.cancel();super.dispose();  }@overrideWidgetbuild(BuildContext context) {const textStyleBold=constTextStyle(fontWeight:FontWeight.bold);returnMaterialApp(      home:Scaffold(        appBar:AppBar(          title:constText('Plugin example app'),        ),        body:Center(          child:Column(            children:<Widget>[Text("Shared files:", style: textStyleBold),Text(_sharedFiles                      .map((f)=> f.toMap())                      .join(",\n****************\n")),            ],          ),        ),      ),    );  }}

About

A Flutter plugin that enables flutter apps to receive sharing photos, text and url from other apps.

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

[8]ページ先頭

©2009-2025 Movatter.jp