wymogów:owijania Intent w LabeledIntent dla celów wyświetlania
mam przycisk „Share” w mojej aplikacji. Mam obowiązek udostępniania za pośrednictwem Facebooka. Potrzebuję opcji, czy zainstalowana jest natywna aplikacja Facebooka. Naszą decyzją jest wysłanie użytkownika na facebook.com do udostępnienia, jeśli aplikacja nie jest zainstalowana.
Aktualny stan:
mogę wykryć kiedy natywna aplikacja nie jest zainstalowana (poprzez nazwy pakietu) i dodać dodatkowe intencje do selektora.
Problem:
Element użytkownik musi wybrać, aby podzielić się poprzez Facebooka „WWW”, mówi, „Browser” i ma ikonę Przeglądarka Android. Element LabeledIntent nie pojawia się i dostaję „Nie znaleziono intencyjny aktywność {act = android.intent.action.VIEW dat = ...}
kod (uproszczone ...):
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);
rozwiązanie
rozwiązanie jak @CommonsWare wskazał, jest użycie LabeledIntent aby otoczyć intencję, że idzie do nowej działalności tworzę, które po prostu wysyła intencję ACTION_VIEW do odpowiedniego 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 wygląda następująco:
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();
}
}
Czemu dodanie dwóch początkowych 'Intent's do funkcji wyboru? Wygląda na to, że dodajesz zarówno etykietę, jak i nieopisaną "Intencję". Co się stanie, jeśli usuniesz 'urlIntent' z tablicy' Intent's? –
Push przychodzą, pchają, tworzą własną aktywność, którą wstrzykujesz do selektora, który jest ustawiony za pomocą 'Theme.NoDisplay' oraz, w' onCreate() ', wywołuje' startActivity() ', aby wywołać przeglądarkę na Facebooku, a następnie wywołuje 'finish()'. Zasadniczo używasz swojej własnej aktywności jako pomostu. Najlepiej byłoby, gdybyś tego nie potrzebował, ale nie próbowałem tego, co próbujesz zrobić, więc nie wiem, co może pójść źle (oprócz komentarza Jona O powyżej). – CommonsWare
@ JonO, włożyłem tam oba, więc mogłeś zobaczyć moje dwie próby.Usunięcie "urlIntent" z extra_initial_intents pozostawia mnie bez dodatkowych intencji na liście i otrzymuję ostrzeżenie, o którym wspomniałem. Usunięcie "niceUrlIntent" z extra_initial_intents pozostawia mi jedną dodatkową intencję "Browser", co jest niestety niedopuszczalne i brak ostrzeżeń w LogCat. – xbakesx