结束语意向在LabeledIntent用于显示目的(Wrapping Intent in Label

2019-09-16 21:40发布

要求:

我在我的应用程序一个“分享”按钮。 我通过Facebook分享的要求。 我需要有是否被安装了原生的Facebook应用程序的选项。 我们的决定是将用户发送到facebook.com分享,如果没有安装的应用程序。

当前状态:

当本机应用程序未安装(通过包名),我能察觉,并添加其他意图的选择器。

问题:

该项目的用户选择通过“Facebook的网站”说,“浏览器”,分享和拥有Android浏览器图标。 该LabeledIntent项目不会出现,我得到一个“找到的意图没有任何活动{行为= 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来包装进入到一个新的活动创建,简单地发送ACTION_VIEW意图合适的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();
    }
}

Answer 1:

虽然无证,貌似LabeledIntents只解决意图工作。 所以,除非意图已经有一个特定的活动,并定义包你将无法使用它。

这并不奇怪,因为可能有很多的活动,可能会得到解决的一个LabeledIntent和你chooserActivity将显示所有图标和名称相同。

所以你的情况,你必须先解决acctivity然后用LabeledIntent。 但是,这可能会导致用户无法选择他所选择的浏览器。 使用下面的功能,从你的意图得到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;
}


文章来源: Wrapping Intent in LabeledIntent for display purposes