在Android上分享视频和贴纸图像到Instagram故事

10

如何在Instagram故事中同时分享一个视频作为背景和一张图片作为贴图?

如果这两个内容都是图片,则本说明书只有一个解决方案。

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

我想发送一个背景视频和一个贴图图片。 在Instagram故事中是否可能实现?

我尝试过,但很遗憾没有成功:

   // 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

}

请展示您的视频文件名。 - Rutvik Bhatt
你尝试过使用 image/* 作为类型吗? - Imtiyaz Khalani
@RutvikBhatt 单独的视频已经对我起作用了,所以不应该是视频路径的问题。 - Oli
@ImtiyazKhalani 我使用“image/*”时出现异常
  • 12-12 12:22:19.551 2559 2830 E AndroidRuntime FATAL EXCEPTION: IgExecutor #12
  • 12-12 12:22:19.551 2559 2830 E AndroidRuntime Process: com.instagram.android, PID: 2559
  • 12-12 12:22:19.551 2559 2830 E AndroidRuntime java.lang.RuntimeException: 图像无效。
- Oli
3个回答

2
这是一个错误。Facebook写道:“他们现在已经在Android上添加了这个功能,所以你现在应该能够发送带有贴纸的背景了。”

1

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

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

    指向图像资产(JPG、PNG)或视频资产(H.264、H.265、WebM)的Uri。 最小尺寸为720x1280。建议使用9:16或9:18的图像比例。 视频可以是1080p,持续时间长达20秒。Uri需要 是设备上本地文件的内容Uri。

  2. intent.setDataAndType(backgroundAssetUri, "*/*"); - 文档中说函数的第二个值可以为空,但我认为“*/*”不是有效的MIME类型:请尝试使用MEDIA_TYPE_VIDEO - 链接到文档 intent.setDataAndType(backgroundAssetUri, MEDIA_TYPE_VIDEO);

API 11中添加了MEDIA_TYPE_VIDEO

public static final int MEDIA_TYPE_VIDEO

用于指示文件为视频文件的MEDIA_TYPE列的常量。

常量值:3(0x00000003)

  1. 最后 - 您是否测试过像示例中那样启动活动:
    Activity activity = getActivity();
    activity.grantUriPermission("com.instagram.android", stickerAssetUri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
    if (activity.getPackageManager().resolveActivity(intent, 0) != null) {
        activity.startActivityForResult(intent, 0);
    }

只有视频而没有贴纸已经对我起作用了。我可能应该再写一些。明天我会尝试剩下的,非常感谢。 - Oli
3
intent.setDataAndType的第二个参数需要传入一个字符串。但是MEDIA_TYPE_VIDEO是一个整数。 - Oli

1

我尝试了与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);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接