Приложение Android Intent for Twitter
Можно ли показать список приложений (с intent.createChooser
), которые показывают только мои твиттер-приложения на моем телефоне (так что htc peep (htc hero) или twitdroid). Я попробовал это с intent.settype("application/twitter")
но он не находит никаких приложений для твиттера и показывает только мои почтовые приложения.
Спасибо,
Wouter
9 ответов
Вполне возможно, что ваши пользователи захотят только когда-либо, сейчас и навсегда, только публиковать сообщения в Twitter.
Я думаю, что более вероятно, что ваши пользователи хотят отправлять информацию людям, и Twitter - одна из возможностей. Но они также могут захотеть отправить текстовое сообщение или электронное письмо и т. Д.
В этом случае используйте ACTION_SEND
, как описано здесь. Twidroid, в частности, поддерживает ACTION_SEND
, поэтому он появится в списке доступных механизмов доставки.
Я публикую это, потому что я еще не видел решения, которое бы делало именно то, что я хочу.
Это в первую очередь запускает официальное приложение Twitter, или, если оно не установлено, либо вызывает диалоговое окно "Завершить действие с помощью..." ( например), либо напрямую запускает веб-браузер.
Список различных параметров URL-адреса twitter.com см. В документации по кнопкам Tweet. Не забудьте URL кодировать значения параметров. (Этот код специально предназначен для твитинга 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:
Если официальное приложение Twitter не установлено, и пользователь выбирает Chrome или он открывается автоматически (как единственное приложение, которое может обрабатывать намерения):
Решения, опубликованные ранее, позволяют размещать сообщения прямо в вашем первом приложении для Twitter. Чтобы отобразить список приложений твиттеров (если их больше одного), вы можете настроить Intent.createChooser так, чтобы отображались только нужные вам материалы.
Хитрость заключается в том, чтобы добавить EXTRA_INITIAL_INTENTS в список по умолчанию, созданный из createChoose, и удалить другие Intents из списка.
Посмотрите на этот пример, где я создаю селектор, который показывает только мои почтовые приложения. В моем случае появляется три письма: Gmail, YahooMail и почта по умолчанию.
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
Этот вопрос немного старше, но, поскольку я только что столкнулся с подобной проблемой, он также может по-прежнему представлять интерес для других. Во-первых, как упоминал Питер, создайте свое намерение:
Intent tweetIntent = new Intent(Intent.ACTION_SEND);
tweetIntent.putExtra(Intent.EXTRA_TEXT, "Test; please ignore");
tweetIntent.setType("application/twitter");
"application / twitter" на самом деле является известным типом контента, см. здесь. Теперь, когда вы попытаетесь начать действие с этим намерением, оно покажет все виды приложений, которые на самом деле не являются клиентами Twitter, но хотят часть действия. Как уже упоминалось в паре "почему ты вообще хочешь это сделать?" вроде ответов, некоторые пользователи могут найти это полезным. С другой стороны, если в моем приложении будет кнопка с надписью "Чирикать это!", Пользователь будет очень ожидать, что это вызовет клиент 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, когда вы можете захотеть создать свой собственный диалог выбора из всех названий действий, которые вы найдете.
Эти ответы слишком сложны.
Если вы просто делаете обычное URL-намерение для Twitter.com, вы получите этот экран:
что дает вам возможность перейти на сайт, если у вас не установлены приложения 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);
Или
- Вы начинаете действие с намерения с действием
Intent.ACTION_SEND
иtext/plain
MIME тип. У вас будут все приложения, поддерживающие отправку текста. Это должен быть любой твиттер-клиент, а также Gmail, Dropbox и т. Д. - Или вы пытаетесь найти конкретное действие каждого клиента, о котором вам известно, например, com.twitter.android.PostActivity для официального клиента. Это будет указывать на этого клиента, и вряд ли это будет полный список.
- Или вы начинаете со второго пункта и возвращаетесь к первому...
Нету. Тип намерения что-то вроде image/png
или же application/pdf
тип файла, и с createChooser вы в основном спрашиваете, какие приложения могут открывать этот тип файла.
Теперь нет такой вещи, как application/twitter
файл, который можно открыть, чтобы он не работал. Я не знаю ни о каком другом пути, которым вы можете достичь того, чего хотите.
Я использовал ответ "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
}
С http://twidroid.com/plugins/
ACTION_SEND намерение Twidroid
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));