我在使用 IG 分享到故事 API 时遇到了一些麻烦。我发现了两种奇怪的行为,它们阻止我使用 Intents。
预期行为
我的应用程序中有一个共享按钮,当用户点击它时,应用程序会显示所有可用已安装应用程序的共享选择器,如果用户点击 IG Stories 一个,应用程序应重定向到 instagram 并创建一个带有stickerAssetUri
图片。例如,如果用户点击 WhatsApp,应用程序应该使用主要意图,而不是主要意图,createInstagramStickerIntent(...)
并共享uri
图像。这就是我使用EXTRA_INITIAL_INTENTS的原因
1.无法添加额外的意图
我想在我的意图选择器中添加一个 IG 故事选项的额外意图,以便向 IG 应用程序发送自定义贴纸。但是,当我添加它
.putExtra(Intent.EXTRA_INITIAL_INTENTS, createInstagramStickerIntent(uri, activity))
并单击选择器中的 IG Stories 图标时,我会在 IG 中看到一个黑屏和下一条消息“出了点问题。请稍后再试”。
如果我直接使用我的createInstagramStickerIntent(...)
意图作为主要意图,而不是使用 putExtra 添加它,它可以工作。使用EXTRA_INITIAL_INTENTS标志似乎有问题。
代码
private fun startShareImage(uri: Uri, activity: Activity, title: String? = null, shareText: String? = null) {
val intent = Intent.createChooser(
ShareCompat.IntentBuilder.from(activity)
.intent
.setAction(Intent.ACTION_SEND)
.setType(SHARE_VIDEO_TYPE)
.putExtra(Intent.EXTRA_STREAM, uri)
.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
.apply {
...
},
null
).putExtra(Intent.EXTRA_INITIAL_INTENTS, createInstagramStickerIntent(uri, activity))
activity.startActivity(intent)
}
private fun createInstagramStickerIntent(stickerAssetUri: Uri, activity: Activity) = Intent("com.instagram.share.ADD_TO_STORY").apply {
val sourceApplication = activity.packageName
putExtra("source_application", sourceApplication)
type = SHARE_IMAGE_TYPE
putExtra("interactive_asset_uri", stickerAssetUri)
putExtra("top_background_color", "#33FF33")
putExtra("bottom_background_color", "#FF00FF")
activity.grantUriPermission(
"com.instagram.android", stickerAssetUri, Intent.FLAG_GRANT_READ_URI_PERMISSION
)
}
2. 无法创建带有视频背景的贴纸
如果尝试创建带有图像资产背景的贴纸,它看起来不错,但是如果我使用视频而不是图像作为背景,应用程序总是显示黑色背景。你可以看到我的createInstagramStickerBackgroundIntent(...)
方法逻辑
代码
private fun createInstagramStickerBackgroundIntent(stickerAssetUri: Uri, activity: Activity) = Intent("com.instagram.share.ADD_TO_STORY").apply {
val videoUri = Uri.parse(String.format(VIDEO_URI, activity.packageName))
putExtra("source_application", activity.packageName);
flags = Intent.FLAG_GRANT_READ_URI_PERMISSION;
setDataAndType(videoUri, "video/mp4");
putExtra("interactive_asset_uri", stickerAssetUri);
activity.grantUriPermission(
"com.instagram.android", stickerAssetUri, Intent.FLAG_GRANT_READ_URI_PERMISSION
)
}
非常感谢 :)