62

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

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

ウーター

4

9 に答える 9

83

私が望んでいることを正確に行う解決策をまだ見ていないので、これを投稿しています。

これは主に公式の Twitter アプリを起動するか、それがインストールされていない場合は、"Complete action using..." ダイアログ (このような) を表示するか、直接 Web ブラウザーを起動します。

twitter.com URL のさまざまなパラメーターのリストについては、ツイート ボタンのドキュメントを参照してください。パラメータ値を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);

(「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 アプリが直接開きます。

ここに画像の説明を入力

公式の Twitter アプリがインストールされておらず、ユーザーが Chrome を選択するか、自動的に開く場合 (インテントを処理できる唯一のアプリとして):

ここに画像の説明を入力

于 2014-01-17T13:04:38.360 に答える
40

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

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

于 2012-02-05T18:51:01.230 に答える
34

この質問は少し古いですが、私はちょうど同様の問題に遭遇したので、それはまだ他の人にも興味があるかもしれません。まず、Peterが述べたように、インテントを作成します。

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クライアントが複数ある場合を考慮に入れることができます。

于 2011-01-17T16:32:15.817 に答える
23

ユーザーがTwitterに投稿したいと思うのは、これまで、今、そして永遠である可能性があります。

ユーザーが人に情報を送りたいと思う可能性が高いと思いますが、Twitterもその可能性のひとつです。ただし、テキストメッセージや電子メールなどを送信することもできます。

その場合は、ここでACTION_SEND説明するようにを使用します。特にTwidroidはをサポートしているため、利用可能な配信メカニズムのリストに表示されます。ACTION_SEND

于 2010-01-16T12:41:26.957 に答える
9

また

  • Intent with アクションIntent.ACTION_SENDtext/plainMIME タイプでアクティビティを開始します。テキストの送信をサポートするすべてのアプリケーションが用意されています。これは、Gmail、Dropbox などと同様に、任意の Twitter クライアントである必要があります。
  • または、公式クライアントの「com.twitter.android.PostActivity」など、認識しているすべてのクライアントの特定のアクションを調べようとします。それはこのクライアントを指していますが、それが完全なリストである可能性は低いです。
  • または、2 番目のポイントから始めて、最初のポイントに戻る...
于 2011-03-13T19:30:57.083 に答える
4

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

さて、application/twitter開くことができるファイルのようなものはないので、それは機能しません。あなたが望むものを達成できる他の方法も知りません。

于 2010-01-16T11:42:58.960 に答える
3

「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
}
于 2013-08-14T14:58:21.517 に答える
3

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)); 
于 2010-01-27T13:33:58.013 に答える