将自定义项目添加到 Android 共享表?

Posted

技术标签:

【中文标题】将自定义项目添加到 Android 共享表?【英文标题】:Add custom Item to Android share sheet? 【发布时间】:2020-11-13 04:14:59 【问题描述】:

我有一个应用程序,我想让用户将布局保存到手机中的图像。我可以编写代码来创建位图并将其保存为图像格式。让我陷入困境的是,我无法在共享表中创建一个自定义选项,上面写着“保存到手机”。

val pm: PackageManager = context.getPackageManager()
val sendIntent = Intent(Intent.ACTION_SEND)

val img = FileProvider.getUriForFile(context, context.getPackageName() + ".provider", File(fileName))

sendIntent.putExtra(Intent.EXTRA_STREAM, img)
sendIntent.type = "image/png"

val resInfo= pm.queryIntentActivities(sendIntent, 0)

val intentList: MutableList<LabeledIntent> = emptyList<LabeledIntent>().toMutableList()

for (res in resInfo)
    val intent = Intent()
    val packageName = res.activityInfo.packageName
    intent.component = ComponentName(packageName, res.activityInfo.name)
    intent.setPackage(packageName)
    intent.action = Intent.ACTION_SEND
    intentList.add(LabeledIntent(intent, packageName, res.loadLabel(pm), res.iconResource))


val xintent = Intent(context, GalleryFileSaver::class.java)
xintent.putExtra("savetogallery", imgUrl.toString())
val saveIntent = LabeledIntent(xintent, BuildConfig.APPLICATION_ID, "Save to phone", R.drawable.ic_download)

intentList.add(saveIntent)


val intentArray = intentList.toTypedArray()
sendIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentArray)
startActivity(Intent.createChooser(sendIntent, "Share Image"))

在我的清单上,

<activity android:name=".utils.GalleryFileSaver" android:screenOrientation="portrait"></activity>

GalleryFileSaver 是一个空白活动,它将图像渲染代码保存到oncreate。 我在intentArray 中添加了一个带标签的意图,但在共享表中只显示了默认意图,我做错了什么?

【问题讨论】:

【参考方案1】:

您似乎需要将您的应用注册到receive implicit intents。对correct mime types 执行此操作后,它们应该会自动显示在意图选择器中。

话虽如此,根据您的解释(如果我理解正确的话),您根本不需要使用共享表。您可以只添加一个按钮或菜单选项,例如“将当前布局保存到图像”,然后在您的应用中处理所有内容。

【讨论】:

【参考方案2】:

编辑

您正在添加所有可以将意图作为自定义目标处理的活动。这不是它的用途。 Intent.createChooser(...) 已经提供了正确的共享目标。无需再次全部添加。

另外,自定义目标列表需要添加到Intent.createChooser(...)创建的Intent(source)

这应该可行:

val sendIntent = Intent(Intent.ACTION_SEND)

val img = FileProvider.getUriForFile(context, context.getPackageName() + ".provider", File(fileName))

sendIntent.putExtra(Intent.EXTRA_STREAM, img)
sendIntent.type = "image/png"

val xintent = Intent(context, GalleryFileSaver::class.java)
xintent.putExtra("savetogallery", imgUrl.toString())
val saveIntent = LabeledIntent(xintent, BuildConfig.APPLICATION_ID, "Save to phone", R.drawable.ic_download)

startActivity(Intent.createChooser(sendIntent, "Share Image").apply
    putExtra(Intent.EXTRA_INITIAL_INTENTS, arrayOf(saveIntent))
)

【讨论】:

一样,没有变化 @Rivadiz 是的,我错过了一些东西,更新了我的答案

以上是关于将自定义项目添加到 Android 共享表?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在我的 Assets 文件夹中仅使用一个样式表将自定义 CSS 添加到 Xamarin 中的 WebView?

android以编程方式将自定义按钮添加到布局

使用冰山表格式将自定义元数据添加到 DataFrame 模式

UIAlertController - 将自定义视图添加到操作表

php 将自定义列添加到管理表

将自定义组件小部件动态添加到 Android 中的布局中