Jak możesz odfiltrować określone aplikacje, używając intencji ACTION_SEND? To pytanie zostało zadane na różne sposoby, ale nie byłem w stanie znaleźć rozwiązania na podstawie udzielonych odpowiedzi. Mam nadzieję, że ktoś może pomóc. Chciałbym zapewnić możliwość udostępniania w aplikacji. Zgodnie z radą dewelopera Androida, Alexandra Lucasa , wolałbym to robić, używając intencji, a nie interfejsów API Facebook / Twitter.
Udostępnianie przy użyciu zamiaru ACTION_SEND jest świetne, ale problem polega na tym, że (1) nie chcę tam wszystkich opcji udostępniania, wolę ograniczyć je do FB, Twittera i poczty e-mail oraz (2) nie chcę udostępniać to samo dotyczy każdej aplikacji do udostępniania . Na przykład w moim twitterowym udziale zamieściłem pewne wzmianki, a hashtagi ograniczyły go do 140 znaków lub mniej, podczas gdy udział na Facebooku będzie zawierać link i obraz funkcji.
Czy można ograniczyć opcje zamiaru ACTION_SEND (udostępnij)? Widziałem coś na temat korzystania z PackageManager i queryIntentActivities, ale nie byłem w stanie zrozumieć połączenia między PackageManager a intencją ACTION_SEND.
LUB
Zamiast filtrować aplikacje do udostępniania, mój problem można również rozwiązać, gdybym mógł użyć zamiaru ACTION_SEND, aby przejść bezpośrednio do Facebooka lub Twittera zamiast otwierać okno dialogowe. Gdyby tak było, mógłbym stworzyć własne okno dialogowe, a kiedy klikną „Facebook”, stworzą intencje specyficzne dla Facebooka i po prostu wyślą je na Facebooka. To samo dotyczy Twittera.
LUB czy to nie jest możliwe? Czy interfejsy API Facebooka i Twittera to jedyny sposób?
źródło
Odpowiedzi:
Według mojej wiedzy StackOverflow ma wiele osób zadających to pytanie na różne sposoby, ale nikt jeszcze nie odpowiedział na nie całkowicie.
Moja specyfikacja wezwała użytkownika do wybrania e-maila, Twittera, Facebooka lub SMS-a z niestandardowym tekstem dla każdego z nich. Oto jak to osiągnąłem:
W różnych miejscach znalazłem fragmenty tego, jak to zrobić, ale nie widziałem tego wszystkiego w innym miejscu.
Pamiętaj, że ta metoda ukrywa również wszystkie głupie opcje, których nie chcę, na przykład udostępnianie przez Wi-Fi i Bluetooth.
Mam nadzieję, że to komuś pomoże.
Edycja: W komentarzu poproszono mnie o wyjaśnienie, co robi ten kod. Zasadniczo tworzy
ACTION_SEND
zamiar TYLKO dla natywnego klienta poczty, a następnie przypisuje inne zamiary do selektora. Uczynienie pierwotnego zamiaru specyficznym dla e-maila pozbywa się wszystkich niepotrzebnych śmieci, takich jak Wi-Fi i bluetooth, a następnie biorę inne intencje, których chcę odACTION_SEND
zwykłego zwykłego tekstu, i włączam je, zanim pokażę selektorowi.Kiedy chwytam dodatkowe zamiary, ustawiam niestandardowy tekst dla każdego z nich.
Edycja2: Minęło trochę czasu, odkąd to opublikowałem, a sprawy się nieco zmieniły. Jeśli widzisz Gmaila dwukrotnie na liście opcji, spróbuj usunąć specjalną obsługę dla „android.gm”, jak sugeruje komentarz w @h_k poniżej.
Ponieważ ta jedna odpowiedź jest źródłem prawie wszystkich moich punktów reputacji przepełnienia stosu, muszę przynajmniej starać się ją aktualizować.
źródło
Jeśli chcesz niestandardową opcję, nie powinieneś polegać na domyślnym oknie dialogowym dostarczonym przez Androida dla tej akcji.
Zamiast tego musisz wdrożyć własne. Konieczne będzie zapytanie Menedżera pakietów, w którym pakiety obsługują wymaganą akcję, a następnie na podstawie odpowiedzi zastosujesz filtrowanie i dostosowany tekst.
Konkretnie, przyjrzeć się metodzie queryIntentActivities z PackageManager klasie. Budujesz intencję, która uruchomi domyślne okno dialogowe (intencja ACTION_SEND), przekazujesz ją do tej metody, a otrzymasz listę obiektów zawierających informacje o działaniach, które mogą obsłużyć ten zamiar. Korzystając z tego, możesz wybrać te, które chcesz.
Po zbudowaniu listy pakietów, które chcesz przedstawić, musisz zbudować własne okno dialogowe listy (najlepiej działanie z motywem okna dialogowego), które wyświetli tę listę.
Należy jednak zauważyć, że bardzo trudno jest ustawić niestandardowe okno dialogowe jako domyślne. Problem polega na tym, że motyw użyty w tym oknie dialogowym jest motywem wewnętrznym i nie może być używany przez aplikację. Możesz spróbować uczynić go tak podobnym do natywnego, jak chcesz, lub wybrać całkowicie niestandardowy wygląd (wiele aplikacji robi to podobnie jak aplikacja galerii itp.)
źródło
Wypróbuj ten, aby udostępnić tylko trzy aplikacje - Facebook, Twitter, KakaoStory.
źródło
Znalazłem rozwiązanie, które działa dla mnie, patrząc tutaj (patrz trzeci komentarz do pierwszej odpowiedzi). Ten kod wyszukuje prawidłowego klienta Twittera i używa go do opublikowania tweeta. Uwaga: Nie daje Ci zamiaru z różnymi klientami Twittera i pozwala ci wybierać.
Udostępnij za pomocą Twittera:
Wywołanie tej metody:
Facebook będzie podobny do „ com.facebook.katana ”, chociaż nadal nie można ustawić tekstu wiadomości (nieaktualne w lipcu 2011 r.).
Źródło kodu: Zamiar otwarcia klienta Twittera na Androida
źródło
Dzięki @dacoinminster. Wprowadzam pewne zmiany w jego odpowiedzi, w tym nazwy pakietów popularnych aplikacji i sortowanie tych aplikacji.
źródło
Możesz wypróbować poniższy kod, działa idealnie.
Tutaj udostępniamy niektóre określone aplikacje, takie jak Facebook, Messenger, Twitter, Google Plus i Gmail.
źródło
To rozwiązanie pokazuje listę aplikacji w oknie dialogowym ListView, które przypomina selektor:
Od Ciebie zależy:
Klasa adaptera:
i jego użycie:
źródło
Najczystszym sposobem jest skopiowanie następujących klas: ShareActionProvider, ActivityChooserView, ActivityChooserModel. Dodaj możliwość filtrowania zamiarów w ActivityChooserModel i odpowiednie metody wsparcia w ShareActionProvider. Stworzyłem niezbędne klasy, możesz je skopiować do swojego projektu ( https://gist.github.com/saulpower/10557956 ). Daje to nie tylko możliwość filtrowania aplikacji, którym chcesz się dzielić (jeśli znasz nazwę pakietu), ale także wyłączania historii.
źródło
Poprawiłem odpowiedź @dacoinminster i oto wynik z przykładem udostępniania aplikacji:
źródło
Miałem ten sam problem i to zaakceptowane rozwiązanie mi nie pomogło, jeśli ktoś ma ten sam problem, możesz użyć mojego fragmentu kodu:
źródło
źródło
Tak prosty i zwięzły. Dzięki deweloperowi Open Source, cketti za udostępnienie tego rozwiązania:
I to jest link do jego istoty.
źródło