gpt4 book ai didi

android - 将 Intent 包装在 LabeledIntent 中以供显示

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:16:53 25 4
gpt4 key购买 nike

要求:

我的应用程序中有一个“分享”按钮。我有通过 Facebook 分享的要求。我需要选择是否安装 native Facebook 应用程序。我们的决定是在未安装该应用程序的情况下将用户发送到 facebook.com 进行共享。

当前状态:

我可以检测到未安装 native 应用程序(通过包名称),并向选择器添加其他 Intent 。

问题:

用户必须选择通过“Facebook 的网站”共享的项目显示“浏览器”并具有 Android 浏览器图标。LabeledIntent 项目没有出现,我收到“未找到 Intent { act=android.intent.action.VIEW dat=...}

的 Activity

代码(简化...):

Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_SUBJECT, "check this out");
intent.putExtra(Intent.EXTRA_TEXT, urlToShare);
boolean facebookInstalled = false;

Intent chooser = Intent.createChooser(intent, "Share this link!");
if (!facebookInstalled)
{
Intent urlIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.facebook.com/sharer/sharer.php?u=" + Uri.encode(urlToShare)));
Intent niceUrlIntent = new LabeledIntent(urlIntent, context.getApplicationContext().getPackageName(), "Facebook's Website", R.drawable.icon);

// Ideally I would only add niceUrlIntent in the end, but that doesn't add anything to the chooser as-is
chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[urlIntent, niceUrlIntent]);
}
context.startActivity(chooser);

解决方案

@CommonsWare 指出的解决方案是使用 LabeledIntent 包装一个 Intent ,该 Intent 转到我创建的新 Activity,它只是将 ACTION_VIEW Intent 发送到适当的 Uri。

Intent myActivity = new Intent(context, ViewUriActivity.class);
myActivity.putExtra(ViewUriActivity.EXTRA_URI, "http://...");
Intent niceUrlIntent = new LabeledIntent(myActivity, context.getApplicationContext().getPackageName(), "Facebook's Website", R.drawable.icon);
chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[]{niceUrlIntent});

ViewUriActivity 看起来像这样:

public final class ViewUriActivity extends Activity
{
public static final String EXTRA_URI = ViewUriActivity.class.getSimpleName() + "EXTRA_URI";

protected void onCreate(final Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);

Intent urlIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(getIntent().getExtras().getString(EXTRA_URI)));
startActivity(urlIntent);
finish();
}
}

最佳答案

虽然没有记录,但看起来 LabeledIntents 仅适用于已解析的 Intents。因此,除非 Intent 已经定义了特定的 Activity 和包,否则您将无法使用它。

这并不奇怪,因为对于一个 LabeledIntent 可能会解决许多 Activity,并且您的 chooserActivity 将显示所有图标和名称相同。

因此,在您的情况下,您必须先解析 Activity ,然后再使用 LabeledIntent。但这可能会导致用户无法选择他选择的浏览器。使用以下函数从您的 Intent 中获取 LabeledIntent。

Intent urlIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.facebook.com/sharer/sharer.php?u=" + Uri.encode(urlToShare)));
Intent niceUrlIntent = getLabelintent(urlIntent, "Facebook's Website", R.drawable.icon);

和getLabelIntent

public LabeledIntent getLabelintent(Intent in, String name, int drawable) {
PackageManager pm = getPackageManager();
ComponentName launchname = in.resolveActivity(pm);
if (launchname != null) {
Intent resolved = new Intent();
resolved.setComponent(launchname);
resolved.setData(in.getData());
LabeledIntent niceUrlIntent = new LabeledIntent(resolved,
getPackageName(), name, drawable);

return niceUrlIntent;
}
return null;
}

关于android - 将 Intent 包装在 LabeledIntent 中以供显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10390646/

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