在 Android 上将视频和贴纸图片分享到 Instagram Story

Posted

技术标签:

【中文标题】在 Android 上将视频和贴纸图片分享到 Instagram Story【英文标题】:Share video and sticker Image to Instagram Story on Android 【发布时间】:2018-12-03 15:36:42 【问题描述】:

如何将视频作为背景和图像作为贴纸一起分享到 Instagram 快拍?

如果两个内容都是图像,则此文档只有一个解决方案。

https://developers.facebook.com/docs/instagram/sharing-to-stories/

我想发送背景视频和贴纸图片。 Instagram Story 可以做到吗?

我试过了,可惜没用:

   // Define image asset URI and attribution link URL
    Uri backgroundAssetUri = Uri.fromFile(new File(backgroundPath));
    Uri stickerAssetUri = Uri.fromFile(new File(stickerPath));

    // Instantiate implicit intent with ADD_TO_STORY action,
    // background asset, and attribution link
    Intent intent = new Intent("com.instagram.share.ADD_TO_STORY");
    intent.setDataAndType(backgroundAssetUri, "*/*");
    intent.putExtra("interactive_asset_uri", stickerAssetUri);
    intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

    callbackManager.startActivityForResult(Intent.createChooser(intent, "Share"), NatShareCallbacks.ACTIVITY_SHARE_INSTAGRAM_STORY);

但是带有两张图片的示例可以正常工作。我主要看到 SetType 的问题,因为它们是两种不同的内容类型。

[编辑]

没有贴纸的单独视频已经在 android 上对我有用,并且带有图像背景和图像贴纸的文档示例也可以完美运行。但不能同时使用视频和贴纸。

它在ios下运行没有任何问题:

NSData *backgroundVideo = [[NSFileManager defaultManager] contentsAtPath:path];

UIImage *appIcon = [UIImage imageNamed: [[[[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleIcons"] objectForKey:@"CFBundlePrimaryIcon"] objectForKey:@"CFBundleIconFiles"]  objectAtIndex:0]];

// Verify app can open custom URL scheme, open
NSURL *urlScheme = [NSURL URLWithString:@"instagram-stories://share"];
if ([[UIApplication sharedApplication] canOpenURL:urlScheme]) 
    // Assign background image asset and attribution link URL to pasteboard
    //NSArray *pasteboardItems = @[@@"com.instagram.sharedSticker.backgroundVideo" : backgroundVideo];
    NSArray *pasteboardItems = @[@@"com.instagram.sharedSticker.backgroundVideo" : backgroundVideo, @"com.instagram.sharedSticker.stickerImage" : UIImagePNGRepresentation(appIcon)];
    NSDictionary *pasteboardOptions = @UIPasteboardOptionExpirationDate : [[NSDate date] dateByAddingTimeInterval:60 * 5];
    // This call is iOS 10+, can use 'setItems' depending on what versions you support
    [[UIPasteboard generalPasteboard] setItems:pasteboardItems options:pasteboardOptions]; [[UIApplication sharedApplication] openURL:urlScheme options:@ completionHandler:nil];
 else 
    // Handle older app versions or app not installed case


【问题讨论】:

告诉我你的视频文件名 你试过用 image/* 作为类型吗 @RutvikBhatt 没有贴纸的单独视频已经为我工作了。所以它不应该是视频路径。 @ImtiyazKhalani 我得到一个“image/*”异常 - 12-12 12:22:19.551 2559 2830 E AndroidRuntime 致命异常:IgExecutor #12 - 12-12 12:22:19.551 2559 2830 E AndroidRuntime 进程:com.instagram.android,PID:2559 - 12-12 12:22:19.551 2559 2830 E AndroidRuntime java.lang.RuntimeException: 无效图像。 【参考方案1】:

要立即检查的最明显的事情是:

    您的资产是否符合以下标准:

    图片资源(JPG、PNG)或视频资源(H.264、H.265、WebM)的 Uri。 最小尺寸 720x1280。推荐的图像比例为 9:16 或 9:18。 视频可以是 1080p,时长最长为 20 秒。乌里需要 是设备上本地文件的内容 Uri。

    intent.setDataAndType(backgroundAssetUri, "*/*"); - 文档说函数的第二个值可能为 null,但我不认为“*/*”是有效的 mime 类型:尝试使用 MEDIA_TYPE_VIDEO强>-Link to Docsintent.setDataAndType(backgroundAssetUri, MEDIA_TYPE_VIDEO);

在 API 级别 11 中添加的 MEDIA_TYPE_VIDEO

public static final int MEDIA_TYPE_VIDEO

MEDIA_TYPE 列的常量表示该文件是视频 文件。

常数值:3 (0x00000003)

    最后 - 您是否按照示例测试了启动活动:
活动活动 = getActivity(); activity.grantUriPermission("com.instagram.android", stickerAssetUri, Intent.FLAG_GRANT_READ_URI_PERMISSION); if (activity.getPackageManager().resolveActivity(intent, 0) != null) activity.startActivityForResult(intent, 0);

【讨论】:

没有贴纸的单独视频已经对我有用。我可能应该另外写。剩下的我明天试试,非常感谢。 intent.setDataAndType 需要一个字符串作为第二个参数。但 MEDIA_TYPE_VIDEO 是一个 int。【参考方案2】:

这是一个错误。

Facebook 写道: “他们现在也为 Android 添加了该功能,因此您现在应该可以发送带有贴纸的背景了。”

【讨论】:

【参考方案3】:

我尝试了与 Facebook 官方文档中相同的方法,然后在 Huawai P9 Lite (N)、Huawai P20 Lite (O) 和 Samsung S8 (O) 上进行了测试 - 它仅在 Samsung S8 上有效,原因尚不清楚。我放弃了尝试,因为很明显,它不适用于大多数手机。

最有趣的是,使用相同的方法在 feed 上分享效果很好:

Intent intent = new Intent("com.instagram.share.ADD_TO_FEED"); //feed
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setDataAndType(image, "image/jpeg");

Uri image = getImageUri();

Activity activity = getActivity();
if (activity.getPackageManager().resolveActivity(intent, 0) != null) 
    activity.startActivityForResult(intent, 0);

【讨论】:

以上是关于在 Android 上将视频和贴纸图片分享到 Instagram Story的主要内容,如果未能解决你的问题,请参考以下文章

Android分享图片和视频失败,怎么办?

在 iOS 8 上将视频分享到 Facebook

FBSDKMessengerSharer 分享贴纸在 iOS 中不起作用

快手短视频怎么开发

Android-给自定义相机增加贴纸

Android 高版本分享 分享图片 分享视频 分享当前apk