1page.title=別のアプリにユーザーを送る 2page.tags=インテント 3helpoutsWidget=true 4 5trainingnavtop=true 6 7@jd:body 8 9 10<div id="tb-wrapper"> 11 <div id="tb"> 12 13<h2>このレッスンでの学習内容</h2> 14<ol> 15 <li><a href="#Build">暗黙的インテントをビルドする</a></li> 16 <li><a href="#Verify">インテントを受け取るアプリがあるか確認する</a></li> 17 <li><a href="#StartActivity">インテントを使ってアクティビティを開始する</a></li> 18 <li><a href="#AppChooser">アプリ チューザを表示する</a></li> 19</ol> 20 21<h2>関連ドキュメント</h2> 22<ul> 23 <li><a href="{@docRoot}training/sharing/index.html">単純なデータの共有</a></li> 24</ul> 25 26 </div> 27</div> 28 29<p>Android の最も重要な特長の一つに、ユーザーが実行を希望する「アクション」に基づいて、別のアプリにユーザーを送信するアプリの機能があります。 30たとえば、自分のアプリで地図上に表示したいお店やサービスの住所がある場合、アプリでマップを表示するアクティビティをビルドする必要はありません。 31 32代わりに {@link android.content.Intent} 使用して、住所を表示するための要求を作成することができます。 33Android システムは、マップ上に住所を表示できるアプリを起動します。 34</p> 35 36<p>第 1 回のクラス<a href="{@docRoot}training/basics/firstapp/index.html">初めてのアプリ作成</a>で説明したように、自分のアプリでのアクティビティ間を移動するためにインテントを使用する必要があります。通常それには、起動するコンポーネントの正確なクラス名を定義する、<em>明示的なインテント</em>を使用します。 37 38 39ただし、「マップを表示する」などのアクションを別のアプリに実行させたい場合、<em>暗黙的なインテント</em>を使用する必要があります。 40</p> 41 42<p>このレッスンでは、特定のアクションの暗黙的インテントを作成する方法や、他のアプリでアクションを実行するアクティビティを開始させる目的で、暗黙的インテントを使用する方法を示します。 43</p> 44 45 46 47<h2 id="Build">暗黙的インテントをビルドする</h2> 48 49<p>暗黙的インテントは、開始するコンポーネントのクラス名を宣言せず、代わりに実行するアクションを宣言します。 50アクションでは、<em>表示</em>、<em>編集</em>、<em>送信</em>や、<em>取得</em>などの、希望する操作を指定します。 51インテントは、多くの場合、表示対象の住所、送信対象の電子メール メッセージなど、アクションに関連するデータを含みます。作成するインテントにもよりますが、データは {@link android.net.Uri}、またはその他のいくつかのデータ タイプのいずれかとなるか、データ自体全く必要とならない場合もあります。 52 53 54</p> 55 56<p>データが {@link android.net.Uri} である場合は、単純な {@link 57android.content.Intent#Intent(String,Uri) Intent()} コンストラクタを使用してアクションとデータを定義することができます。 58</p> 59 60<p>ここでは、電話番号を指定するための {@link 61android.net.Uri} のデータを使用して、電話をかけるインテントを作成する方法について次の例を示します。</p> 62 63<pre> 64Uri number = Uri.parse("tel:5551234"); 65Intent callIntent = new Intent(Intent.ACTION_DIAL, number); 66</pre> 67 68<p>{@link android.app.Activity#startActivity 69startActivity()} を呼び出すことにより、自分のアプリでインテントが起動されると、電話アプリは指定された電話番号への通話を開始します。</p> 70 71<p>ここでは他の 2 つのインテント、およびそのアクションと{@link android.net.Uri} データのペアの例を示します。 72</p> 73 74<ul> 75 <li>マップを表示する: 76<pre> 77// Map point based on address 78Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California"); 79// Or map point based on latitude/longitude 80// Uri location = Uri.parse("geo:37.422219,-122.08364?z=14"); // z param is zoom level 81Intent mapIntent = new Intent(Intent.ACTION_VIEW, location); 82</pre> 83 </li> 84 <li>ウェブ ページを表示する: 85<pre> 86Uri webpage = Uri.parse("http://www.android.com"); 87Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage); 88</pre> 89 </li> 90</ul> 91 92<p>暗黙的インテントのその他の種類には、文字列などのさまざまなデータ タイプを提供する「特別」データを必要とします。 93さまざまな {@link 94android.content.Intent#putExtra(String,String) putExtra()} メソッドを使用して、特別データを 1 つ以上追加することができます。</p> 95 96<p>デフォルトでは、インテントに含まれる 97{@link android.net.Uri} データに基づいて、インテントに必要な適切な MIME タイプをシステムが決定します。インテントに {@link android.net.Uri} が含まれていない場合は、通常は {@link android.content.Intent#setType setType()} を使用して、インテントに関連するデータのタイプを指定する必要があります。 98 99MIME タイプの詳細な指定により、どの種類のアクティビティがインテントを受け取るかが指定されます。 100</p> 101 102<p>ここでは、目的のアクションを指定するための特別データを追加しているインテントの例を示します。</p> 103 104<ul> 105 <li>添付ファイル付きのメールを送信する: 106<pre> 107Intent emailIntent = new Intent(Intent.ACTION_SEND); 108// The intent does not have a URI, so declare the "text/plain" MIME type 109emailIntent.setType(HTTP.PLAIN_TEXT_TYPE); 110emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"jon@example.com"}); // recipients 111emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Email subject"); 112emailIntent.putExtra(Intent.EXTRA_TEXT, "Email message text"); 113emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("content://path/to/email/attachment")); 114// You can also attach multiple items by passing an ArrayList of Uris 115</pre> 116 </li> 117 <li>カレンダーイベントを作成する: 118<pre> 119Intent calendarIntent = new Intent(Intent.ACTION_INSERT, Events.CONTENT_URI); 120Calendar beginTime = Calendar.getInstance().set(2012, 0, 19, 7, 30); 121Calendar endTime = Calendar.getInstance().set(2012, 0, 19, 10, 30); 122calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.getTimeInMillis()); 123calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime.getTimeInMillis()); 124calendarIntent.putExtra(Events.TITLE, "Ninja class"); 125calendarIntent.putExtra(Events.EVENT_LOCATION, "Secret dojo"); 126</pre> 127<p class="note"><strong>注:</strong> カレンダー イベント用のこのインテントは、API レベル 14 以降でのみサポートされています。 128</p> 129 </li> 130</ul> 131 132<p class="note"><strong>注:</strong> できるだけ具体的に {@link 133android.content.Intent} を定義することが重要です。たとえば、 134{@link android.content.Intent#ACTION_VIEW} のインテントを使用して画像を表示する場合、 135{@code image/*} の MIME タイプを指定する必要があります。これにより、他のタイプのデータを「表示」できる(マップ アプリのような)アプリがインテントによってトリガーされることを回避します。 136</p> 137 138 139 140<h2 id="Verify">インテントを受け取るアプリがあるか確認する</h2> 141 142<p>Android プラットフォームは、特定のインテント(電話、メール、カレンダーアプリなど)が内蔵のアプリのいずれかへ解決することを保証しますが、インテントを呼び出す前に常に検証ステップを含める必要があります。 143 144</p> 145 146<p class="caution"><strong>警告: </strong>インテントを呼び出した際、端末上で利用可能なインテントを処理できるアプリがない場合、アプリがクラッシュします。 147</p> 148 149<p>インテントに応答できる利用可能なアクティビティがあるかどうかを確認するには {@link 150android.content.pm.PackageManager#queryIntentActivities queryIntentActivities()} を呼び出して、 151{@link android.content.Intent} を処理できるアクティビティのリストを取得します。返された {@link 152java.util.List} が空ではない場合、安全にインテントを使用することができます。次に例を示します。</p> 153 154<pre> 155PackageManager packageManager = {@link android.content.Context#getPackageManager()}; 156List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 157 PackageManager.MATCH_DEFAULT_ONLY); 158boolean isIntentSafe = activities.size() > 0; 159</pre> 160 161<p><code>isIntentSafe</code> が <code>true</code> であれば、少なくとも 1 つのアプリがインテントに応答します。 162<code>false</code> であれば、インテントを処理するアプリが存在しません。</p> 163 164<p class="note"><strong>注:</strong> ユーザーがインテントを使用する前にインテントを使用する機能を無効化する必要がある場合、アクティビティが最初に起動するときにこのチェックを実行する必要があります。 165 166インテントを処理できるアプリが具体的に分かっている場合、当該アプリをダウンロードするユーザーのためにリンクを提供することができます(<a href="{@docRoot}distribute/tools/promote/linking.html">Google 167Play 上の自分の製品にリンクする方法</a>を参照)。 168</p> 169 170 171<h2 id="StartActivity">インテントを使ってアクティビティを開始する</h2> 172 173<div class="figure" style="width:200px;margin-top:-10px"> 174 <img src="{@docRoot}images/training/basics/intents-choice.png" alt="" /> 175 <p class="img-caption"><strong>図 1.</strong> 複数のアプリがインテントを処理することができるときに表示される選択ダイアログの例です。 176</p> 177</div> 178 179<p>{@link android.content.Intent} を作成し、付加情報を設定したら、{@link 180android.app.Activity#startActivity startActivity()} を呼び出してシステムに送信します。システムがインテントを処理することができる複数のアクティビティを特定した場合、図 1 に示すように使用するアプリを選択できるダイアログをユーザーに表示します。 181 182インテントを処理できるアクティビティが 1 つのみの場合、システムはすぐにそのアクティビティを起動します。 183</p> 184 185<pre> 186startActivity(intent); 187</pre> 188 189<p>次に、マップを表示するためのインテントを作成し、そのインテントを処理するアプリが存在するかを確認してから起動する、一連の方法について例を示します。 190</p> 191 192<pre> 193// Build the intent 194Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California"); 195Intent mapIntent = new Intent(Intent.ACTION_VIEW, location); 196 197// Verify it resolves 198PackageManager packageManager = {@link android.content.Context#getPackageManager()}; 199List<ResolveInfo> activities = packageManager.queryIntentActivities(mapIntent, 0); 200boolean isIntentSafe = activities.size() > 0; 201 202// Start an activity if it's safe 203if (isIntentSafe) { 204 startActivity(mapIntent); 205} 206</pre> 207 208 209 210<h2 id="AppChooser">アプリ チューザを表示する</h2> 211 212<div class="figure" style="width:200px;margin-top:-10px"> 213 <img src="{@docRoot}images/training/basics/intent-chooser.png" alt="" /> 214 <p class="img-caption"><strong>図 2.</strong> チューザのダイアログ</p> 215</div> 216 217<p>自分の {@link android.content.Intent} を {@link 218android.app.Activity#startActivity startActivity()} に渡してアクティビティを開始した際に、インテントに応答できる複数のアプリがある場合、ユーザーがデフォルトで使用するアプリを選択できること(ダイアログの下部にあるチェックボックスを選択してこれを行います。図 1 参照)に注意してください。 219 220これは、(1 つのウェブ ブラウザのみを使用する傾向にあるユーザーが)ウェブ ページを開いたり、(1 つのカメラを選ぶ傾向にあるユーザーが)写真を撮影したりするときのように、ユーザーがアクション実行時に毎回同じアプリの使用を希望するような場合には有用です。 221 222</p> 223 224<p>一方、実行対象のアクションが複数のアプリによって処理できる場合、ユーザーは毎回異なるアプリを選ぶかもしれません。たとえば「共有」アクションなど、いくつかのアプリを介してアイテムを共有する可能性があります。この場合、図 2 に示すように、チューザのダイアログを明示的に表示する必要があります。 225 226 227チューザのダイアログは、アクションのたびに使用するアプリを選択するよう、ユーザーを強制します(ユーザーはアクションのデフォルトのアプリを選択することはできません)。 228 229</p> 230 231<p>チューザを表示するには、{@link 232android.content.Intent#createChooser createChooser()} を使用して {@link android.content.Intent} を作成し、{@link 233android.app.Activity#startActivity startActivity()} に渡します。次に例を示します。</p> 234 235<pre> 236Intent intent = new Intent(Intent.ACTION_SEND); 237... 238 239// Always use string resources for UI text. 240// This says something like "Share this photo with" 241String title = getResources().getString(R.string.chooser_title); 242// Create intent to show chooser 243Intent chooser = Intent.createChooser(intent, title); 244 245// Verify the intent will resolve to at least one activity 246if (intent.resolveActivity(getPackageManager()) != null) { 247 startActivity(chooser); 248} 249</pre> 250 251<p>これにより、{@link 252android.content.Intent#createChooser createChooser()} メソッドに渡されたインテントに応答するアプリのリストを示すダイアログが表示され、指定されたテキストがダイアログのタイトルになります。 253</p> 254 255 256 257