要求:
我的应用程序中有一个“共享”按钮。我需要通过Facebook分享。我需要选择是否已安装 native Facebook应用程序。如果未安装该应用程序,我们的决定是将用户发送到facebook.com进行共享。
当前状态:
我可以检测到何时未安装 native 应用程序(通过程序包名称),并向选择器添加其他 Intent 。
问题:
用户必须选择通过“Facebook的网站”共享的项目显示为“浏览器”,并带有Android浏览器图标。
LabeledIntent项目没有出现,并且我收到“找不到针对Intent的 Activity {act = android.intent.action.VIEW dat = ...}
代码(简体...):
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,该 Intent 只是将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似乎仅适用于已解析的Intent。因此,除非该 Intent 已经定义了特定的 Activity 和程序包,否则您将无法使用它。
这并不奇怪,因为可能有许多Activity可能会针对一个LabeledIntent解决,并且您的ChooserActivity将所有图标和名称显示为相同。
因此,在您的情况下,您将必须先解决精度,然后再使用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;
}