Приложение Android Intent for Twitter - PullRequest
61 голосов
/ 16 января 2010

Можно ли отобразить список приложений (с intent.createChooser), которые показывают только мои приложения в твиттере на моем телефоне (так что htc peep (htc hero) или twitdroid). Я попробовал его с intent.settype("application/twitter"), но он не находит никаких приложений для твиттера и показывает только мои почтовые приложения.

Спасибо,

Wouter

Ответы [ 9 ]

82 голосов
/ 17 января 2014

Я публикую это, потому что я еще не видел решения, которое бы делало именно то, что я хочу.

Это в первую очередь запускает официальное приложение Twitter или, если оно не установлено, либо вызывает диалоговое окно «Завершить действие с помощью ...» ( как этот ), либо запускается напрямую веб-браузер.

Список различных параметров в URL-адресе twitter.com см. В документах Tweet Button . Не забудьте 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 :

enter image description here

Если официальное приложение Twitter не установлено и пользователь либо выбирает Chrome, либо открывается автоматически (как единственное приложение, которое может обрабатывать намерения):

enter image description here

39 голосов
/ 05 февраля 2012

Решения, опубликованные ранее, позволяют размещать сообщения прямо в вашем первом приложении в 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

34 голосов
/ 17 января 2011

Этот вопрос немного старше, но, поскольку я только что столкнулся с подобной проблемой, он также может по-прежнему представлять интерес для других. Во-первых, как упоминал Питер, создайте свое намерение:

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, когда вы можете захотеть создать свой собственный диалог выбора из всех найденных вами названий действий.

23 голосов
/ 16 января 2010

Вполне возможно, что ваши пользователи захотят только когда-либо, сейчас и навсегда, только публиковать сообщения в Twitter.

Я думаю, что более вероятно, что ваши пользователи хотят отправлять информацию людям, и Twitter - одна из возможностей. Но они также могут захотеть отправить текстовое сообщение или электронное письмо и т. Д.

В этом случае используйте ACTION_SEND, как описано здесь . Twidroid, в частности, поддерживает ACTION_SEND, поэтому он появится в списке доступных механизмов доставки.

17 голосов
/ 09 мая 2013

Все эти ответы слишком сложны.

Если вы просто делаете обычный 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);
9 голосов
/ 13 марта 2011

Либо

  • Вы запускаете действие с намерением с действием Intent.ACTION_SEND и типом text/plain MIME. У вас будут все приложения, поддерживающие отправку текста. Это должен быть любой твиттер-клиент, а также Gmail, Dropbox и т. Д.
  • Или вы пытаетесь найти конкретное действие каждого клиента, о котором вам известно, например "com.twitter.android.PostActivity" для официального клиента . Это будет указывать на этого клиента, и вряд ли это будет полный список.
  • Или вы начинаете со второй точки и отступаете к первой ...
4 голосов
/ 16 января 2010

Неа. Тип намерения - это что-то вроде image/png или application/pdf, то есть тип файла, и с помощью createChooser вы в основном спрашиваете, какие приложения могут открыть этот тип файла.

Теперь нет такого понятия, как application/twitter файл, который можно открыть, чтобы он не работал. Я не знаю ни о каком другом способе достижения того, чего вы хотите.

3 голосов
/ 14 августа 2013

Я использовал ответ "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
}
3 голосов
/ 27 января 2010

С 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)); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...