Приложение Android Intent для Twitter
Можно ли отобразить список приложений (с intent.createChooser
), которые отображают только мои приложения на моем телефоне (так что htc peep (htc hero) или twitdroid). Я пробовал его с помощью intent.settype("application/twitter")
, но он не находит никаких приложений для твиттера и показывает только мои почтовые приложения.
Спасибо,
Wouter
Ответы
Ответ 1
Вполне возможно, что ваши пользователи будут только когда-либо, теперь и навсегда, только хотят публиковать в Twitter.
Я бы подумал, что более вероятно, что ваши пользователи хотят отправлять информацию людям, а Twitter - это одна из возможностей. Но они также могут отправить текстовое сообщение или электронное письмо и т.д.
В этом случае используйте ACTION_SEND
, как описано здесь. Twidroid, в частности, поддерживает ACTION_SEND
, поэтому он будет отображаться в списке доступных механизмов доставки.
Ответ 2
Я публикую это, потому что я еще не видел решения, которое делает именно то, что я хочу.
В первую очередь запускает официальное приложение Twitter, или если оно не установлено, либо открывается диалоговое окно "Полное действие с использованием..." (like это) или непосредственно запускает веб-браузер.
Список различных параметров в URL-адресе twitter.com см. в файлах с кнопками Tweet.
Не забывайте URL-кодировать значения параметров. (Этот код предназначен специально для tweeting URL, если вы этого не хотите, просто оставьте параметр url
.)
// Create intent using ACTION_VIEW and a normal Twitter url:
String tweetUrl = String.format("https://twitter.com/intent/tweet?text=%s&url=%s",
urlEncode("Tweet text"),
urlEncode("https://www.google.fi/"));
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(tweetUrl));
// Narrow down to official Twitter app, if available:
List<ResolveInfo> matches = getPackageManager().queryIntentActivities(intent, 0);
for (ResolveInfo info : matches) {
if (info.activityInfo.packageName.toLowerCase().startsWith("com.twitter")) {
intent.setPackage(info.activityInfo.packageName);
}
}
startActivity(intent);
(URL-кодирование является более чистым, если у вас такая небольшая утилита, например, "StringUtils".)
public static String urlEncode(String s) {
try {
return URLEncoder.encode(s, "UTF-8");
}
catch (UnsupportedEncodingException e) {
Log.wtf(TAG, "UTF-8 should always be supported", e);
throw new RuntimeException("URLEncoder.encode() failed for " + s);
}
}
Например, на моем устройстве Nexus 7 этот напрямую открывает официальное приложение Twitter:
![enter image description here]()
Если официальное приложение Twitter не установлено, и пользователь либо выбирает Chrome, либо автоматически открывается (как единственное приложение, которое может обрабатывать намерение):
![enter image description here]()
Ответ 3
Решения, опубликованные ранее, позволяют публиковать сообщения непосредственно в вашем первом приложении Twitter. Чтобы показать список приложений twitters (если их больше одного), вы можете настроить свой Intent.createChooser для отображения только желаемых Itents.
Трюк добавляет EXTRA_INITIAL_INTENTS в список по умолчанию, сгенерированный из createChoose, и удаляет другие намерения из списка.
Посмотрите на этот образец, где я создаю выбор, который показывает только мои приложения для электронной почты. В моем случае появляются три письма: Gmail, YahooMail и Mail по умолчанию.
private void share(String nameApp, String imagePath) {
List<Intent> targetedShareIntents = new ArrayList<Intent>();
Intent share = new Intent(android.content.Intent.ACTION_SEND);
share.setType("image/jpeg");
List<ResolveInfo> resInfo = getPackageManager().queryIntentActivities(share, 0);
if (!resInfo.isEmpty()){
for (ResolveInfo info : resInfo) {
Intent targetedShare = new Intent(android.content.Intent.ACTION_SEND);
targetedShare.setType("image/jpeg"); // put here your mime type
if (info.activityInfo.packageName.toLowerCase().contains(nameApp) ||
info.activityInfo.name.toLowerCase().contains(nameApp)) {
targetedShare.putExtra(Intent.EXTRA_TEXT, "My body of post/email");
targetedShare.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File(imagePath)) );
targetedShare.setPackage(info.activityInfo.packageName);
targetedShareIntents.add(targetedShare);
}
}
Intent chooserIntent = Intent.createChooser(targetedShareIntents.remove(0), "Select app to share");
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetedShareIntents.toArray(new Parcelable[]{}));
startActivity(chooserIntent);
}
}
Вы можете запускать так: share ( "twi", "/sdcard/dcim/Camera/photo.jpg" );
Это было основано на сообщении: Пользовательская фильтрация выбора намерений на основе установленного имени пакета Android
Ответ 4
Этот вопрос немного старше, но поскольку я только что столкнулся с подобной проблемой, он также может по-прежнему представлять интерес для других. Во-первых, как упоминал Питер, создайте свое намерение:
Intent tweetIntent = new Intent(Intent.ACTION_SEND);
tweetIntent.putExtra(Intent.EXTRA_TEXT, "Test; please ignore");
tweetIntent.setType("application/twitter");
"application/twitter" на самом деле является известным типом контента, см. здесь. Теперь, когда вы пытаетесь начать работу с этим намерением, она будет показывать всевозможные приложения, которые на самом деле не являются клиентами Twitter, но хотят часть действия. Как уже упоминалось в парах "почему вы даже хотите это сделать?" некоторые ответы, некоторые пользователи могут найти это полезным. С другой стороны, если у меня есть кнопка в моем приложении, в которой говорится "Tweet this!", Пользователь очень рассчитывает, что это приведет к появлению клиента Twitter.
Это означает, что вместо простого запуска действия нам нужно отфильтровать те, которые подходят:
PackageManager pm = getPackageManager();
List<ResolveInfo> lract
= pm.queryIntentActivities(tweetIntent,
PackageManager.MATCH_DEFAULT_ONLY);
boolean resolved = false;
for(ResolveInfo ri: lract)
{
if(ri.activityInfo.name.endsWith(".SendTweet"))
{
tweetIntent.setClassName(ri.activityInfo.packageName,
ri.activityInfo.name);
resolved = true;
break;
}
}
Вам нужно немного поэкспериментировать с разными провайдерами, но если имя заканчивается на ".SendTweet", вы довольно безопасны (это название активности в Twidroyd). Вы также можете проверить свой отладчик на имена пакетов, которые вы хотите использовать, и соответственно отрегулировать сравнение строк (т.е. Twidroyd использует "com.twidroid. *" ).
В этом простом примере мы просто выбираем первое совпадающее действие, которое мы находим. Это вызывает клиента Twitter напрямую, без необходимости делать какие-либо выборы. Если нет надлежащих клиентов Twitter, мы возвращаемся к стандартным выборам действий:
startActivity(resolved ? tweetIntent :
Intent.createChooser(tweetIntent, "Choose one"));
Вы можете расширить код и принять во внимание тот случай, если есть более одного клиента Twitter, когда вы можете создать свой собственный диалог выбора из всех найденных вами имен деятельности.
Ответ 5
Эти ответы слишком сложны.
Если вы просто делаете обычное URL-намерение для Twitter.com, вы увидите этот экран:
![enter image description here]()
что дает вам возможность перейти на сайт, если у вас не установлены приложения Twitter.
String url = "https://twitter.com/intent/tweet?source=webclient&text=TWEET+THIS!";
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(url));
startActivity(i);
Ответ 6
Либо
- Вы начинаете действие с намерения с действием
Intent.ACTION_SEND
и text/plain
MIME. У вас будут все приложения, поддерживающие отправку текста. Это должен быть любой клиент Twitter, а также Gmail, dropbox и т.д.
- Или вы пытаетесь искать конкретное действие каждого клиента, о котором вы знаете, например "com.twitter.android.PostActivity" для официального клиента. Это укажет на этого клиента, и вряд ли это будет полный список.
- Или вы начинаете со второго пункта и возвращаетесь к первому...
Ответ 7
Неа. Тип намерения - это что-то вроде image/png
или application/pdf
, то есть типа файла, а с помощью createChooser вы в основном спрашиваете, какие приложения могут открывать этот тип файла.
Теперь нет такой вещи, как файл application/twitter
, который можно открыть, так что это не сработает. Я не знаю другого способа добиться того, чего вы хотите.
Ответ 8
От http://twidroid.com/plugins/
Твидроиды Цель ACTION_SEND
Intent sendIntent = new Intent(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, "This is a sample message via Public Intent");
sendIntent.setType("application/twitter");
startActivity(Intent.createChooser(sendIntent, null));
Ответ 9
Я использовал ответ "billynomates" и смог использовать хэштеги с помощью функции URLEncoder.encode(, "UTF-8" ). Хэш-теги появились просто отлично.
String originalMessage = "some message #MESSAGE";
String originalMessageEscaped = null;
try {
originalMessageEscaped = String.format(
"https://twitter.com/intent/tweet?source=webclient&text=%s",
URLEncoder.encode(originalMessage, "UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
if(originalMessageEscaped != null) {
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(originalMessageEscaped));
startActivity(i);
}
else {
// Some Error
}