Обертывание Intent в LabeledIntent для целей отображения

Требования:

В моем приложении есть кнопка «Поделиться». У меня есть требование поделиться через Facebook. Мне нужна опция, установлено ли собственное приложение Facebook. Наше решение — отправить пользователя на facebook.com, чтобы поделиться, если приложение не установлено.

Текущее состояние:

Я могу определить, когда собственное приложение не установлено (по имени пакета ), и добавить дополнительные намерения в средство выбора.

Проблема:

Элемент, который пользователь должен выбрать для публикации через «Веб-сайт Facebook», говорит «Браузер» и имеет значок браузера Android. Элемент LabeledIntent не отображается, и я получаю сообщение «Для намерения не найдено никаких действий {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 для переноса намерения, которое переходит к новой создаваемой мной Activity, которая просто отправляет намерение 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();
    }
}
5
задан xbakesx 1 May 2012 в 01:14
поделиться