gpt4 book ai didi

android - 对于 Intent 选择器,是否可以设置显示哪些共享项目以及显示顺序?

转载 作者:行者123 更新时间:2023-12-02 17:06:02 25 4
gpt4 key购买 nike

背景

在 Android Q 之前,始终可以设置在共享对话框上显示哪些项目以及显示顺序。我什至写过here .

例如,如果您想优先考虑某些应用程序而不是其他应用程序,您可以使用:

fun getChooserIntent(context: Context, intent: Intent, chooserTitle: String?, vararg preferredOrderOfApps: String): Intent? {
val resolveInfos = context.packageManager.queryIntentActivities(intent, 0)
if (resolveInfos.isNullOrEmpty())
return null
val packageNameToOrderMap = HashMap<String, Int>()
for ((index, packageName) in preferredOrderOfApps.withIndex())
packageNameToOrderMap[packageName] = preferredOrderOfApps.size - index
val targetIntents = ArrayList<Intent>()
for (resolveInfo in resolveInfos) {
val activityInfo = resolveInfo.activityInfo
val targetIntent = intent.clone() as Intent
targetIntent.setPackage(activityInfo.packageName)
targetIntent.component = ComponentName(activityInfo.packageName, activityInfo.name)
targetIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
val labeledIntent = LabeledIntent(targetIntent, activityInfo.packageName, resolveInfo.labelRes, resolveInfo.icon)
targetIntents.add(labeledIntent)
}
targetIntents.sortWith(Comparator<Intent> { lhs, rhs ->
val lhsPackageName = lhs.`package`!!
val lhsPriority = packageNameToOrderMap[lhsPackageName] ?: -1
val rhsPackageName = rhs.`package`!!
val rhsPriority = packageNameToOrderMap[rhsPackageName] ?: -1
return@Comparator when {
lhsPriority > rhsPriority -> -1
lhsPriority < rhsPriority -> 1
else -> 0
}
})
val chooserIntent = Intent.createChooser(
when {
Build.VERSION.SDK_INT >= Build.VERSION_CODES.M -> Intent()
else -> targetIntents.removeAt(0)
}, chooserTitle)
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetIntents.toTypedArray<Parcelable>())
return chooserIntent
}

用法:

        val intent = getShareFileIntent(this@MainActivity, file.absolutePath)
val chooserIntent = getChooserIntent(this@MainActivity, intent, "look at the results...", "com.ghisler.android.TotalCommander", "com.google.android.gm")
startActivity(chooserIntent)

这应该将“Total Commander”和“Gmail”作为最上面的项目。示例项目可参见here .

如果您添加“com.whatsapp”,您可以将 WhatsApp 作为第三个。

问题

看来 EXTRA_INITIAL_INTENTS 对 Q 的限制非常严格,让我只能放置最多 2 个项目。这意味着您将只能看到我提到的 2 个应用程序,而不是像以前版本那样看到所有项目。

我尝试过的

我查看了文档(例如 here),并且检查了一些候选者:

  • EXTRA_EXCLUDE_COMPONENTS - 用于排除某些东西。没有尝试,但这不是我需要的。我想指定显示内容以及显示顺序。
  • EXTRA_INTENT - 由于某种原因,当我尝试使用它时,它只是直接打开它,而不显示共享对话框。
  • EXTRA_ALTERNATE_INTENTS - 似乎没有做任何事情
  • EXTRA_CHOOSER_TARGETS - 似乎与直接共享项目有关,但即使如此它也受到限制。

查看文档以及 Android 的源代码 ( here ),我可以看到,通过编写它是有限的,它非常有限:我最多只能放置 2 项:

private static final int MAX_EXTRA_INITIAL_INTENTS = 2;
private static final int MAX_EXTRA_CHOOSER_TARGETS = 2;

我可能是错的,但我认为 EXTRA_ALTERNATE_INTENTS 并不限于此。只是我没能使用它。

当我发现这些问题时,我尝试在问题跟踪器上报告它,但没有得到任何回复。

问题

  1. 在 native 共享 UI 上,有没有办法设置要显示的项目,每个项目都有自己的 Intent,以及按什么顺序显示?

  2. 如何使用 EXTRA_ALTERNATE_INTENTS ?它应该与 EXTRA_INTENT 一起使用吗?为什么当我尝试使用 EXTRA_INTENT 时,它就打开了?这些额外的东西有什么用呢?这不就是我真正想问的吗?

  3. 看到有EXTRA_CHOOSER_TARGETS,是否意味着我可以自己获取直接分享的元素?也许可以创建一个完全自定义的共享 UI,看起来与原始界面非常相似,甚至可以直接共享项目?

最佳答案

让我看看是否可以回答您的一些问题。

On the native share UI, Is there any way to set which items to show, each with its own Intent, and in which order?

您可以使用现在正在使用的内容,但是,正如您发现的那样,只能提供 2 个 Intent 来专门提升到顶部。也就是说,让系统按 alpha 顺序填充列表其余部分的更改很小:

    val chooserIntent = Intent.createChooser(
when {
Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q -> intent
Build.VERSION.SDK_INT >= Build.VERSION_CODES.M -> Intent()
else -> targetIntents.removeAt(0)
}, chooserTitle
)

这实际上看起来就像您根据 bug report 所做的那样.

遗憾的是,使用 Intent.ACTION_SENDIntent.ACTION_SEND_MULTIPLE 时无法更改“共享”标题。

Seeing that there is EXTRA_CHOOSER_TARGETS, does it mean I can get the direct-share items myself?

没有。提供它是为了让您的应用程序可以显示适合所采取操作的自己的直接共享目标。 (source)

关于android - 对于 Intent 选择器,是否可以设置显示哪些共享项目以及显示顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57846229/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com