Приложение 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
}