web-dev-qa-db-ja.com

Android Twitterアプリケーションの意図

電話でTwitterアプリのみを表示するアプリケーションのリストを(_intent.createChooser_で)表示することは可能ですか(htc peep(htc hero)またはtwitdroid)。 intent.settype("application/Twitter")で試してみましたが、Twitter用のアプリは見つからず、メールアプリのみが表示されます。

ありがとうございました、

ウーター

61
wouter88

ユーザーがTwitterにのみ投稿したいと思うようになることは完全に可能です。

私はあなたのユーザーが情報を人々に送りたいと思う可能性が高いと思います、そしてツイッターは1つの可能性です。しかし、彼らはまた、テキストメッセージ、または電子メールなどを送信したい場合があります.

その場合は、ACTION_SEND、説明どおり ここ 。 Twidroidは、特に、ACTION_SENDですので、利用可能な配信メカニズムのリストに表示されます。

23
CommonsWare

私がこれを投稿しているのは、私が望んでいることを正確に実現するソリューションがまだないためです。

これは主に公式のTwitterアプリを起動します、またはインストールされていない場合は、「...を使用してアクションを完了」ダイアログを表示します( このように )またはWebブラウザーを直接起動します。

Twitter.com URLのさまざまなパラメーターのリストについては、 Tweet Button docs を参照してください。 RLエンコード パラメーター値を忘れないでください。 (このコードは特に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);

(このような小さなユーティリティ、たとえば "StringUtils"がある場合、URLエンコードはクリーンです。)

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アプリがnotがインストールされ、ユーザーがChromeを選択するか、意図を処理できる唯一のアプリとして)自動的に開く場合:

enter image description here

82
Jonik

以前に投稿したソリューションでは、最初のTwitterアプリに直接投稿できます。 twittersアプリのリストを表示するには(複数ある場合)、Intent.createChooserをカスタマイズして、必要なItentsのみを表示できます。

トリックは、createChooseから生成されたデフォルトのリストにEXTRA_INITIAL_INTENTSを追加し、リストから他のインテントを削除することです。

電子メールアプリのみを表示するセレクターを作成するこのサンプルを見てください。私の場合、Gmail、YahooMail、デフォルトのメールの3つのメールが表示されます。

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パッケージ名 に基づくインテントチューザーのカスタムフィルタリング

39
Derzu

この質問は少し古いですが、同様の問題に出くわしたばかりなので、他の人にも興味があるかもしれません。まず、Peterが述べたように、意図を作成します。

Intent tweetIntent = new Intent(Intent.ACTION_SEND);
tweetIntent.putExtra(Intent.EXTRA_TEXT, "Test; please ignore");
tweetIntent.setType("application/Twitter");

「application/Twitter」は、実際には既知のコンテンツタイプです。 here を参照してください。さて、この目的でアクティビティを開始しようとすると、実際には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クライアントがある場合を考慮することができます。

34

これらの答えはすべて非常に複雑です。

Twitter.comに対して行う通常のURLインテントを実行するだけで、次の画面が表示されます。

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);
17
Speed

どちらか

  • アクションIntent.ACTION_SENDおよびtext/plain MIMEタイプのインテントでアクティビティを開始します。テキストの送信をサポートするすべてのアプリケーションがあります。これは、Gmail、Dropboxなどだけでなく、あらゆるTwitterクライアントである必要があります。
  • または、 公式クライアントの場合は "com.Twitter.Android.PostActivity" のように、認識しているすべてのクライアントの 特定のアクションを検索する を試みます。それはこのクライアントを指し、それが完全なリストである可能性は低いです。
  • または、2番目のポイントから始めて、最初のポイントにフォールバックします...
9
rds

いや。インテントタイプはimage/pngまたはapplication/pdfのようなもの、つまりファイルタイプであり、createChooserを使用すると、基本的にどのアプリがこのファイルタイプを開くことができるかを確認します。

現在、開くことができるapplication/Twitterファイルなどは存在しないため、機能しません。私はあなたがあなたが望むものを達成できる他の方法を知りません。

4
Mirko N.

「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
echappy

http://twidroid.com/plugins/ から

Twidroidの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)); 
3
Peter