intent.createChooser
私の電話で私のTwitterアプリのみを表示するアプリケーションのリストを( で)表示することは可能ですか(つまり、htc peep(htc hero)またはtwitdroid)。試してみましたintent.settype("application/twitter")
が、Twitter用のアプリが見つからず、メールアプリしか表示されません。
ありがとうございました、
ウーター
intent.createChooser
私の電話で私のTwitterアプリのみを表示するアプリケーションのリストを( で)表示することは可能ですか(つまり、htc peep(htc hero)またはtwitdroid)。試してみましたintent.settype("application/twitter")
が、Twitter用のアプリが見つからず、メールアプリしか表示されません。
ありがとうございました、
ウーター
私が望んでいることを正確に行う解決策をまだ見ていないので、これを投稿しています。
これは主に公式の 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 を選択するか、自動的に開く場合 (インテントを処理できる唯一のアプリとして):
以前に投稿したソリューションでは、最初の 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 パッケージ名に基づくインテント チューザーのカスタム フィルタリング
この質問は少し古いですが、私はちょうど同様の問題に遭遇したので、それはまだ他の人にも興味があるかもしれません。まず、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クライアントが複数ある場合を考慮に入れることができます。
ユーザーがTwitterに投稿したいと思うのは、これまで、今、そして永遠である可能性があります。
ユーザーが人に情報を送りたいと思う可能性が高いと思いますが、Twitterもその可能性のひとつです。ただし、テキストメッセージや電子メールなどを送信することもできます。
その場合は、ここでACTION_SEND
説明するようにを使用します。特にTwidroidはをサポートしているため、利用可能な配信メカニズムのリストに表示されます。ACTION_SEND
また
Intent.ACTION_SEND
とtext/plain
MIME タイプでアクティビティを開始します。テキストの送信をサポートするすべてのアプリケーションが用意されています。これは、Gmail、Dropbox などと同様に、任意の Twitter クライアントである必要があります。いいえ。インテント タイプはimage/png
orのようなものapplication/pdf
、つまりファイル タイプであり、createChooser を使用すると、基本的にどのアプリがこのファイル タイプを開くことができるかを尋ねます。
さて、application/twitter
開くことができるファイルのようなものはないので、それは機能しません。あなたが望むものを達成できる他の方法も知りません。
「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
}
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));