Как вы можете отфильтровать определенные приложения при использовании намерения ACTION_SEND? Этот вопрос задавался по-разному, но я не смог найти решение на основе полученных ответов. Надеюсь, кто-то может помочь. Я хотел бы предоставить возможность поделиться в приложении. Следуя совету Android Dev Александра Лукаса , я бы предпочел сделать это с помощью намерений, а не с помощью API Facebook / Twitter.
Совместное использование с помощью намерения ACTION_SEND - это замечательно, но проблема в том, что (1) я не хочу, чтобы там были доступны все параметры общего доступа , я бы предпочел ограничить его FB, Twitter и электронной почтой, и (2) я не хочу делиться то же самое для каждого приложения обмена . Например, в свою долю в твиттере я собираюсь включить некоторые упоминания, и хештеги ограничивают его до 140 символов или менее, в то время как доля в фейсбуке будет включать ссылку и изображение функции.
Можно ли ограничить параметры для намерения ACTION_SEND (поделиться)? Я видел кое-что об использовании PackageManager и queryIntentActivities, но не смог выяснить связь между PackageManager и намерением ACTION_SEND.
ИЛИ
Вместо того, чтобы фильтровать приложения для обмена, моя проблема также может быть решена, если бы я мог использовать намерение ACTION_SEND, чтобы перейти непосредственно в Facebook или Twitter, а не всплывать в диалоговом окне. Если бы это было так, то я мог бы создать свой собственный диалог, и когда они нажимают «Facebook», создают особые намерения Facebook и просто отправляют их на Facebook. То же самое с Twitter.
ИЛИ это не возможно? Являются ли API Facebook и Twitter единственным способом?
источник
Ответы:
Насколько мне известно, в StackOverflow есть много людей, которые задают этот вопрос по-разному, но никто еще не ответил на него полностью.
Моя спецификация требовала, чтобы пользователь мог выбирать электронную почту, твиттер, фейсбук или смс с индивидуальным текстом для каждого. Вот как я это сделал:
Я нашел кое-что о том, как сделать это в разных местах, но я не видел всего этого в одном месте где-либо еще.
Обратите внимание, что этот метод также скрывает все глупые варианты, которые я не хочу, например, обмен через Wi-Fi и Bluetooth.
Надеюсь, это кому-нибудь поможет.
Изменить: в комментарии меня попросили объяснить, что делает этот код. По сути, он создает
ACTION_SEND
намерение ТОЛЬКО для нативного почтового клиента, а затем связывает другие намерения с выбором. Создание оригинального намерения, специфичного для электронной почты, избавляет от всего лишнего мусора, такого как Wi-Fi и Bluetooth, затем я беру другие намерения, которые я хочу, от общегоACTION_SEND
типа обычного текста, и прикрепляю их перед показом выбора.Когда я беру дополнительные намерения, я устанавливаю собственный текст для каждого.
Edit2: прошло много времени с тех пор, как я опубликовал это, и все немного изменилось. Если вы видите gmail дважды в списке параметров, попробуйте удалить специальную обработку для «android.gm», как это предлагается в комментарии @h_k ниже.
Поскольку этот один ответ является источником почти всех очков репутации стека переполнения, я должен, по крайней мере, постараться поддерживать его в актуальном состоянии.
источник
Если вам нужна настраиваемая опция, вам не следует полагаться на диалоговое окно по умолчанию, предоставляемое android для этого действия.
Вместо этого вам нужно развернуть свое собственное. Вам нужно будет запросить PackageManager в каких пакетах обрабатывается действие, а затем на основе ответа вы примените фильтрацию и настроенный текст.
В частности, обратите внимание на метод queryIntentActivities в PackageManager класса. Вы строите намерение, которое запускает диалоговое окно по умолчанию (намерение ACTION_SEND), передаете его этому методу, и вы получите список объектов, которые содержат информацию о действиях, которые могут обработать это намерение. Используя это, вы можете выбрать те, которые вы хотите.
После того, как вы создадите свой список пакетов, которые вы хотите представить, вам нужно создать свой собственный диалог со списком (желательно с темой диалога), который будет отображать этот список.
Однако следует отметить, что сделать этот пользовательский диалог очень похожим на диалог по умолчанию. Проблема в том, что тема, используемая в этом диалоговом окне, является внутренней темой и не может использоваться вашим приложением. Вы можете либо попытаться сделать его максимально похожим на нативный, либо перейти на совершенно другой внешний вид (многие приложения делают это, например, приложение галереи и т. Д.)
источник
Попробуйте этот, чтобы поделиться только тремя приложениями - Facebook, Twitter, KakaoStory.
источник
Нашел решение, которое работает для меня, посмотрев здесь (см. Третий комментарий к первому ответу). Этот код ищет действующий клиент Twitter и использует его для публикации твита. Примечание: он не дает вам намерения с различными клиентами Twitter и позволяет вам выбирать.
Поделиться через твиттер:
Вызов этого метода:
Facebook будет похож на « com.facebook.katana », хотя вы все еще не можете установить текст сообщения (устарело в июле 2011 г.).
Источник кода: Намерение открыть клиент Twitter на Android
источник
Благодаря @dacoinminster. Я делаю некоторые изменения в его ответе, включая имена пакетов популярных приложений и сортировку этих приложений.
источник
Вы можете попробовать код ниже, он работает отлично.
Здесь мы делимся некоторыми конкретными приложениями, такими как Facebook, Messenger, Twitter, Google Plus и Gmail.
источник
Это решение показывает список приложений в диалоге ListView, который похож на селектор:
Вам решать:
Класс адаптера:
и его использование:
источник
Самый простой способ - скопировать следующие классы: ShareActionProvider, ActivityChooserView, ActivityChooserModel. Добавьте возможность фильтрации намерений в ActivityChooserModel и соответствующие методы поддержки в ShareActionProvider. Я создал необходимые классы, вы можете скопировать их в свой проект ( https://gist.github.com/saulpower/10557956 ). Это не только добавляет возможность фильтровать приложения, которыми вы хотели бы поделиться (если вы знаете имя пакета), но и отключать историю.
источник
Я улучшил ответ @dacoinminster, и вот результат с примером, чтобы поделиться вашим приложением:
источник
У меня была та же проблема, и это принятое решение не помогло мне, если у кого-то есть такая же проблема, вы можете использовать мой фрагмент кода:
источник
источник
Так просто и лаконично. Спасибо разработчику открытого исходного кода, cketti за то, что поделились этим решением:
И это ссылка на его / ее суть.
источник