2012-04-30 28 views
5

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(); 
    } 
} 
+0

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? –

+1

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

+0

@ 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

Odpowiedz

7

Choć nieudokumentowana, wygląda LabeledIntents działać tylko na rozwiązanych zamiarów. Więc jeśli intencja nie ma już określonej aktywności i zdefiniowanego pakietu, nie będziesz mógł z niego skorzystać.

Nie jest to zaskakujące, ponieważ może istnieć wiele działań, które mogą zostać rozwiązane w przypadku jednego oznaczenia LabelledIntent, a funkcja wyboru będzie wyświetlać wszystkie ikony i nazwy jako takie same.

W takim przypadku musisz najpierw rozwiązać problem, a następnie użyć opcji OznaczoneIntentycznie. Może to jednak spowodować, że użytkownik nie będzie mógł wybrać przeglądarki według własnego wyboru. Skorzystaj z poniższej funkcji, aby uzyskać od Ciebie Oznaczone Odwzorowanie.

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); 

I 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; 
}