5

要求事項:

アプリに「共有」ボタンがあります。Facebookで共有する必要があります。ネイティブの Facebook アプリがインストールされているかどうかを選択する必要があります。アプリがインストールされていない場合は、ユーザーを facebook.com に送信して共有することを決定しました。

現在の状態:

ネイティブ アプリがインストールされていないことを (パッケージ名を介して) 検出し、チューザーにインテントを追加できます。

問題:

ユーザーが「Facebook の Web サイト」を介して共有するために選択する必要がある項目には、「ブラウザー」と表示され、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 を使用して、作成した新しいアクティビティに移動するインテントをラップし、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();
    }
}
4

1 に答える 1

9

文書化されていませんが、LabeledIntents は解決済みのインテントでのみ機能するようです。そのため、インテントに特定のアクティビティとパッケージが定義されていない限り、それを使用することはできません。

1 つの LabeledIntent に対して解決される可能性のある多くのアクティビティが存在する可能性があり、chooserActivity にはすべてのアイコンと名前が同じように表示されるため、これは驚くべきことではありません。

したがって、あなたの場合、最初にアクティビティを解決してから、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;
}
于 2012-09-08T05:28:27.097 に答える