Подтвердить что ты не робот

Приложение Android Intent для Twitter

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

Спасибо,

Wouter

4b9b3361

Ответ 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
}