diff options
author | David Friedman <dmail@google.com> | 2014-12-19 16:28:17 -0800 |
---|---|---|
committer | David Friedman <dmail@google.com> | 2014-12-19 18:00:44 -0800 |
commit | 827cc88a338967fe778fe96bfaec80091da0f6cd (patch) | |
tree | 3cc1692ca1ae7537be4f9e26b99d5e9b97d6f6a9 /docs/html-intl/intl/ja | |
parent | 713cd74e333ab9bb35cb7538611194d891e4eb53 (diff) | |
download | frameworks_base-827cc88a338967fe778fe96bfaec80091da0f6cd.zip frameworks_base-827cc88a338967fe778fe96bfaec80091da0f6cd.tar.gz frameworks_base-827cc88a338967fe778fe96bfaec80091da0f6cd.tar.bz2 |
Android TV initial (time-sensitive) localization release for Japanese partners.
Bug: 18527238
Change-Id: Id933695738a07aa0a1c02783e022dd8b98bbf98e
Diffstat (limited to 'docs/html-intl/intl/ja')
-rwxr-xr-x | docs/html-intl/intl/ja/training/tv/playback/browse.jd | 194 | ||||
-rwxr-xr-x | docs/html-intl/intl/ja/training/tv/playback/details.jd | 210 | ||||
-rwxr-xr-x | docs/html-intl/intl/ja/training/tv/playback/index.jd | 42 | ||||
-rwxr-xr-x | docs/html-intl/intl/ja/training/tv/playback/now-playing.jd | 134 | ||||
-rwxr-xr-x | docs/html-intl/intl/ja/training/tv/start/hardware.jd | 314 | ||||
-rwxr-xr-x | docs/html-intl/intl/ja/training/tv/start/index.jd | 45 | ||||
-rwxr-xr-x | docs/html-intl/intl/ja/training/tv/start/layouts.jd | 190 | ||||
-rwxr-xr-x | docs/html-intl/intl/ja/training/tv/start/navigation.jd | 144 | ||||
-rwxr-xr-x | docs/html-intl/intl/ja/training/tv/start/start.jd | 232 |
9 files changed, 1505 insertions, 0 deletions
diff --git a/docs/html-intl/intl/ja/training/tv/playback/browse.jd b/docs/html-intl/intl/ja/training/tv/playback/browse.jd new file mode 100755 index 0000000..f2261e1 --- /dev/null +++ b/docs/html-intl/intl/ja/training/tv/playback/browse.jd @@ -0,0 +1,194 @@ +page.title=カタログ ブラウザを作成する +page.tags=tv, browsefragment, presenter, backgroundmanager + +trainingnavtop=true + +@jd:body + +<div id="tb-wrapper"> +<div id="tb"> + <h2>学習の目的</h2> + <ol> + <li><a href="#layout">メディア ブラウズ レイアウトを作成する</a></li> + <li><a href="#lists">メディア リストを表示する</a></li> + <li><a href="#background">背景をアップデートする</a></li> + </ol> + +</div> +</div> + +<p> + TV で使用するメディア アプリでは、ユーザーがコンテンツ内容をブラウズして選び、再生を開始できるようにする必要があります。このタイプのアプリのコンテンツ ブラウジングに関するユーザー エクスペリエンスは、シンプルで直感的、そして目を楽しませる魅力的なものである必要があります。 +</p> + +<p> + このレッスンでは、<a href="{@docRoot}tools/support-library/features.html#v17-leanback">v17 leanback サポート ライブラリ</a> が提供するクラスを使用して、アプリのメディア カタログから音楽やビデオを閲覧するためのユーザー インターフェースを実装する方法を説明します。 +</p> + + +<h2 id="layout">メディア ブラウズ レイアウトを作成する</h2> + +<p> + leanback サポート ライブラリの {@link android.support.v17.leanback.app.BrowseFragment} クラスを使用すると、最小限のコードでブラウジング カテゴリのプライマリ レイアウトとメディア アイテムの行を作成できます。次の例では、{@link android.support.v17.leanback.app.BrowseFragment} を含むレイアウトの作成方法を示します。 +</p> + +<pre> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical" + > + + <fragment + <strong>android:name="android.support.v17.leanback.app.BrowseFragment"</strong> + android:id="@+id/browse_fragment" + android:layout_width="match_parent" + android:layout_height="match_parent" + /> +</LinearLayout> +</pre> + +<p> + アクティビティ内でこのレイアウトを使用して作業するには、レイアウトから{@link android.support.v17.leanback.app.BrowseFragment} エレメントを取得します。このクラスのメソッドを使用して、アイコン、タイトル、カテゴリ ヘッダーが有効になっているかどうかなどの表示パラメータを設定します。次のコード サンプルでは、レイアウト内で {@link android.support.v17.leanback.app.BrowseFragment} のレイアウト パラメータの設定方法を示します。 +</p> + +<pre> +public class BrowseMediaActivity extends Activity { + + public static final String TAG ="BrowseActivity"; + + protected BrowseFragment mBrowseFragment; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.browse_fragment); + + final FragmentManager fragmentManager = getFragmentManager(); + <strong>mBrowseFragment = (BrowseFragment) fragmentManager.findFragmentById( + R.id.browse_fragment);</strong> + + // Set display parameters for the BrowseFragment + mBrowseFragment.setHeadersState(BrowseFragment.HEADERS_ENABLED); + mBrowseFragment.setTitle(getString(R.string.app_name)); + mBrowseFragment.setBadgeDrawable(getResources().getDrawable( + R.drawable.ic_launcher)); + mBrowseFragment.setBrowseParams(params); + + } +} +</pre> + + +<h2 id="lists">メディア リストを表示する</h2> + +<p> + {@link android.support.v17.leanback.app.BrowseFragment} ではアダプタとプレゼンターを使用して、ブラウズ可能なメディア コンテンツのカテゴリや、メディア カタログのメディア アイテムを定義したり、表示したりできます。アダプタを使用すると、メディア カタログ情報が含まれているローカルやオンラインのデータ ソースに接続できます。プレゼンターは、メディア アイテムに関するデータを保持し、スクリーンにアイテムを表示する際のレイアウト情報を提供します。 +</p> + +<p> + 次のコード例では、文字列データを表示する際の{@link android.support.v17.leanback.widget.Presenter} の実装について示します。 +</p> + +<pre> +public class StringPresenter extends Presenter { + private static final String TAG = "StringPresenter"; + + public ViewHolder onCreateViewHolder(ViewGroup parent) { + TextView textView = new TextView(parent.getContext()); + textView.setFocusable(true); + textView.setFocusableInTouchMode(true); + textView.setBackground( + parent.getContext().getResources().getDrawable(R.drawable.text_bg)); + return new ViewHolder(textView); + } + + public void onBindViewHolder(ViewHolder viewHolder, Object item) { + ((TextView) viewHolder.view).setText(item.toString()); + } + + public void onUnbindViewHolder(ViewHolder viewHolder) { + // no op + } +} +</pre> + +<p> + メディア アイテムのプレゼンター クラスを構築したら、アダプタをビルドしたり、{@link android.support.v17.leanback.app.BrowseFragment} にアタッチしたりして、ユーザーのブラウジング用にスクリーン上にそれらのアイテムを表示させることができます。次のコード例では、1 つ前のコード例に示したように、{@code StringPresenter} クラスを使用して、カテゴリ内にカテゴリとアイテムを表示するためのアダプタの構築方法を示します。 +</p> + +<pre> +private ArrayObjectAdapter mRowsAdapter; +private static final int NUM_ROWS = 4; + +@Override +protected void onCreate(Bundle savedInstanceState) { + ... + + buildRowsAdapter(); +} + +private void buildRowsAdapter() { + mRowsAdapter = new ArrayObjectAdapter(new ListRowPresenter()); + + for (int i = 0; i < NUM_ROWS; ++i) { + ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter( + new StringPresenter()); + listRowAdapter.add("Media Item 1"); + listRowAdapter.add("Media Item 2"); + listRowAdapter.add("Media Item 3"); + HeaderItem header = new HeaderItem(i, "Category " + i, null); + mRowsAdapter.add(new ListRow(header, listRowAdapter)); + } + + mBrowseFragment.setAdapter(mRowsAdapter); +} +</pre> + +<p> + この例では、アダプタの静的実装を示します。一般的なメディア ブラウジング アプリは、オンライン データベースやウェブ サービスのデータを使用します。ウェブから取得したデータを使用したブラウジング アプリの例については、<a href="http://github.com/googlesamples/androidtv-leanback">Android TV</a> のサンプル アプリを参照してください。 +</p> + +<h2 id="background">背景をアップデートする</h2> + +<p> + TV で使用されるメディア ブラウジング アプリを目立たせるために、ユーザーがコンテンツをブラウジングしている間の背景イメージをアップデートできます。これにより、アプリの使用がユーザーにとって、より動きのある楽しいものになります。 +</p> + +<p> + Leanback サポート ライブラリは、TV アプリのアクティビティの背景を変更するための {@link android.support.v17.leanback.app.BackgroundManager} クラスを提供しています。次の例では、TV アプリのアクティビティ内の背景をアップデートする簡単なメソッドの作成方法を示します。 +</p> + +<pre> +protected void updateBackground(Drawable drawable) { + BackgroundManager.getInstance(this).setDrawable(drawable); +} +</pre> + +<p> + ほとんどの既存のメディア ブラウズ アプリでは、ユーザーがメディア リストをスクロールするのに合わせて自動的に背景がアップデートされます。これを行うには選択リスナを設定して、ユーザーの現在の選択に基づいて自動的に背景をアップデートできるようにします。次の例では、{@link android.support.v17.leanback.widget.OnItemViewSelectedListener} クラスをセットアップして、選択イベントの判別後に背景をアップデートする方法を示します。 +</p> + +<pre> +protected void clearBackground() { + BackgroundManager.getInstance(this).setDrawable(mDefaultBackground); +} + +protected OnItemViewSelectedListener getDefaultItemViewSelectedListener() { + return new OnItemViewSelectedListener() { + @Override + public void onItemSelected(Object item, Row row) { + if (item instanceof Movie ) { + URI uri = ((Movie)item).getBackdropURI(); + updateBackground(uri); + } else { + clearBackground(); + } + } + }; +} +</pre> + +<p class="note"> + <strong>注意:</strong>上記の実装例はわかりやすく示すため、実際よりも単純化されています。実際にアプリでこの機能を作成する際は、パフォーマンス向上のために、別のスレッドで背景のアップデート アクションを実行するようにしてください。また、ユーザーがアイテムをスクロールする動作に合わせて背景をアップデートする場合には、ユーザーが 1 つのアイテムに落ち着くまで、背景イメージのアップデートを遅らせる時間を追加することも検討してください。これにより、背景イメージのアップデートが過剰にならないようにします。 +</p> diff --git a/docs/html-intl/intl/ja/training/tv/playback/details.jd b/docs/html-intl/intl/ja/training/tv/playback/details.jd new file mode 100755 index 0000000..8e6d28f --- /dev/null +++ b/docs/html-intl/intl/ja/training/tv/playback/details.jd @@ -0,0 +1,210 @@ +page.title=詳細ビューをビルドする +page.tags=tv, detailsfragment + +trainingnavtop=true + +@jd:body + +<div id="tb-wrapper"> +<div id="tb"> + <h2>学習の目的</h2> + <ol> + <li><a href="#details-presenter">詳細プレゼンターをビルドする</a></li> + <li><a href="#details-fragment">詳細フラグメントを拡張する</a> + <li><a href="#activity">詳細アクティビティを作成する</a></li> + <li><a href="#item-listener">クリックされたアイテムのリスナを定義する</a></li> + </ol> +</div> +</div> + +<p> + <a href="{@docRoot}tools/support-library/features.html#v17-leanback">v17 leanback サポート ライブラリ</a> が提供するメディア ブラウジング インターフェース クラスには、説明やレビューなどのメディア アイテムに関する追加情報を表示したり、アイテムの購入やコンテンツの再生など、アイテムに対するアクションを取ったりするためのクラスが含まれます。 +</p> + +<p> + このレッスンでは、メディア アイテムの詳細に関するプレゼンター クラスを作成したり、{@link android.support.v17.leanback.app.DetailsFragment} クラスを拡張して、ユーザーがメディア アイテムを選択した場合に表示する詳細ビューを実装したりする方法を説明します。 +</p> + +<p class="note"> + <strong>注意:</strong>次の実装例では、追加的なアクティビティを使用して {@link android.support.v17.leanback.app.DetailsFragment} を含めています。ただし、フラグメント トランザクションを使用すると、現在の {@link android.support.v17.leanback.app.BrowseFragment} を<em>同じ</em>アクティビティにある {@link android.support.v17.leanback.app.DetailsFragment} で置き換えることにより、2 つ目のアクティビティの作成を回避できます。フラグメント トランザクションの使用については、<a href="{@docRoot}training/basics/fragments/fragment-ui.html#Replace">フラグメントを使用したダイナミックな UI のビルド</a>を参照してください。 +</p> + + +<h2 id="details-presenter">詳細プレゼンターをビルドする</h2> + +<p> + Leanback ライブラリが提供するメディア ブラウジングのフレームワークでは、プレゼンター オブジェクトを使用して、メディア アイテムの詳細を含むスクリーン上のデータ表示を制御します。このメディア アイテムの詳細に関するプレゼンターのほぼ完全な実装を目的に、フレームワークでは{@link android.support.v17.leanback.widget.AbstractDetailsDescriptionPresenter} クラスを提供しています。これにより、次のコード サンプルのように、{@link android.support.v17.leanback.widget.AbstractDetailsDescriptionPresenter#onBindDescription onBindDescription()} メソッドを実装して、ビュー フィールドをデータ オブジェクトにバインドするだけでよくなります。 +</p> + +<pre> +public class DetailsDescriptionPresenter + extends AbstractDetailsDescriptionPresenter { + + @Override + protected void onBindDescription(ViewHolder viewHolder, Object itemData) { + MyMediaItemDetails details = (MyMediaItemDetails) itemData; + // In a production app, the itemData object contains the information + // needed to display details for the media item: + // viewHolder.getTitle().setText(details.getShortTitle()); + + // Here we provide static data for testing purposes: + viewHolder.getTitle().setText(itemData.toString()); + viewHolder.getSubtitle().setText("2014 Drama TV-14"); + viewHolder.getBody().setText("Lorem ipsum dolor sit amet, consectetur " + + "adipisicing elit, sed do eiusmod tempor incididunt ut labore " + + " et dolore magna aliqua. Ut enim ad minim veniam, quis " + + "nostrud exercitation ullamco laboris nisi ut aliquip ex ea " + + "commodo consequat."); + } +} +</pre> + + +<h2 id="details-fragment">詳細フラグメントを拡張する</h2> + +<p> + メディア アイテムの詳細を表示するために {@link android.support.v17.leanback.app.DetailsFragment} クラスを使用する場合、そのクラスを拡張すると、メディア アイテムのプレビュー画像やアクションなどの追加コンテンツを提供できます。関連するメディア アイテムのリストといった追加コンテンツも提供できます。 +</p> + +<p> + 次のコード例では、前のセクションで説明したプレゼンター クラスを使用して、表示中のメディア アイテムのプレビュー画像やアクションを追加する方法を示しています。この例では、詳細リストの下に表示される関連するメディア アイテムの行も追加しています。 +</p> + +<pre> +public class MediaItemDetailsFragment extends DetailsFragment { + private static final String TAG = "MediaItemDetailsFragment"; + private ArrayObjectAdapter mRowsAdapter; + + @Override + public void onCreate(Bundle savedInstanceState) { + Log.i(TAG, "onCreate"); + super.onCreate(savedInstanceState); + + buildDetails(); + } + + private void buildDetails() { + ClassPresenterSelector selector = new ClassPresenterSelector(); + // Attach your media item details presenter to the row presenter: + DetailsOverviewRowPresenter rowPresenter = + new DetailsOverviewRowPresenter(new DetailsDescriptionPresenter()); + + selector.addClassPresenter(DetailsOverviewRow.class, rowPresenter); + selector.addClassPresenter(ListRow.class, + new ListRowPresenter()); + mRowsAdapter = new ArrayObjectAdapter(selector); + + Resources res = getActivity().getResources(); + DetailsOverviewRow detailsOverview = new DetailsOverviewRow( + "Media Item Details"); + + // Add images and action buttons to the details view + detailsOverview.setImageDrawable(res.getDrawable(R.drawable.jelly_beans)); + detailsOverview.addAction(new Action(1, "Buy $9.99")); + detailsOverview.addAction(new Action(2, "Rent $2.99")); + mRowsAdapter.add(detailsOverview); + + // Add a Related items row + ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter( + new StringPresenter()); + listRowAdapter.add("Media Item 1"); + listRowAdapter.add("Media Item 2"); + listRowAdapter.add("Media Item 3"); + HeaderItem header = new HeaderItem(0, "Related Items", null); + mRowsAdapter.add(new ListRow(header, listRowAdapter)); + + setAdapter(mRowsAdapter); + } +} +</pre> + + +<h3 id="activity">詳細アクティビティを作成する</h3> + +<p> + {@link android.support.v17.leanback.app.DetailsFragment} のようなフラグメントを表示に使用するには、これをアクティビティ内に含める必要があります。ブラウズ アクティビティとは別に、詳細ビューのアクティビティを作成すると、{@link android.content.Intent} を使用して詳細ビューを呼び出すことができます。このセクションでは、メディア アイテムの詳細ビューの実装を含んだアクティビティのビルド方法を説明します。 +</p> + +<p> + 次のように {@link android.support.v17.leanback.app.DetailsFragment} の実装を参照するレイアウトをビルドして、詳細アクティビティの作成を開始します。 +</p> + +<pre> +<!-- file: res/layout/details.xml --> + +<fragment xmlns:android="http://schemas.android.com/apk/res/android" + <strong>android:name="com.example.android.mediabrowser.MediaItemDetailsFragment"</strong> + android:id="@+id/details_fragment" + android:layout_width="match_parent" + android:layout_height="match_parent" +/> +</pre> + +<p> + 次に、前述のコード例のレイアウトを使用して、アクティビティ クラスを作成します。 +</p> + +<pre> +public class DetailsActivity extends Activity +{ + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + <strong>setContentView(R.layout.details);</strong> + } +} +</pre> + +<p> + 最後に、この新しいアクティビティをマニフェストに追加します。次のように、ユーザー インターフェースがメディア ブラウズ アクティビティと一致するように、Leanback テーマを適用します。 +</p> + +<pre> +<application> + ... + + <activity android:name=".DetailsActivity" + android:exported="true" + <strong>android:theme="@style/Theme.Leanback"/></strong> + +</application> +</pre> + + +<h3 id="item-listener">クリックされたアイテムのリスナを定義する</h3> + +<p> + {@link android.support.v17.leanback.app.DetailsFragment} の実装後、メインのメディア ブラウジング ビューを編集して、ユーザーがメディア アイテムをクリックしたときに詳細ビューに移動するようにします。この動作を有効にするには、 {@link android.support.v17.leanback.widget.OnItemViewClickedListener} オブジェクトを、アイテム詳細アクティビティを起動するインテントの起動元の {@link android.support.v17.leanback.app.BrowseFragment} に追加します。 +</p> + +<p> + 次の例では、ユーザーがメインのメディア ブラウジング アクティビティのメディア アイテムをクリックしたときに、詳細ビューを起動するリスナの実装方法を示しています。 +</p> + +<pre> +public class BrowseMediaActivity extends Activity { + ... + + @Override + protected void onCreate(Bundle savedInstanceState) { + ... + + // create the media item rows + buildRowsAdapter(); + + // add a listener for selected items + mBrowseFragment.OnItemViewClickedListener( + new OnItemViewClickedListener() { + @Override + public void onItemClicked(Object item, Row row) { + System.out.println("Media Item clicked: " + item.toString()); + Intent intent = new Intent(BrowseMediaActivity.this, + DetailsActivity.class); + // pass the item information + intent.getExtras().putLong("id", item.getId()); + startActivity(intent); + } + }); + } +} +</pre> diff --git a/docs/html-intl/intl/ja/training/tv/playback/index.jd b/docs/html-intl/intl/ja/training/tv/playback/index.jd new file mode 100755 index 0000000..55d2b66 --- /dev/null +++ b/docs/html-intl/intl/ja/training/tv/playback/index.jd @@ -0,0 +1,42 @@ +page.title=TV 再生アプリのビルド +page.tags=tv, leanback + +startpage=true + +@jd:body + +<div id="tb-wrapper"> +<div id="tb"> + <h2>依存関係と前提条件</h2> + <ul> + <li>Android 5.0(API レベル 21)以降</li> + </ul> + <h2>関連コンテンツ</h2> + <ul> + <li><a href="{@docRoot}design/tv/index.html">TV 向けデザインとは</a></li> + </ul> +</div> +</div> + +<p> + メディア ファイルのブラウジングと再生は、TV アプリが提供するユーザー エクスペリエンスによって左右される部分が多くあります。ゼロから開始して、高速でなめらかな魅力あるユーザー エクスペリエンスを確実にビルドすることは、非常に困難な場合があります。アプリの露出するメディア カタログが、小規模か大規模かにかかわらず、ユーザーが簡単にオプションをブラウジングでき、希望のコンテンツに辿りつけるようにすることが重要です。 +</p> + +<p> + Android のフレームワークでは、<a href="{@docRoot}tools/support-library/features.html#v17-leanback">v17 leanback サポート ライブラリ</a>を使用して TV アプリのユーザー インターフェースをビルドするためのクラスを提供します。このライブラリは、最小限のコーディングで、メディア ファイルのブラウジングと再生用の効率的で親しみやすいインターフェースを作成するためのクラスのフレームワークを提供します。クラスは拡張やカスタマイズができるように設計されており、アプリ独自のユーザー エクスペリエンスを作成できます。 +</p> + +<p>このクラスでは、TV 向けの Leanback サポート ライブラリを使用して、メディア コンテンツブをラウジングしたり再生したりする TV アプリのビルド方法を説明します。</p> + +<h2>トピック</h2> + +<dl> + <dt><b><a href="browse.html">カタログ ブラウザを作成する</a></b></dt> + <dd>Leanback サポート ライブラリを使用して、メディア カタログのブラウジング インターフェースをビルドする方法を説明します。</dd> + + <dt><b><a href="details.html">詳細ビューをビルドする</a></b></dt> + <dd>Leanback サポート ライブラリを使用して、メディア アイテムの詳細ページをビルドする方法を説明します。</dd> + + <dt><b><a href="now-playing.html">再生中カードを表示する</a></b></dt> + <dd>MediaSession を使用して、「再生中」カードをホーム スクリーンに表示する方法を説明します。</dd> +</dl> diff --git a/docs/html-intl/intl/ja/training/tv/playback/now-playing.jd b/docs/html-intl/intl/ja/training/tv/playback/now-playing.jd new file mode 100755 index 0000000..0959204 --- /dev/null +++ b/docs/html-intl/intl/ja/training/tv/playback/now-playing.jd @@ -0,0 +1,134 @@ +page.title=再生中カードを表示する +page.tags=tv, mediasession + +trainingnavtop=true + +@jd:body + +<div id="tb-wrapper"> +<div id="tb"> + <h2>学習の目的</h2> + <ol> + <li><a href="#session">Media Session を起動する</a></li> + <li><a href="#card">再生中カードを表示する</a></li> + <li><a href="#state">再生ステータスをアップデートする</a></li> + <li><a href="#respond">ユーザー アクションを処理する</a></li> + </ol> + +</div> +</div> + +<p>TV アプリでは、ユーザーが他のアプリを使用中にバックグラウンドで音楽やその他のメディアを再生できる場合があります。このタイプのアプリの場合、アプリに戻って音楽を一時停止したり、新しい曲に切り替えたりする方法をユーザーに提供する必要があります。Android のフレームワークでは、ホーム スクリーン上の推奨する行に [<em>再生中</em>] カードを表示することで、 TV アプリで上記の操作を行えるようになります。</p> + +<p>[再生中] カードは、アクティブなメディア セッションのホーム スクリーンの推奨する行に表示されるシステム アーティファクトです。アルバム アート、タイトル、アプリのアイコンなど、メディアのメタデータが含まれます。ユーザーが選択すると、システムはセッション中のアプリを開きます。</p> + +<p>このレッスンでは、{@link android.media.session.MediaSession} クラスを使用して [再生中] カードを実装する方法を説明します。</p> + +<h2 id="session">Media Session を起動する</h2> + +<p>再生アプリは<a href="{@docRoot}guide/components/activities">アクティビティ</a>か<a href="{@docRoot}guide/components/services">サービス</a>として実行できます。サービスは、サービスを開始したアクティビティが破棄された後もメディアの再生を継続できるため、バックグラウンド再生時に必要となります。ここでは、メディア再生アプリが {@link android.service.media.MediaBrowserService} で実行されているものとします。</p> + +<p>ご使用中のサービスの{@link android.service.media.MediaBrowserService#onCreate() onCreate()}メソッドで、{@link android.media.session.MediaSession#MediaSession(android.content.Context, java.lang.String) MediaSession} を新規作成し、メディア アプリへの適切なコールバックとフラグを設定して、{@link android.service.media.MediaBrowserService} のセッション トークンを設定します。</p> + +<pre> +mSession = new MediaSession(this, "MusicService"); +mSession.setCallback(new MediaSessionCallback()); +mSession.setFlags(MediaSession.FLAG_HANDLES_MEDIA_BUTTONS | + MediaSession.FLAG_HANDLES_TRANSPORT_CONTROLS); + +// for the MediaBrowserService +setSessionToken(mSession.getSessionToken()); +</pre> + +<p class="note"><strong>注意:</strong>[再生中] カードは、{@link android.media.session.MediaSession#FLAG_HANDLES_TRANSPORT_CONTROLS} フラグが設定されたメディア セッションでのみ表示されます。</p> + +<h2 id="card">再生中カードを表示する</h2> + +<p>[再生中] カードは、セッションがシステム内で最も優先度の高い場合に、{@link android.media.session.MediaSession#setActive(boolean) setActive(true)} を呼び出した後に表示されます。また、<a href="{@docRoot}training/managing-audio/audio-focus">オーディオ フォーカスを管理する</a>で説明したように、アプリからオーディオ フォーカスをリクエストする必要があります。</p> + +<pre> +private void handlePlayRequest() { + + tryToGetAudioFocus(); + + if (!mSession.isActive()) { + mSession.setActive(true); + } +... +</pre> + +<p>{@link android.media.session.MediaSession#setActive(boolean) setActive(false)} の呼び出し時や別のアプリがメディアの再生を開始した場合に、カードはホーム スクリーンから削除されます。再生が一時停止された後、通常は 5~30 分間、カードを表示したままにして、その後カードをホーム スクリーンから削除することもできiます。</p> + +<h2 id="state">再生ステータスをアップデートする</h2> + +<p>どのメディア アプリの場合でも、次の例のように現在のメタデータを表示するよう、{@link android.media.session.MediaSession} で再生ステータスをアップデートするようにします。</p> + +<pre> +private void updatePlaybackState() { + long position = PlaybackState.PLAYBACK_POSITION_UNKNOWN; + if (mMediaPlayer != null && mMediaPlayer.isPlaying()) { + position = mMediaPlayer.getCurrentPosition(); + } + PlaybackState.Builder stateBuilder = new PlaybackState.Builder() + .setActions(getAvailableActions()); + stateBuilder.setState(mState, position, 1.0f); + mSession.setPlaybackState(stateBuilder.build()); +} +private long getAvailableActions() { + long actions = PlaybackState.ACTION_PLAY | + PlaybackState.ACTION_PLAY_FROM_MEDIA_ID | + PlaybackState.ACTION_PLAY_FROM_SEARCH; + if (mPlayingQueue == null || mPlayingQueue.isEmpty()) { + return actions; + } + if (mState == PlaybackState.STATE_PLAYING) { + actions |= PlaybackState.ACTION_PAUSE; + } + if (mCurrentIndexOnQueue > 0) { + actions |= PlaybackState.ACTION_SKIP_TO_PREVIOUS; + } + if (mCurrentIndexOnQueue < mPlayingQueue.size() - 1) { + actions |= PlaybackState.ACTION_SKIP_TO_NEXT; + } + return actions; +} +</pre> + +<h2 id="metadata">メディアのメタデータを表示する</h2> + +<p>トラックが現在再生中の場合は、{@link android.media.session.MediaSession#setMetadata(android.media.MediaMetadata) setMetadata()} メソッドを使用して{@link android.media.MediaMetadata} を設定します。メディア セッション オブジェクトのこのメソッドを使用すると、タイトル、サブタイトル、さまざまなアイコンなど、トラックに関する情報を [再生中] カードに表示することができます。次の例は、トラック データがカスタムデータ クラスの {@code MediaData} に格納されている場合です。</p> + +<pre> +private void updateMetadata(MediaData myData) { + MediaMetadata.Builder metadataBuilder = new MediaMetadata.Builder(); + // To provide most control over how an item is displayed set the + // display fields in the metadata + metadataBuilder.putString(MediaMetadata.METADATA_KEY_DISPLAY_TITLE, + myData.displayTitle); + metadataBuilder.putString(MediaMetadata.METADATA_KEY_DISPLAY_SUBTITLE, + myData.displaySubtitle); + metadataBuilder.putString(MediaMetadata.METADATA_KEY_DISPLAY_ICON_URI, + myData.artUri); + // And at minimum the title and artist for legacy support + metadataBuilder.putString(MediaMetadata.METADATA_KEY_TITLE, + myData.title); + metadataBuilder.putString(MediaMetadata.METADATA_KEY_ARTIST, + myData.artist); + // A small bitmap for the artwork is also recommended + metadataBuilder.putString(MediaMetadata.METADATA_KEY_ART, + myData.artBitmap); + // Add any other fields you have for your data as well + mSession.setMetadata(metadataBuilder.build()); +} +</pre> + +<h2 id="respond">ユーザー アクションを処理する</h2> + +<p>ユーザーが [再生中] カード選択すると、システムはセッション中のアプリを開きます。TV アプリが {@link android.app.PendingIntent} を{@link android.media.session.MediaSession#setSessionActivity(android.app.PendingIntent) setSessionActivity()}に渡した場合は、指定したアクティビティをシステムが次のように開始します。それ以外の場合は、デフォルトのシステム インテントが開きます。指定対象のアクティビティでは、ユーザーに再生の一時停止または停止(再生コントロール)機能を提供する必要があります。</p> + +<pre> +Intent intent = new Intent(mContext, MyActivity.class); + PendingIntent pi = PendingIntent.getActivity(context, 99 /*request code*/, + intent, PendingIntent.FLAG_UPDATE_CURRENT); + mSession.setSessionActivity(pi); +</pre> diff --git a/docs/html-intl/intl/ja/training/tv/start/hardware.jd b/docs/html-intl/intl/ja/training/tv/start/hardware.jd new file mode 100755 index 0000000..ccf20fa --- /dev/null +++ b/docs/html-intl/intl/ja/training/tv/start/hardware.jd @@ -0,0 +1,314 @@ +page.title= TV ハードウェアを処理する +page.tags=tv +trainingnavtop=true + +@jd:body + +<div id="tb-wrapper"> +<div id="tb"> + <h2>学習の目的</h2> + <ol> + <li><a href="#runtime-check">TV 端末をチェックする</a> + <li><a href="#handle-features">サポートされていないハードウェア機能を処理する</a></li> + <li><a href="#controllers">ハードウェア コントローラを管理する</a> + </li> + </ol> +</div> +</div> + +<p> + TV のハードウェアは、他の Android 端末とは大きく異なります。TV には、タッチスクリーン、カメラ、GPS 受信機など、他の Android 端末でよく使われるハードウェア機能がありません。そして TV は、2 次ハードウェア端末に完全に依存しています。つまり、ユーザーはリモコンやゲーム機のコントローラで TV アプリを操作する必要があります。TV アプリをビルドする際は、ハードウェア上の制限や TV 向けハードウェアの操作要件を慎重に考慮する必要があります。 +</p> + +<p> + このレッスンでは、TV でアプリが正常に動作するかどうかチェックする方法や、サポートされていないハードウェア機能を処理する方法、そして TV 端末用のコントローラを処理するための要件について説明します。 +</p> + + +<h2 id="runtime-check">TV 端末をチェックする</h2> + +<p> + TV 端末やその他の端末の両方で動作するアプリをビルドする場合、アプリが実行される端末の種類をチェックして、アプリの動作を調整する必要があります。たとえば、{@link android.content.Intent} を介して起動するアプリの場合、アクティビティをテレビ向けに起動するか、携帯電話向けに起動するかを判断するために、アプリ側で端末のプロパティをチェックする必要があります。 +</p> + +<p> + TV 端末でアプリが正常に動作するかどうかを判断するには、{@link android.app.UiModeManager#getCurrentModeType UiModeManager.getCurrentModeType()} メソッドを使用して、その端末がアプリの TV モードで正常に動作するかどうかをチェックすることをお勧めします。次のコード例では、TV 端末でアプリが正常に動作するかどうかチェックする方法を示します。 +</p> + +<pre> +public static final String TAG = "DeviceTypeRuntimeCheck"; + +UiModeManager uiModeManager = (UiModeManager) getSystemService(UI_MODE_SERVICE); +if (uiModeManager.getCurrentModeType() == Configuration.UI_MODE_TYPE_TELEVISION) { + Log.d(TAG, "Running on a TV Device") +} else { + Log.d(TAG, "Running on a non-TV Device") +} +</pre> + + +<h2 id="handle-features">サポートされていないハードウェア機能を処理する</h2> + +<p> + アプリのデザインと機能によっては、特定のハードウェア機能を利用できないという事態を回避できる場合があります。このセクションでは、一般的に TV で使用できないハードウェア機能や、それらを検出する方法、そしてそれらの機能の代替案について説明します。 +</p> + + +<h3 id="unsupported-features">サポートされていない TV ハードウェア機能</h3> + +<p> + TV には他の端末と異なる用途がありますので、他の Android 端末で提供されることの多いハードウェア機能がない場合があります。このため、Android システムは TV 端末では次の機能をサポートしていません。 +</p> + +<table> + <tr> + <th>ハードウェア</th> + <th>Android の Feature Descriptor</th> + </tr> + <tr> + <td>タッチスクリーン</td> + <td>{@code android.hardware.touchscreen}</td> + </tr> + <tr> + <td>電話</td> + <td>{@code android.hardware.telephony}</td> + </tr> + <tr> + <td>カメラ</td> + <td>{@code android.hardware.camera}</td> + </tr> + <tr> + <td>近距離無線通信(NFC)</td> + <td>{@code android.hardware.nfc}</td> + </tr> + <tr> + <td>GPS</td> + <td>{@code android.hardware.location.gps}</td> + </tr> + <tr> + <td>マイク</td> + <td>{@code android.hardware.microphone}</td> + </tr> +</table> + + +<h3 id="declare-hardware-requirements">TV のハードウェア要件を宣言する</h3> + +<p> + Android アプリでは、機能提供がない端末にインストールされてしまわないように、アプリのマニフェストでハードウェア機能の要件を宣言できます。TV 向けに既存のアプリを拡張している場合は、TV 端末へのインストールを阻害する可能性のあるハードウェア要件を宣言しているかどうかについて、アプリのマニフェストを詳細に見直す必要があります。 +</p> + +<p> + アプリでは TV で使用できないハードウェア機能(タッチスクリーンやカメラなど)を使用しているが、TV 向けにはそれらの機能がなくても構わない場合、アプリのマニフェストを編集して、それが不要な機能であることを示します。次のマニフェストのコード スニペットでは、TV 端末で使用できないハードウェア機能を(TV 以外の端末には提供する可能性がある場合でも)不要と宣言する方法を示します。 +</p> + +<pre> +<uses-feature android:name="android.hardware.touchscreen" + android:required="false"/> +<uses-feature android:name="android.hardware.telephony" + android:required="false"/> +<uses-feature android:name="android.hardware.camera" + android:required="false"/> +<uses-feature android:name="android.hardware.nfc" + android:required="false"/> +<uses-feature android:name="android.hardware.gps" + android:required="false"/> +<uses-feature android:name="android.hardware.microphone" + android:required="false"/> +</pre> + +<p> + なお、TV 端末向けのすべてのアプリは、<a href="{@docRoot}training/tv/start/start.html#no-touchscreen">TV アプリのビルドを開始する</a>で説明したように、タッチスクリーン機能が不要であることを宣言する必要があります。アプリで上記の機能を 1 つ以上使用している場合は、マニフェストで該当する機能の {@code android:required} 属性の設定を {@code false} に変更します。 +</p> + +<p class="caution"> + <strong>警告:</strong>この値を {@code true} に設定してハードウェア機能を必要と宣言すると、TV 端末にインストールされず、Android 版 TV のホーム スクリーン ランチャーにもアプリが表示されなくなります。 +</p> + +<p> + アプリのハードウェア機能をオプションにする場合は、実行時にこれらの機能が利用できるかをチェックしてから、アプリの動作を調整する必要があります。次のセクションでは、ハードウェア機能をチェックする方法と、アプリの動作を変更するためのいくつかのアプローチについて説明します。 +</p> + +<p> + マニフェスト内でのフィルタリングと機能の宣言については、<a href="{@docRoot}guide/topics/manifest/uses-feature-element.html">{@code uses-feature}</a>ガイドを参照してください。 +</p> + + +<h3 id="hardware-permissions">ハードウェア機能を暗示するパーミッションを宣言する</h3> + +<p> + <a href="{@docRoot}guide/topics/manifest/uses-permission-element.html">{@code uses-permission}</a> のマニフェストにおける宣言には、<em>ハードウェア機能を暗示する</em>ものがあります。これは、アプリのマニフェストでいくつかのパーミッションを要求すると、アプリが TV 端末にインストールされず、使用されなくなることを意味します。次の一般によく要求されるパーミッションにより、暗黙的なハードウェア機能の要件が作成されます。 +</p> + +<table> + <tr> + <th>パーミッション</th> + <th>暗黙的なハードウェア機能</th> + </tr> + <tr> + <td>{@link android.Manifest.permission#RECORD_AUDIO}</td> + <td>{@code android.hardware.microphone}</td> + </tr> + <tr> + <td>{@link android.Manifest.permission#CAMERA}</td> + <td>{@code android.hardware.camera} <em>と</em> <br/> {@code android.hardware.camera.autofocus}</td> + </tr> + <tr> + <td>{@link android.Manifest.permission#ACCESS_COARSE_LOCATION}</td> + <td>{@code android.hardware.location} <em>と</em> <br/> {@code android.hardware.location.network}</td> + </tr> + <tr> + <td>{@link android.Manifest.permission#ACCESS_FINE_LOCATION}</td> + <td>{@code android.hardware.location} <em>と</em> <br/> {@code android.hardware.location.gps}</td> + </tr> +</table> + +<p> + ハードウェア機能の要件を暗示するパーミッション要求を網羅したリストについては、<a href="{@docRoot}guide/topics/manifest/uses-feature-element.html#permissions-features">{@code uses-feature}</a>ガイドを参照してください。アプリが上記の機能のいずれかを要求する場合、暗示されたハードウェア機能についてマニフェストに <a href="{@docRoot}guide/topics/manifest/uses-feature-element.html">{@code uses-feature}</a> 宣言を含めて、不要であることを示します({@code android:required="false"})。 +</p> + + +<h3 id="check-features">ハードウェア機能をチェックする</h2> + +<p> + Android のフレームワークでは、アプリを実行している端末でハードウェア機能が使用できない場合を判別できます。{@link android.content.pm.PackageManager#hasSystemFeature(String)} メソッドを使用して、実行時に特定の機能をチェックできます。この場合、チェック対象の機能を指定する単一の文字列の引数を使用します。 +</p> + +<p>次のコード例では、アプリの実行時にハードウェア機能の利用可能性を検出する方法を示します。</p> + +<pre> +// Check if the telephony hardware feature is available. +if (getPackageManager().hasSystemFeature("android.hardware.telephony")) { + Log.d("HardwareFeatureTest", "Device can make phone calls"); +} + +// Check if android.hardware.touchscreen feature is available. +if (getPackageManager().hasSystemFeature("android.hardware.touchscreen")) { + Log.d("HardwareFeatureTest", "Device has a touch screen."); +} +</pre> + + +<h4 id="no-touchscreen">タッチスクリーン</h4> + +<p> + TV には通常タッチスクリーンがないので、Android は TV 端末向けにはタッチスクリーン操作をサポートしていません。そもそも、タッチスクリーン操作は、ユーザーが 10 フィート離れた場所から視聴するという TV 特有の使用環境にそぐわないものです。 +</p> + +<p> + TV 端末ではリモコンの矢印ボタンによるナビゲーションをサポートして、TV 特有のインタラクション モデルに適したアプリをデザインする必要があります。TV 向けのコントロールを使用してナビゲーションを適切にサポートする方法については、<a href="{@docRoot}training/tv/start/navigation.html">TV 用のナビゲーションを作成する</a>を参照してください。 +</p> + + +<h4 id="no-camera">カメラ</h4> + +<p> + TV にはカメラがないことが一般的ですが、カメラ関連アプリを提供することは可能です。たとえば、写真の撮影、表示、編集の機能があるアプリの場合、TV 向けに撮影機能を無効にながら、写真をの表示や編集は可能にすることができます。カメラ関連アプリをTV 向けにする場合、アプリのマニフェストには次の機能の宣言を追加します。 +</p> + +<pre> +<uses-feature android:name="android.hardware.camera" android:required="false" /> +</pre> + +<p> + カメラ機能を除いてアプリを動作させる場合、カメラ機能の存在を検出し、アプリの動作を調整するためのコードを追加します。次のコード例では、カメラ機能の存在を検出する方法を示します。 +</p> + +<pre> +// Check if the camera hardware feature is available. +if (getPackageManager().hasSystemFeature("android.hardware.camera")) { + Log.d("Camera test", "Camera available!"); +} else { + Log.d("Camera test", "No camera available. View and edit features only."); +} +</pre> + + +<h4 id="no-gps">GPS</h4> + +<p> + TV は据え付けタイプの室内用端末であり、全地球測位システム(GPS)の受信機を内蔵していません。アプリが位置情報を使用している場合、TV 端末のセットアップ時に郵便番号などの静的なロケーション プロバイダを構成して、ユーザーが位置を調べたり、それらを使用できるようにすることが可能です。 +</p> + +<pre> +// Request a static location from the location manager +LocationManager locationManager = (LocationManager) this.getSystemService( + Context.LOCATION_SERVICE); +Location location = locationManager.getLastKnownLocation("static"); + +// Attempt to get postal or zip code from the static location object +Geocoder geocoder = new Geocoder(this); +Address address = null; +try { + address = geocoder.getFromLocation(location.getLatitude(), + location.getLongitude(), 1).get(0); + Log.d("Zip code", address.getPostalCode()); + +} catch (IOException e) { + Log.e(TAG, "Geocoder error", e); +} +</pre> + + +<h2 id="controllers">コントローラを処理する</h2> + +<p> + TV 端末ではベーシックなタイプのリモコン、ゲーム機のコントローラといった、アプリを操作するための2 次ハードウェア端末が必要となります。これは、アプリで矢印ボタンによる入力をサポートする必要がある、ということです。そして、コントローラのオフライン操作と複数のタイプのコントローラによる入力を処理することも必要です。 +</p> + + +<h3 id="d-pad-minimum">矢印ボタンによる最小限のコントロール</h3> + +<p> + TV 端末のデフォルト コントローラはリモコン端末の矢印ボタンです。すなわち、上下、左右、[選択]、[戻る]、[ホーム] ボタンのみを使用して、アプリを操作できるようにする必要があります。ゲーム アプリの場合、通常は追加のコントロール機能のあるゲーム機のコントローラが必要ですが、TV ではリモコン端末の矢印ボタンでプレイできるようにする必要があります。この場合、コントローラが必要な旨をユーザーに警告した上で、リモコン端末の矢印ボタンでゲームを終了できるようにする必要があります。TV のリモコン端末の矢印ボタンによるナビゲーションを処理する方法については、<a href="{@docRoot}training/tv/start/navigation.html">TV 用のナビゲーションを作成する</a>を参照してください。 +</p> + + +<h3 id="controller-disconnects">コントローラの接続の切断を処理する</h3> + +<p> + TV 用コントローラは Bluetooth 端末であることが多く、定期的にスリープ モードに入って TV との接続を切断し、消費電力を節約しようとする場合があります。この場合、アプリ側で再接続イベントの処理を構成していないと、アプリが中断したり再起動する可能性が生じます。これらのイベントは、次のいずれかの場合に発生する可能性があります。 +</p> + +<ul> + <li>ビデオ(数分程度)を見ている間にリモコン端末かゲーム機のコントローラがスリープ モードになり、TV 端末との接続が失われ、その後再び接続される場合。 + </li> + <li>ゲームプレイ中に、新しいプレイヤーがオフライン状態のゲーム機のコントローラを使用してゲームに参加した場合。 + </li> + <li>ゲームプレイ中に、プレイヤーがゲームを中断し、ゲーム機のントローラとの接続が失われた場合。 + </li> +</ul> + +<p> + 接続の切断や再接続の対象となる TV アプリのアクティビティはすべて、アプリのマニフェストで再接続イベントを処理できるように構成する必要があります。次のコード サンプルでは、キーボードやナビゲーション端末の接続、切断、再接続などを含む構成の変更を処理するアクティビティの記述方法を示します。 +</p> + +<pre> +<activity + android:name="com.example.android.TvActivity" + android:label="@string/app_name" + <strong>android:configChanges="keyboard|keyboardHidden|navigation"</strong> + android:theme="@style/Theme.Leanback"> + + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.LEANBACK_LAUNCHER" /> + </intent-filter> + ... +</activity> +</pre> + +<p> + この構成の変更により、Android のフレームワークによる再起動(ユーザー エクスペリエンスの観点から望ましくない)ではなく、再接続イベントを介してアプリの中断を回避することが可能です。 +</p> + + +<h3 id="d-pad-variants">矢印ボタンによる入力のバリエーションを処理する</h3> + +<p> + TV 端末のユーザーは、複数のタイプのコントローラを使用して TV を操作する場合があります。たとえば、ベーシックなタイプのリモコンとゲーム機のコントローラを使用している場合があります。TV リモコンの矢印ボタンの機能をゲーム機のコントローラで実行する場合、送信されるキーコードはリモコン本体が送信するキーコードとは異なる場合があります。 +</p> + +<p> + ユーザーがアプリ操作のためにコントローラとリモコンを持ち替える必要がないよう、アプリでは、ゲーム機のコントローラからの矢印ボタンによる入力のバリエーションを処理する必要があります。入力のバリエーションの処理については、<a href="{@docRoot}training/game-controllers/controller-input.html#dpad">コントローラのアクションを処理する</a>を参照してください。 +</p> diff --git a/docs/html-intl/intl/ja/training/tv/start/index.jd b/docs/html-intl/intl/ja/training/tv/start/index.jd new file mode 100755 index 0000000..8f946a1 --- /dev/null +++ b/docs/html-intl/intl/ja/training/tv/start/index.jd @@ -0,0 +1,45 @@ +page.title=TV アプリのビルド +page.tags=tv, leanback +startpage=true + +@jd:body + +<div id="tb-wrapper"> +<div id="tb"> + <h2>依存関係と前提条件</h2> + <ul> + <li>Android 5.0(API レベル 21)以降</li> + <li>Android Studio 0.8 以降、Gradle 0.12 以降</li> + </ul> +</div> +</div> + +<p> + Android は、ハイビジョン TV などの大画面の端末で使用するアプリ向けに最適化された、表現力豊かなユーザー エクスペリエンスを実現します。TV で使用できるアプリによって、ユーザーは自宅のソファでくつろぎながらさまざまな操作を行えるようになります。 +</p> + +<p> + TV アプリでは、携帯電話やタブレット向けのものと同じ構造を使用します。つまり、Android アプリのビルドに関する既知の技術を使用して新たな TV アプリを作成したり、既存のアプリを TV 端末でも使用できるように拡張したりできます。ただし、TV ユーザーのインタラクション モデルは、携帯電話やタブレット端末とは大きく異なっています。TV 端末向けアプリがユーザーに受け入れられるには、10 フィート離れた場所からでも容易に識別できる新しいレイアウト デザインや、リモコンの矢印ボタンや選択ボタンだけで操作できるナビゲーションが必要です。 +</p> + +<p> + このクラスでは、開発環境のセットアップやレイアウトとナビゲーションに関する基本的な要件、TV 端末では通常使用できないハードウェア機能の処理方法に関するガイダンスなど、TV 向けアプリのビルドを開始する方法を説明します。 +</p> + +<p class="note"> + <strong>注意:</strong>TV アプリのビルドには、プロジェクトのセットアップ、ライブラリ インクルード、パッケージングの簡便性を備えた <a href="{@docRoot}sdk/installing/studio.html">Android Studio</a>の使用を推奨します。このトレーニングでは、Android Studio の使用を前提にしています。 +</p> + + +<h2>レッスン</h2> + +<dl> + <dt><a href="{@docRoot}training/tv/start/start.html">TV アプリのビルドを開始する</a></dt> + <dd>TV アプリ用に Android Studio プロジェクトを新規作成したり、TV 端末で使用できるように既存アプリのプロジェクトを編集したりする方法を説明します。</dd> + <dt><a href="{@docRoot}training/tv/start/layouts.html">TV 用のレイアウトをビルドする</a></dt> + <dd>TV 用のレイアウトに最低限必要な要件と、それらを実装する方法を説明します。</dd> + <dt><a href="{@docRoot}training/tv/start/navigation.html"> TV 用のナビゲーションを作成する</a></dt> + <dd>TV 用のナビゲーションに必要な要件と、TV と互換性のあるナビゲーションを実装する方法を説明します。</dd> + <dt><a href="{@docRoot}training/tv/start/hardware.html"> TV ハードウェアを処理する</a></dt> + <dd>作成したアプリの TV ハードウェアでの動作を確認したり、サポートされていないハードウェア機能を処理したり、コントローラ端末を管理したりする方法を説明します。</dd> +</dl> diff --git a/docs/html-intl/intl/ja/training/tv/start/layouts.jd b/docs/html-intl/intl/ja/training/tv/start/layouts.jd new file mode 100755 index 0000000..85193bf --- /dev/null +++ b/docs/html-intl/intl/ja/training/tv/start/layouts.jd @@ -0,0 +1,190 @@ +page.title=TV 向けレイアウトをビルドする +page.tags=tv +trainingnavtop=true + +@jd:body + +<div id="tb-wrapper"> +<div id="tb"> + <h2>学習の目的</h2> + <ol> + <li><a href="#themes">TV 向けのレイアウト テーマを使用する</a></li> + <li><a href="#structure">基本的な TV レイアウトをビルドする</a></li> + <li><a href="#visibility">使用可能なテキストとコントロールをビルドする</a></li> + <li><a href="#density-resources">TV のレイアウト リソースを管理する</a></li> + <li><a href="#anti-patterns">レイアウトのアンチパターンを回避する</a></li> + <li><a href="#large-bitmaps">大容量のビットマップを処理する</a></li> + </ol> + <h2>関連コンテンツ</h2> + <ol> + <li><a href="{@docRoot}design/tv/index.html">Android の TV 向けデザイン</a></li> + </ol> +</div> +</div> + +<p> + TV スクリーンは 10 フィートほど離れて見ることが通常であり、他の Android 端末のディスプレイよりもはるかに大きいことが多く、小型の端末と同レベルの精度と色を再現できません。便利で楽しいユーザー エクスペリエンスを作成する上で、これらの要素を配慮して TV 端末向けアプリのレイアウトを作成する必要があります。 +</p> + +<p> + このレッスンでは、TV アプリ用の効果的なレイアウトをビルドするための最低限の要件と実装の詳細を説明します。 +</p> + +<h2 id="themes">TV 向けのレイアウト テーマを使用する</h2> + +<p> + Android の<a href="{@docRoot}guide/topics/ui/themes.html">テーマ</a>は、TV アプリのレイアウトの基礎を提供しています。TV 端末上で動作するよう設計されたアプリのアクティビティに関しては、テーマを使用して表示を変更する必要があります。このセクションでは、どのテーマを使用したらよいかについて説明します。 +</p> + +<h3 id="leanback-theme">Leanback テーマ</h3> + +<p> + TV ユーザー インターフェースのサポート ライブラリである <a href="{@docRoot}tools/support-library/features.html#v17-leanback">v17 leanback ライブラリ</a> は、{@code Theme.Leanback} という TV アクティビティに関する標準的なテーマを提供しています。このテーマは、TV アプリに一貫性のある視覚的なスタイルを与えます。ほとんどの TV アプリにはこのテーマをお勧めします。このテーマは v17 leanback クラスを使用するすべての TV アプリに最適です。次のコード例では、アプリ内にあるアクティビティにこのテーマを適用する方法を示します。 +</p> + +<pre> +<activity + android:name="com.example.android.TvActivity" + android:label="@string/app_name" + <strong>android:theme="@style/Theme.Leanback"</strong>> +</pre> + + +<h3 id="notitle-theme">NoTitleBar テーマ</h3> + +<p> + タイトル バーは、携帯電話やタブレットの Android アプリにとっては標準的なユーザー インターフェース エレメントですが、TV アプリには適していません。v17 leanback クラスを使用していない場合は、TV アクティビティにこのテーマを適用してタイトル バーの表示を控える必要があります。TV アプリのマニフェストに関する次のコード例では、このテーマを適用してタイトル バーの表示を削除する方法を示します。 +</p> + +<pre> +<application> + ... + + <activity + android:name="com.example.android.TvActivity" + android:label="@string/app_name" + <strong>android:theme="@android:style/Theme.NoTitleBar"</strong>> + ... + + </activity> +</application> +</pre> + + +<h2 id="structure">基本的な TV レイアウトをビルドする</h2> + +<p>TV 端末用のレイアウトが、大きなスクリーンでも使いやすく効果的になるように、参考となるガイドラインがいくつかあります。次のヒントに従って、TV スクリーン用に最適化された横長のレイアウトをビルドします。 +</p> + +<ul> + <li>横向きでレイアウトをビルドします。TV スクリーンは常に横表示になります。</li> + <li>スクリーンの左か右にナビゲーション コントロールを配置して、垂直方向にコンテンツ用のスペースを確保します。</li> + <li><a href="{@docRoot}guide/components/fragments.html">フラグメント</a>を使用してセクションごとに分割された UI を作成し、水平方向のスペースをより有効に活用するために、{@link android.widget.GridView} のようなビュー グループを {@link android.widget.ListView} の代わりに使用します。 + </li> + <li>ビューの配置には、{@link android.widget.RelativeLayout} や {@link android.widget.LinearLayout} のようなビュー グループを使用します。これにより、システムで TV 画面のビューの位置を一定のサイズ、アラインメント、アスペクト比、画素密度に調整することができるようになります。</li> + <li>レイアウト コントロール間には十分なマージンを取り、UI が見やすくなるようにします。</li> +</ul> + + +<h3 id="overscan">オーバースキャン</h3> + +<p>TV 向けのレイアウトには、TV 規格の進化と、常に視聴者にフルスクリーン表示を提供したいという開発者側の意図に伴い、いくつかの特殊な要件があります。このため、TV 端末ではフルスクリーン表示の際にディスプレイ全体を埋められるように、アプリのレイアウト周囲がクリッピングされる場合があります。この動作を、一般に<em>オーバースキャン</em>と呼びます。 +</p> + +<p> + レイアウト周囲には 10%のマージンを与え、スクリーン エレメントがオーバースキャンによりクリッピングされないようにします。具体的には、アクティビティのベース レイアウトの左右には 27dp、上下には 48dp のマージンを設定します。次のレイアウト例では、TV アプリのルート レイアウト内でこれらのマージンを設定する方法を示します。 +</p> + +<pre> +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/base_layout" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical" + android:layout_marginTop="27dp" + android:layout_marginLeft="48dp" + android:layout_marginRight="48dp" + android:layout_marginBottom="27dp" > +</LinearLayout> +</pre> + +<p class="caution"> + <strong>警告:</strong>{@link android.support.v17.leanback.app.BrowseFragment} や関連ウィジェットなどの v17 leanback クラスを使用している場合、レイアウトには既にオーバースキャン用のマージンが設定されているため、重複して設定しないようにします。 +</p> + +<h2 id="visibility">使用可能なテキストとコントロールをビルドする</h2> + +<p> + TV アプリのレイアウト内のテキストやコントロールは、遠くからでも見やすく、操作内容を理解できるようにする必要があります。次のヒントに従って、遠くから見ても簡単に判別可能なユーザー インターフェース エレメントを作成します。 +</p> + +<ul> + <li>ユーザーが一目でわかる小さな単位にテキストを分割します。</li> + <li>暗い背景に対して明るい色のテキストを使用します。これにより、TV スクリーン上のテキストが読みやすくなります。</li> + <li>細いフォントや、狭すぎたり広すぎたりするストロークのフォントを使用しないようにします。シンプルなサンセリフ フォントやアンチ エイリアスを使用して、より読みやすくします。</li> + <li>次の Android の標準フォント サイズを使用します。 <pre> +<TextView + android:id="@+id/atext" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:gravity="center_vertical" + android:singleLine="true" + <strong>android:textAppearance="?android:attr/textAppearanceMedium"/></strong> +</pre> + </li> + <li>すべてのビュー ウィジェットが、スクリーン位置から 10 フィート(スクリーンが大きくなると、この距離は長くなります)離れていてもはっきりと見えるように十分な大きさを確保します。これには、絶対的なサイズではなく相対レイアウトによるサイジングを、絶対的なピクセル単位ではなく密度に依存しないピクセル(dip)単位を使用します。たとえば、ウィジェットの幅を設定するには画素測定ではなく {@code wrap_content} を、ウィジェットのマージンを設定するにはピクセル値ではなくディップ値を使用します。</li> +</ul> + +<p> + 密度に依存しないピクセルと、スクリーン サイズが大きな場合のレイアウトのビルドについては、<a href="{@docRoot}guide/practices/screens_support.html">複数のスクリーンをサポートする</a>を参照してください。 +</p> + +<h2 id="density-resources">TV のレイアウト リソースを管理する</h2> + +<p>一般的なハイビジョン TV ディスプレイの解像度は 720p、1080i、1080p です。TV のレイアウトが 1920×1080 ピクセルのスクリーン サイズになるようにして、Android のシステムが必要に応じてアプリのレイアウト エレメントを 720p にダウンスケールできるようにします。通常は、ダウンスケーリング(ピクセル削除)してもレイアウトのプレゼンテーション品質が低下することはありません。ただし、アップスケーリングはレイアウトの品質を劣化させ、アプリのユーザー エクスペリエンスに悪影響を与えるアーチファクトを引き起こす可能性があります。</p> + +<p> + 画像を最適な状態にスケーリングするには、可能であれば <a href="{@docRoot}tools/help/draw9patch.html">9patch 画像</a>のエレメントとして配置します。レイアウト内に低品質な画像や小さな画像を配置した場合、ピクセル化され、ぼやけた、粗い表示になり、ユーザー エクスペリエンスの低下につながります。それを避けるには、高品質の画像を使用します。 +</p> + +<p> + 大きなスクリーン向けのレイアウトやリソースの最適化については、<a href="{@docRoot}training/multiscreen/index.html">複数のスクリーンをデザインする</a>を参照してください。 +</p> + + +<h2 id="anti-patterns">レイアウトのアンチパターンを回避する</h2> + +<p> + TV 端末には不向きでユーザー エクスペリエンスの低下につながるため、レイアウトのビルドに際して避けたほうがよいアプローチがいくつかあります。ここでは、TV のレイアウト開発の際に特に使用し<em>ない</em>ほうがよい、ユーザー インターフェースに関するアプローチをいくつか説明します。 +</p> + +<ul> + <li><strong>携帯電話やタブレットのレイアウトの再利用</strong> 携帯電話やタブレット向けアプリのレイアウトをそのまま再利用しないようにします。他の Android 端末のフォーム ファクタ向けにビルドされたレイアウトは、TV 端末には不向きであり、TV 操作向けに簡略化する必要があります。</li> + <li><strong>ActionBar</strong> - このユーザー インターフェース規則は、携帯電話やタブレットでの使用は推奨できますが、TV のインターフェースには適していません。具体的には、TV リモコンではアクション バーのオプション メニュー(その他類似機能のプルダウン メニュー)をナビゲートすることが難しいため、使用しないことをお勧めします。</li> + <li><strong>ViewPager</strong> - スクリーン間のスライド操作は携帯電話やタブレット上では非常に有効ですが、TV では推奨できません。</li> +</ul> + +<p>TV に適したレイアウトのデザインについては、<a href="{@docRoot}design/tv/index.html">TV 向けデザイン</a>ガイドを参照してください。</p> + + +<h2 id="large-bitmaps">大容量のビットマップを処理する</h2> + +<p>他の Android 端末と同様に、TV 端末ではメモリ容量が限られています。超高解像度の画像を使用してアプリのレイアウトをビルドしたり、アプリの動作に多くの高解像度の画像を使用した場合、すぐにメモリの上限に達し、メモリ不足エラーが発生する可能性があります。次のヒントに従って、このタイプの問題を回避します。</p> + +<ul> + <li>スクリーン上に表示された場合にのみ画像をロードします。たとえば、{@link android.widget.GridView} や {@link android.widget.Gallery} で複数の画像を表示する場合、 {@link android.widget.Adapter#getView getView()} がビューの {@link android.widget.Adapter} で呼び出されたときのみ画像をロードします。 + </li> + <li>{@link android.graphics.Bitmap#recycle()} を、不要になった {@link android.graphics.Bitmap} ビューで呼び出します。 + </li> + <li> {@link java.lang.ref.WeakReference} を使用して、{@link android.graphics.Bitmap} オブジェクト(メモリ内の {@link java.util.Collection} にある)への参照を格納します。 + </li> + <li>ネットワークから画像を取得する場合は{@link android.os.AsyncTask} を使用して取得し、端末に格納すると、アクセスを高速化できます。アプリのメイン ユーザー インターフェースのスレッドで、ネットワーク トランザクションを実行しないでください。 + </li> + <li>ダウンロードの際は大きな画像をより適切なサイズにスケールダウンしてください。スケールダウンしない場合、メモリ不足により障害が発生する可能性があります。 + </li> +</ul> + +<p> + 画像処理の際に最高のパフォーマンスを得るには、<a href="{@docRoot}training/displaying-bitmaps/index.html">ビットマップを効率的に表示する</a>を参照してください。 +</p> diff --git a/docs/html-intl/intl/ja/training/tv/start/navigation.jd b/docs/html-intl/intl/ja/training/tv/start/navigation.jd new file mode 100755 index 0000000..e118702 --- /dev/null +++ b/docs/html-intl/intl/ja/training/tv/start/navigation.jd @@ -0,0 +1,144 @@ +page.title=TV 用のナビゲーションを作成する +page.tags=tv, d-pad, focus +trainingnavtop=true + +@jd:body + +<div id="tb-wrapper"> +<div id="tb"> + <h2>学習の目的</h2> + <ol> + <li><a href="#d-pad-navigation">矢印ボタンによるナビゲーションを有効にする</a></li> + <li><a href="#focus-selection">明確なフォーカスと選択を可能にする</a></li> + </ol> + +</div> +</div> + +<p> + TV 端末では、アプリのナビゲーション コントロールが限定されています。TV アプリ向けの効率的なナビゲーション スキームを作成できるかどうかは、これらの限定されたナビゲーション コントロールと、アプリを使用するユーザー側の認識の限界についての理解にかかっています。TV 向け Android アプリをビルドする際には、ユーザーがタッチ スクリーンではなく TV のリモコン ボタンを使用して実際にどのようにアプリをナビゲートするかについて、よく考慮する必要があります。 +</p> + +<p> + このレッスンでは、効率的な TV アプリのナビゲーション スキームを作成するための最小要件と、アプリにそれらの要件を適用する方法を説明します。 +</p> + + +<h2 id="d-pad-navigation">矢印ボタンによるナビゲーションを有効にする</h2> + +<p> + TV 端末では、ユーザーはリモコン端末の矢印ボタンを使用して、ナビゲーション操作を行います。この操作では、上、下、左、右方向への移動のみが可能です。TV 向けにこの上なく最適化されたアプリをビルドするには、このような限られたコントロールのみを使用して、ユーザーがアプリのナビゲーション方法を簡単に習得できるナビゲーション スキームを提供する必要があります。 +</p> + +<p> + Android のフレームワークでは、レイアウト エレメント間のナビゲーションを自動的に処理するため、通常は特に何もする必要はありません。ただし、ナビゲーション上の不備がないか、実際のリモコンの矢印ボタンで十分にテストする必要があります。次のガイドラインに従って、アプリのナビゲーション システムが、TV 端末のリモコンの矢印ボタンを使用した場合に正しく動作するかどうかをテストします。 +</p> + +<ul> + <li>ユーザーがリモコンの矢印ボタンを使って、スクリーン上のすべてのコントロールに移動できるか。 + </li> + <li>フォーカスを使用してリストをスクロールする際、リモコンの上下ボタンでリストをスクロールし、[選択] キーでリスト内の項目を選択できるか。ユーザーがリスト内のエレメントを選択でき、選択後もリストがスクロールするか。 + </li> + <li>コントロール間の切り替え操作がわかりやすく、予測可能であるか。 + </li> +</ul> + + +<h3 id="modify-d-pad-nav">矢印ボタンによるナビゲーションを編集する</h3> + +<p> + Android のフレームワークでは、レイアウト内にあるフォーカス可能なエレメントの相対位置に基づいて、矢印ボタンによるナビゲーション スキームを自動的に適用します。TV 端末のリモコンの矢印ボタンを使用して、アプリ内に生成されたナビゲーション スキームをテストする必要があります。テスト後に、ある特定の方法でユーザーがレイアウト内を移動できるようにしたい場合には、コントロールに関する矢印ボタンによるナビゲーションを明示的にセットアップできます。 +</p> + +<p class="note"> + <strong>注意:</strong>システムが適用したデフォルトの順序がうまく動作しない場合にのみ、これらの属性を使用してナビゲーション順序を変更します。 +</p> + +<p> + 次のコード サンプルでは、{@link android.widget.TextView} レイアウト オブジェクトで隣のコントロールがフォーカスを受け取るよう定義する方法を示します。 +</p> + +<pre> +<TextView android:id="@+id/Category1" + android:nextFocusDown="@+id/Category2"\> +</pre> + +<p> + 次の表では、Android ユーザー インターフェース ウィジェットで使用可能なナビゲーションの属性一覧を示します。 +</p> + +<table> + <tr> + <th>属性</th> + <th>機能</th> + </tr> + <tr> + <td>{@link android.R.attr#nextFocusDown}</td> + <td>ユーザーが下に移動したときにフォーカスを受け取る隣のビューを定義します。</td> + </tr> + <tr> + <td>{@link android.R.attr#nextFocusLeft}</td> + <td>ユーザーが左に移動したときにフォーカスを受け取る隣のビューを定義します。</td> + </tr> + <tr> + <td>{@link android.R.attr#nextFocusRight}</td> + <td>ユーザーが右に移動したときにフォーカスを受け取る隣のビューを定義します。</td> + </tr> + <tr> + <td>{@link android.R.attr#nextFocusUp}</td> + <td>ユーザーが上に移動したときにフォーカスを受け取る隣のビューを定義します。</td> + </tr> +</table> + +<p> + これらの明示的なナビゲーション属性のいずれかを使用するには、レイアウト内の別のウィジェットの ID ({@code android:id} 値)に対する値を設定します。最後のコントロールが最初のコントロールにフォーカスを戻すようにするには、ナビゲーションの順序をループとしてセットアップする必要があります。 +</p> + + + +<h2 id="focus-selection">明確なフォーカスと選択を可能にする</h2> + +<p> + TV 端末でアプリのナビゲーション スキームにとって重要なのは、スクリーン上のどのユーザー インターフェース エレメントにフォーカスがあるのかを、ユーザーが簡単に判別できるようにすることです。フォーカス状態のアイテムが明確でないと、ユーザーはどのアイテムに対してアクションが可能か判別できず、ストレスを感じてアプリを終了してしまうことになります。同じ理由で、アプリが起動直後やアイドル状態にある場合でも、ユーザーのアクションが可能なフォーカス状態のアイテムを常に配置しておく必要があります。 +</p> + +<p> + アプリのレイアウトと実装においては、色、サイズ、アニメーションや、これらの属性の組み合わせを使用して、ユーザーが次に可能なアクションを簡単に判別できるようにする必要があります。アプリ内では、一貫したスキームを使用してフォーカス状態を示すようにしてください。 +</p> + +<p> + Android は<a href="{@docRoot}guide/topics/resources/drawable-resource.html#StateList">ドローアブルとしての状態リスト リソース</a>を提供しており、フォーカス状態の、そして選択済みのコントロールにハイライトを実装できます。次のコード例では、ボタンの視覚的な動作を有効にして、ユーザーがそのコントロールにナビゲートし、選択したことを表示する方法を示します。 +</p> + +<pre> +<!-- res/drawable/button.xml --> +<?xml version="1.0" encoding="utf-8"?> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:state_pressed="true" + android:drawable="@drawable/button_pressed" /> <!-- pressed --> + <item android:state_focused="true" + android:drawable="@drawable/button_focused" /> <!-- focused --> + <item android:state_hovered="true" + android:drawable="@drawable/button_focused" /> <!-- hovered --> + <item android:drawable="@drawable/button_normal" /> <!-- default --> +</selector> +</pre> + +<p> + 次のレイアウトの XML サンプル コードは、{@link android.widget.Button} に対する 1 つ前の状態リスト ドローアブルにも該当します。 +</p> + +<pre> +<Button + android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:background="@drawable/button" /> +</pre> + +<p> + 周囲のハイライトがはっきりと見えるように、フォーカス可能で選択可能なコントロール内には十分なパディングを残してください。 +</p> + +<p> + TV アプリでの効率的な選択とフォーカスの設計に関する推奨事項については、<a href="{@docRoot}design/tv/patterns.html">TV のパターン</a>を参照してください。 +</p> diff --git a/docs/html-intl/intl/ja/training/tv/start/start.jd b/docs/html-intl/intl/ja/training/tv/start/start.jd new file mode 100755 index 0000000..bc99ff9 --- /dev/null +++ b/docs/html-intl/intl/ja/training/tv/start/start.jd @@ -0,0 +1,232 @@ +page.title=TV アプリのビルドを開始する +page.tags=tv, leanback, recyclerview + +trainingnavtop=true +startpage=true + +@jd:body + +<div id="tb-wrapper"> +<div id="tb"> + <h2>学習の目的</h2> + <ol> + <li><a href="#dev-project">TV プロジェクトをセットアップする</a></li> + <li><a href="#tv-libraries">TV サポート ライブラリを追加する</a></li> + <li><a href="#build-it">TV アプリをビルドする</a></li> + <li><a href="#run">TV アプリを実行する</a></li> + </ol> + <h2>関連コンテンツ</h2> + <ol> + <li><a href="{@docRoot}design/tv/index.html">TV 向けデザイン</a></li> + <li><a href="{@docRoot}training/tv/start/layouts.html">TV 用のレイアウトをビルドする</a></li> + </ol> +</div> +</div> + +<p> + TV アプリでは、携帯電話やタブレット向けのものと同じ構造を使用します。つまり、Android アプリのビルドに関する既知の技術を使用して新たな TV アプリを作成したり、既存のアプリを TV 端末でも使用できるように編集したりできます。 +</p> + +<p class="note"> + <strong>重要:</strong>Google Play で Android TV アプリを提供するには、特定の要件を満たす必要があります。詳細については、<a href="{@docRoot}distribute/essentials/quality/tv.html">TV アプリの品質</a>に記載されている要件を参照してください。 +</p> + +<p> + このレッスンでは、TV アプリのビルドの際の開発環境の準備方法と、TV 端末上でアプリを使用できるようにするために最低限必要な変更について説明します。 +</p> + + +<h2 id="dev-project">TV プロジェクトをセットアップする</h2> + +<p> + このセクションでは、TV 端末向けに既存のアプリを変更したり、新しく作成する方法について説明します。TV 端末向けアプリを作成する際に使用する必要がある主なコンポーネントは次のとおりです。 +</p> + +<ul> + <li><strong>TV 用のアクティビティ</strong>(必須) - アプリのマニフェストで、TV 端末上で動作させるアクティビティを宣言します。</li> + <li><strong>TV サポート ライブラリ</strong>(任意) - ユーザー インターフェースのビルド用にウィジェットを提供する、TV 端末向けの<a href="#tv-libraries">サポート ライブラリ</a>をいくつか利用できます。</li> +</ul> + + +<h3 id="prerequisites">前提条件</h3> + +<p>TV 向けアプリのビルドを開始するには:</p> + +<ul> + <li><strong><a href="{@docRoot}sdk/installing/adding-packages.html#GetTools">SDK ツールをバージョン 24.0.0 以降にアップデートする</a></strong> + <br/> SDK ツールをアップデートすると、TV 向けアプリのビルドとテストができるようになります。 + </li> + <li><strong><a href="{@docRoot}sdk/installing/adding-packages.html#GetTools">SDK ツールを Android 5.0(API レベル 21)以降を使用してアップデートする</a></strong> + <br/> アップデート後のプラットフォームのバージョンでは、TV アプリ向けの新しい API を提供しています。 + </li> + <li><strong><a href="{@docRoot}sdk/installing/create-project.html">アプリのプロジェクトを作成またはアップデートする</a></strong> + <br/> TV 端末用の新しい API にアクセスするには、プロジェクトを作成するか、Android 5.0(API レベル 21)以降をターゲットとする既存のプロジェクトを変更する必要があります。 + </li> +</ul> + + +<h3 id="tv-activity">TV アクティビティを宣言する</h3> + +<p>TV 端末向けアプリでは、{@link android.content.Intent#CATEGORY_LEANBACK_LAUNCHER} のインテント フィルタを使用して、アプリのマニフェストで TV 用ランチャーのアクティビティを宣言する必要があります。このフィルタは、アプリが TV 向けになっていることを判別しますので、Google Play 内で TV アプリと認識される上で必要です。この宣言は、ユーザーが TV のホーム スクリーンでアプリのアイコンを選択したときに、アプリ内のどのアクティビティが起動するかについても判別します。</p> + +<p>次のコード スニペットでは、マニフェストにインテント フィルタを含める方法を示します。</p> + +<pre> +<application + android:banner="@drawable/banner" > + ... + <activity + android:name="com.example.android.MainActivity" + android:label="@string/app_name" > + + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + </activity> + + <activity + android:name="com.example.android.<strong>TvActivity</strong>" + android:label="@string/app_name" + android:theme="@style/Theme.Leanback"> + + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="<strong>android.intent.category.LEANBACK_LAUNCHER</strong>" /> + </intent-filter> + + </activity> +</application> +</pre> + +<p> + この例では、2 番目のアクティビティのマニフェスト エントリが、TV 端末で起動するアクティビティを指定しています。 +</p> + +<p class="caution"> + <strong>警告:</strong>アプリに {@link android.content.Intent#CATEGORY_LEANBACK_LAUNCHER} インテント フィルタを含めない場合、TV 端末で Google Play ストアを開いているユーザーにアプリが表示されません。開発者ツールを使用して TV 端末にロードする際にこのフィルタがない場合も、TV のユーザー にはアプリインターフェースが表示されません。 +</p> + +<p> + TV 向け用途で既存のアプリを変更する場合は、携帯電話やタブレットと同じアクティビティのレイアウトを使用しないでください。TV アプリや既存のアプリの TV 向け部分については、ソファでくつろぎながら TV リモコンを使用して、簡単にナビゲートできるシンプルなユーザー インターフェースを提供する必要があります。TV 向けアプリをデザインする際のガイドラインについては、<a href="{@docRoot}design/tv/index.html">TV 向けデザイン</a>ガイドを参照してください。TV のインターフェースのレイアウトに関する最低限の実装要件については<a href="{@docRoot}training/tv/start/layouts.html">TV 用のレイアウトをビルドする</a>を参照してください。 +</p> + + +<h3 id="no-touchscreen">タッチスクリーンの不要を宣言する</h3> + +<p> + TV 端末向けアプリでは、入力はタッチスクリーンに依存しません 。これを明確にするために、TV アプリのマニフェストで {@code android.hardware.touchscreen} 機能が不要であることを宣言する必要があります。この設定により、アプリが TV 端末向けであると判別しますので、Google Play 内で TV アプリと認識される上で必要です。次のコード例では、マニフェストに宣言を含める方法を示します。 +</p> + +<pre> +<manifest> + <strong><uses-feature android:name="android.hardware.touchscreen" + android:required="false" /></strong> + ... +</manifest> +</pre> + +<p class="caution"> + <strong>警告:</strong>このコード例のようにアプリのマニフェストでタッチスクリーンが不要であると宣言しないと、アプリが TV 端末の Google Play ストアに表示されません。 +</p> + +<h3 id="banner">ホーム スクリーンにバナーを配置する</h3> + +<p> + アプリに Leanback ランチャーのインテント フィルタが含まれている場合は、ホーム スクリーンにバナーを配置する必要があります。バナーは、アプリやゲームの行のホーム スクリーン上に表示されるアプリの起動ポイントです。次のようにマニフェストにバナーを記述します。 +</p> + +<pre> +<application + ... + android:banner="@drawable/banner" > + + ... +</application> +</pre> + +<p> + <a href="{@docRoot}guide/topics/manifest/application-element.html#banner">{@code android:banner}</a> 属性を使用して、<a href="{@docRoot}guide/topics/manifest/application.html"><code><application></code></a> タグとともにアプリのすべてのアクティビティにデフォルトのバナーを配置するか、<a href="{@docRoot}guide/topics/manifest/activity-element.html"><code><activity></code></a> タグとともに特定のアクティビティにバナーを配置します。 +</p> + +<p> + TV 向けデザインの UI パターンガイドの<a href="{@docRoot}design/tv/patterns.html#banner">バナー</a>を参照してください。 +</p> + +<h2 id="tv-libraries">TV サポート ライブラリを追加する</h3> + +<p> + Android SDK には、TV アプリ向けのサポート ライブラリが用意されています。これらのライブラリでは、TV 端末向けに使用できる API とユーザー インターフェース ウィジェットを提供しています。同ライブラリは {@code <sdk>/extras/android/support/} ディレクトリにあります。ライブラリとその全般的な用途の一覧を次に示します。 +</p> + +<ul> + <li><a href="{@docRoot}tools/support-library/features.html#v17-leanback"> <strong>v17 leanback ライブラリ</strong></a> - 特にメディア再生用のアプリ向けに、TV アプリのユーザー インターフェース ウィジェットを提供します。 + </li> + <li><a href="{@docRoot}tools/support-library/features.html#v7-recyclerview"> <strong>v7 recyclerview ライブラリ</strong></a> - メモリ効率に配慮した方法で、項目の多いリストの表示を管理するためのクラスを提供します。 v17 leanback ライブラリ内のクラスの一部は、このライブラリ内のクラスに依存します。 + </li> + <li><a href="{@docRoot}tools/support-library/features.html#v7-cardview"> <strong>v7 cardview ライブラリ</strong></a> - メディア アイテムの画像や説明などの情報カードを表示するためのユーザー インターフェース ウィジェットを提供します。 + </li> +</ul> + +<p class="note"> + <strong>注意:</strong>これらのサポート ライブラリは TV アプリに必須ではありませんが、特にメディア カタログのブラウジング インターフェースを提供するアプリについては使用することを強くお勧めします。 +</p> + +<p> + v17 leanback ライブラリを使用する場合、<a href="{@docRoot}tools/support-library/features.html#v4">v4 サポート ライブラリ</a> に依存していることに注意してください。つまり、leanback ライブラリを使用するアプリには、次のサポート ライブラリをすべて含める必要があります。 +</p> + +<ul> + <li>v4 サポート ライブラリ</li> + <li>v7 recyclerview サポート ライブラリ</li> + <li>v17 leanback サポート ライブラリ</li> +</ul> + +<p> + v17 leanback ライブラリには、アプリのプロジェクトに含める際に、特定の手順を踏む必要があるリソースが含まれています。リソースを使用してサポート ライブラリをインポートする手順については、<a href="{@docRoot}tools/support-library/setup.html#libs-with-res">サポート ライブラリのセットアップ</a>を参照してください。 +</p> + + +<h2 id="build-it">TV アプリをビルドする</h2> + +<p>上記の手順を完了したら、TV 向けアプリのビルドに取りかかりましょう。TV アプリのビルドに役立つ次の補足的なトピックに目を通してください。 <ul> + <li> + <a href="{@docRoot}training/tv/playback/index.html">TV 再生アプリのビルド</a> - TV は娯楽用途に特化されていますので、Android では、ユーザーがビデオや音楽を再生したり、必要なコンテンツをブラウズできたりする TV アプリのビルド向けに、ユーザー インターフェース ツールとウィジェット一式を提供しています。 + </li> + <li> + <a href="{@docRoot}training/tv/search/index.html">TV でのコンテンツの露出</a> - ユーザーがすべてのコンテンツを見ながら、お目当てのコンテンツを探し出せるようにすることは、コンテンツ自体の提供と同程度に重要です。このトレーニングでは、TV 端末上にコンテンツを露出させる方法について説明します。 + </li> + <li> + <a href="{@docRoot}training/tv/games/index.html">TV 向けゲーム</a> - TV 端末は、ゲームに非常に適したプラットフォームです。TV 向けの優れたゲーム エクスペリエンスのビルド方法については、このトピックを参照してください。 + </li> +</ul> + + +<h2 id="run">TV アプリを実行する</h2> + +<p> + アプリの実行は、開発プロセスの重要な一部です。Android SDK の AVD Manager では端末定義を提供しており、アプリの実行やテスト用の仮想 TV 端末を作成することができます。 +</p> + +<p>仮想 TV 端末を作成するには:</p> + +<ol> + <li>AVD Manager を起動します。詳細については、<a href="{@docRoot}tools/help/avd-manager.html">AVD Manager</a> のヘルプを参照してください。</li> + <li>[AVD Manager] ダイアログで [<strong>端末定義</strong>] タブをクリックします。</li> + <li>Android の TV 端末定義を選択し、[<strong>AVD の作成</strong>] をクリックします。</li> + <li>エミュレータのオプションを選択して、[<strong>OK</strong>] をクリックして AVD を作成します。 <p class="note"> + <strong>注意:</strong>TV 用のエミュレータ端末で最高のパフォーマンスを得るには、[<strong>ホスト GPU を使用</strong>] オプションを有効にし、サポートされている場合には、仮想端末のアクセラレーションを使用します。エミュレータのハードウェア アクセラレーションについては、<a href="{@docRoot}tools/devices/emulator.html#acceleration">エミュレータを使用する</a>を参照してください。 + </p> + </li> +</ol> + +<p>仮想 TV 端末上でアプリをテストするには:</p> + +<ol> + <li>自分の開発環境に TV アプリをコンパイルします。</li> + <li>自分の開発環境からアプリを実行し、ターゲットの TV 仮想端末を選択します。</li> +</ol> + +<p> + エミュレータの使用方法については、<a href="{@docRoot}tools/devices/emulator.html">エミュレータを使用する</a>を参照してください。Android Studio から仮想端末へのアプリのデプロイについては、<a href="{@docRoot}sdk/installing/studio-debug.html">Android Studio を使用してデバッグする</a>を参照してください。ADT を使用した Eclipse からエミュレータへのアプリのデプロイについては、<a href="{@docRoot}tools/building/building-eclipse.html">Eclipse から ADT を使用してビルド、実行する</a>を参照してください。 +</p> |