• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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&lt;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