From 827cc88a338967fe778fe96bfaec80091da0f6cd Mon Sep 17 00:00:00 2001 From: David Friedman Date: Fri, 19 Dec 2014 16:28:17 -0800 Subject: Android TV initial (time-sensitive) localization release for Japanese partners. Bug: 18527238 Change-Id: Id933695738a07aa0a1c02783e022dd8b98bbf98e --- .../intl/ja/training/tv/playback/browse.jd | 194 +++++++++++++ .../intl/ja/training/tv/playback/details.jd | 210 ++++++++++++++ .../intl/ja/training/tv/playback/index.jd | 42 +++ .../intl/ja/training/tv/playback/now-playing.jd | 134 +++++++++ .../intl/ja/training/tv/start/hardware.jd | 314 +++++++++++++++++++++ docs/html-intl/intl/ja/training/tv/start/index.jd | 45 +++ .../html-intl/intl/ja/training/tv/start/layouts.jd | 190 +++++++++++++ .../intl/ja/training/tv/start/navigation.jd | 144 ++++++++++ docs/html-intl/intl/ja/training/tv/start/start.jd | 232 +++++++++++++++ 9 files changed, 1505 insertions(+) create mode 100755 docs/html-intl/intl/ja/training/tv/playback/browse.jd create mode 100755 docs/html-intl/intl/ja/training/tv/playback/details.jd create mode 100755 docs/html-intl/intl/ja/training/tv/playback/index.jd create mode 100755 docs/html-intl/intl/ja/training/tv/playback/now-playing.jd create mode 100755 docs/html-intl/intl/ja/training/tv/start/hardware.jd create mode 100755 docs/html-intl/intl/ja/training/tv/start/index.jd create mode 100755 docs/html-intl/intl/ja/training/tv/start/layouts.jd create mode 100755 docs/html-intl/intl/ja/training/tv/start/navigation.jd create mode 100755 docs/html-intl/intl/ja/training/tv/start/start.jd (limited to 'docs/html-intl/intl') 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 + +
+ +
+ +

+ TV で使用するメディア アプリでは、ユーザーがコンテンツ内容をブラウズして選び、再生を開始できるようにする必要があります。このタイプのアプリのコンテンツ ブラウジングに関するユーザー エクスペリエンスは、シンプルで直感的、そして目を楽しませる魅力的なものである必要があります。 +

+ +

+ このレッスンでは、v17 leanback サポート ライブラリ が提供するクラスを使用して、アプリのメディア カタログから音楽やビデオを閲覧するためのユーザー インターフェースを実装する方法を説明します。 +

+ + +

メディア ブラウズ レイアウトを作成する

+ +

+ leanback サポート ライブラリの {@link android.support.v17.leanback.app.BrowseFragment} クラスを使用すると、最小限のコードでブラウジング カテゴリのプライマリ レイアウトとメディア アイテムの行を作成できます。次の例では、{@link android.support.v17.leanback.app.BrowseFragment} を含むレイアウトの作成方法を示します。 +

+ +
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+  android:layout_width="match_parent"
+  android:layout_height="match_parent"
+  android:orientation="vertical"
+  >
+
+  <fragment
+      android:name="android.support.v17.leanback.app.BrowseFragment"
+      android:id="@+id/browse_fragment"
+      android:layout_width="match_parent"
+      android:layout_height="match_parent"
+      />
+</LinearLayout>
+
+ +

+ アクティビティ内でこのレイアウトを使用して作業するには、レイアウトから{@link android.support.v17.leanback.app.BrowseFragment} エレメントを取得します。このクラスのメソッドを使用して、アイコン、タイトル、カテゴリ ヘッダーが有効になっているかどうかなどの表示パラメータを設定します。次のコード サンプルでは、レイアウト内で {@link android.support.v17.leanback.app.BrowseFragment} のレイアウト パラメータの設定方法を示します。 +

+ +
+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();
+        mBrowseFragment = (BrowseFragment) fragmentManager.findFragmentById(
+                R.id.browse_fragment);
+
+        // 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);
+
+    }
+}
+
+ + +

メディア リストを表示する

+ +

+ {@link android.support.v17.leanback.app.BrowseFragment} ではアダプタとプレゼンターを使用して、ブラウズ可能なメディア コンテンツのカテゴリや、メディア カタログのメディア アイテムを定義したり、表示したりできます。アダプタを使用すると、メディア カタログ情報が含まれているローカルやオンラインのデータ ソースに接続できます。プレゼンターは、メディア アイテムに関するデータを保持し、スクリーンにアイテムを表示する際のレイアウト情報を提供します。 +

+ +

+ 次のコード例では、文字列データを表示する際の{@link android.support.v17.leanback.widget.Presenter} の実装について示します。 +

+ +
+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
+    }
+}
+
+ +

+ メディア アイテムのプレゼンター クラスを構築したら、アダプタをビルドしたり、{@link android.support.v17.leanback.app.BrowseFragment} にアタッチしたりして、ユーザーのブラウジング用にスクリーン上にそれらのアイテムを表示させることができます。次のコード例では、1 つ前のコード例に示したように、{@code StringPresenter} クラスを使用して、カテゴリ内にカテゴリとアイテムを表示するためのアダプタの構築方法を示します。 +

+ +
+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);
+}
+
+ +

+ この例では、アダプタの静的実装を示します。一般的なメディア ブラウジング アプリは、オンライン データベースやウェブ サービスのデータを使用します。ウェブから取得したデータを使用したブラウジング アプリの例については、Android TV のサンプル アプリを参照してください。 +

+ +

背景をアップデートする

+ +

+ TV で使用されるメディア ブラウジング アプリを目立たせるために、ユーザーがコンテンツをブラウジングしている間の背景イメージをアップデートできます。これにより、アプリの使用がユーザーにとって、より動きのある楽しいものになります。 +

+ +

+ Leanback サポート ライブラリは、TV アプリのアクティビティの背景を変更するための {@link android.support.v17.leanback.app.BackgroundManager} クラスを提供しています。次の例では、TV アプリのアクティビティ内の背景をアップデートする簡単なメソッドの作成方法を示します。 +

+ +
+protected void updateBackground(Drawable drawable) {
+    BackgroundManager.getInstance(this).setDrawable(drawable);
+}
+
+ +

+ ほとんどの既存のメディア ブラウズ アプリでは、ユーザーがメディア リストをスクロールするのに合わせて自動的に背景がアップデートされます。これを行うには選択リスナを設定して、ユーザーの現在の選択に基づいて自動的に背景をアップデートできるようにします。次の例では、{@link android.support.v17.leanback.widget.OnItemViewSelectedListener} クラスをセットアップして、選択イベントの判別後に背景をアップデートする方法を示します。 +

+ +
+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();
+            }
+        }
+    };
+}
+
+ +

+ 注意:上記の実装例はわかりやすく示すため、実際よりも単純化されています。実際にアプリでこの機能を作成する際は、パフォーマンス向上のために、別のスレッドで背景のアップデート アクションを実行するようにしてください。また、ユーザーがアイテムをスクロールする動作に合わせて背景をアップデートする場合には、ユーザーが 1 つのアイテムに落ち着くまで、背景イメージのアップデートを遅らせる時間を追加することも検討してください。これにより、背景イメージのアップデートが過剰にならないようにします。 +

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 + +
+ +
+ +

+ v17 leanback サポート ライブラリ が提供するメディア ブラウジング インターフェース クラスには、説明やレビューなどのメディア アイテムに関する追加情報を表示したり、アイテムの購入やコンテンツの再生など、アイテムに対するアクションを取ったりするためのクラスが含まれます。 +

+ +

+ このレッスンでは、メディア アイテムの詳細に関するプレゼンター クラスを作成したり、{@link android.support.v17.leanback.app.DetailsFragment} クラスを拡張して、ユーザーがメディア アイテムを選択した場合に表示する詳細ビューを実装したりする方法を説明します。 +

+ +

+ 注意:次の実装例では、追加的なアクティビティを使用して {@link android.support.v17.leanback.app.DetailsFragment} を含めています。ただし、フラグメント トランザクションを使用すると、現在の {@link android.support.v17.leanback.app.BrowseFragment} を同じアクティビティにある {@link android.support.v17.leanback.app.DetailsFragment} で置き換えることにより、2 つ目のアクティビティの作成を回避できます。フラグメント トランザクションの使用については、フラグメントを使用したダイナミックな UI のビルドを参照してください。 +

+ + +

詳細プレゼンターをビルドする

+ +

+ Leanback ライブラリが提供するメディア ブラウジングのフレームワークでは、プレゼンター オブジェクトを使用して、メディア アイテムの詳細を含むスクリーン上のデータ表示を制御します。このメディア アイテムの詳細に関するプレゼンターのほぼ完全な実装を目的に、フレームワークでは{@link android.support.v17.leanback.widget.AbstractDetailsDescriptionPresenter} クラスを提供しています。これにより、次のコード サンプルのように、{@link android.support.v17.leanback.widget.AbstractDetailsDescriptionPresenter#onBindDescription onBindDescription()} メソッドを実装して、ビュー フィールドをデータ オブジェクトにバインドするだけでよくなります。 +

+ +
+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.");
+    }
+}
+
+ + +

詳細フラグメントを拡張する

+ +

+ メディア アイテムの詳細を表示するために {@link android.support.v17.leanback.app.DetailsFragment} クラスを使用する場合、そのクラスを拡張すると、メディア アイテムのプレビュー画像やアクションなどの追加コンテンツを提供できます。関連するメディア アイテムのリストといった追加コンテンツも提供できます。 +

+ +

+ 次のコード例では、前のセクションで説明したプレゼンター クラスを使用して、表示中のメディア アイテムのプレビュー画像やアクションを追加する方法を示しています。この例では、詳細リストの下に表示される関連するメディア アイテムの行も追加しています。 +

+ +
+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);
+    }
+}
+
+ + +

詳細アクティビティを作成する

+ +

+ {@link android.support.v17.leanback.app.DetailsFragment} のようなフラグメントを表示に使用するには、これをアクティビティ内に含める必要があります。ブラウズ アクティビティとは別に、詳細ビューのアクティビティを作成すると、{@link android.content.Intent} を使用して詳細ビューを呼び出すことができます。このセクションでは、メディア アイテムの詳細ビューの実装を含んだアクティビティのビルド方法を説明します。 +

+ +

+ 次のように {@link android.support.v17.leanback.app.DetailsFragment} の実装を参照するレイアウトをビルドして、詳細アクティビティの作成を開始します。 +

+ +
+<!-- file: res/layout/details.xml -->
+
+<fragment xmlns:android="http://schemas.android.com/apk/res/android"
+    android:name="com.example.android.mediabrowser.MediaItemDetailsFragment"
+    android:id="@+id/details_fragment"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+/>
+
+ +

+ 次に、前述のコード例のレイアウトを使用して、アクティビティ クラスを作成します。 +

+ +
+public class DetailsActivity extends Activity
+{
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.details);
+    }
+}
+
+ +

+ 最後に、この新しいアクティビティをマニフェストに追加します。次のように、ユーザー インターフェースがメディア ブラウズ アクティビティと一致するように、Leanback テーマを適用します。 +

+ +
+<application>
+  ...
+
+  <activity android:name=".DetailsActivity"
+    android:exported="true"
+    android:theme="@style/Theme.Leanback"/>
+
+</application>
+
+ + +

クリックされたアイテムのリスナを定義する

+ +

+ {@link android.support.v17.leanback.app.DetailsFragment} の実装後、メインのメディア ブラウジング ビューを編集して、ユーザーがメディア アイテムをクリックしたときに詳細ビューに移動するようにします。この動作を有効にするには、 {@link android.support.v17.leanback.widget.OnItemViewClickedListener} オブジェクトを、アイテム詳細アクティビティを起動するインテントの起動元の {@link android.support.v17.leanback.app.BrowseFragment} に追加します。 +

+ +

+ 次の例では、ユーザーがメインのメディア ブラウジング アクティビティのメディア アイテムをクリックしたときに、詳細ビューを起動するリスナの実装方法を示しています。 +

+ +
+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);
+                }
+            });
+    }
+}
+
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 + +
+
+

依存関係と前提条件

+
    +
  • Android 5.0(API レベル 21)以降
  • +
+

関連コンテンツ

+ +
+
+ +

+ メディア ファイルのブラウジングと再生は、TV アプリが提供するユーザー エクスペリエンスによって左右される部分が多くあります。ゼロから開始して、高速でなめらかな魅力あるユーザー エクスペリエンスを確実にビルドすることは、非常に困難な場合があります。アプリの露出するメディア カタログが、小規模か大規模かにかかわらず、ユーザーが簡単にオプションをブラウジングでき、希望のコンテンツに辿りつけるようにすることが重要です。 +

+ +

+ Android のフレームワークでは、v17 leanback サポート ライブラリを使用して TV アプリのユーザー インターフェースをビルドするためのクラスを提供します。このライブラリは、最小限のコーディングで、メディア ファイルのブラウジングと再生用の効率的で親しみやすいインターフェースを作成するためのクラスのフレームワークを提供します。クラスは拡張やカスタマイズができるように設計されており、アプリ独自のユーザー エクスペリエンスを作成できます。 +

+ +

このクラスでは、TV 向けの Leanback サポート ライブラリを使用して、メディア コンテンツブをラウジングしたり再生したりする TV アプリのビルド方法を説明します。

+ +

トピック

+ +
+
カタログ ブラウザを作成する
+
Leanback サポート ライブラリを使用して、メディア カタログのブラウジング インターフェースをビルドする方法を説明します。
+ +
詳細ビューをビルドする
+
Leanback サポート ライブラリを使用して、メディア アイテムの詳細ページをビルドする方法を説明します。
+ +
再生中カードを表示する
+
MediaSession を使用して、「再生中」カードをホーム スクリーンに表示する方法を説明します。
+
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 + +
+ +
+ +

TV アプリでは、ユーザーが他のアプリを使用中にバックグラウンドで音楽やその他のメディアを再生できる場合があります。このタイプのアプリの場合、アプリに戻って音楽を一時停止したり、新しい曲に切り替えたりする方法をユーザーに提供する必要があります。Android のフレームワークでは、ホーム スクリーン上の推奨する行に [再生中] カードを表示することで、 TV アプリで上記の操作を行えるようになります。

+ +

[再生中] カードは、アクティブなメディア セッションのホーム スクリーンの推奨する行に表示されるシステム アーティファクトです。アルバム アート、タイトル、アプリのアイコンなど、メディアのメタデータが含まれます。ユーザーが選択すると、システムはセッション中のアプリを開きます。

+ +

このレッスンでは、{@link android.media.session.MediaSession} クラスを使用して [再生中] カードを実装する方法を説明します。

+ +

Media Session を起動する

+ +

再生アプリはアクティビティサービスとして実行できます。サービスは、サービスを開始したアクティビティが破棄された後もメディアの再生を継続できるため、バックグラウンド再生時に必要となります。ここでは、メディア再生アプリが {@link android.service.media.MediaBrowserService} で実行されているものとします。

+ +

ご使用中のサービスの{@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} のセッション トークンを設定します。

+ +
+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());
+
+ +

注意:[再生中] カードは、{@link android.media.session.MediaSession#FLAG_HANDLES_TRANSPORT_CONTROLS} フラグが設定されたメディア セッションでのみ表示されます。

+ +

再生中カードを表示する

+ +

[再生中] カードは、セッションがシステム内で最も優先度の高い場合に、{@link android.media.session.MediaSession#setActive(boolean) setActive(true)} を呼び出した後に表示されます。また、オーディオ フォーカスを管理するで説明したように、アプリからオーディオ フォーカスをリクエストする必要があります。

+ +
+private void handlePlayRequest() {
+
+    tryToGetAudioFocus();
+
+    if (!mSession.isActive()) {
+        mSession.setActive(true);
+    }
+...
+
+ +

{@link android.media.session.MediaSession#setActive(boolean) setActive(false)} の呼び出し時や別のアプリがメディアの再生を開始した場合に、カードはホーム スクリーンから削除されます。再生が一時停止された後、通常は 5~30 分間、カードを表示したままにして、その後カードをホーム スクリーンから削除することもできiます。

+ +

再生ステータスをアップデートする

+ +

どのメディア アプリの場合でも、次の例のように現在のメタデータを表示するよう、{@link android.media.session.MediaSession} で再生ステータスをアップデートするようにします。

+ +
+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;
+}
+
+ +

メディアのメタデータを表示する

+ +

トラックが現在再生中の場合は、{@link android.media.session.MediaSession#setMetadata(android.media.MediaMetadata) setMetadata()} メソッドを使用して{@link android.media.MediaMetadata} を設定します。メディア セッション オブジェクトのこのメソッドを使用すると、タイトル、サブタイトル、さまざまなアイコンなど、トラックに関する情報を [再生中] カードに表示することができます。次の例は、トラック データがカスタムデータ クラスの {@code MediaData} に格納されている場合です。

+ +
+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());
+}
+
+ +

ユーザー アクションを処理する

+ +

ユーザーが [再生中] カード選択すると、システムはセッション中のアプリを開きます。TV アプリが {@link android.app.PendingIntent} を{@link android.media.session.MediaSession#setSessionActivity(android.app.PendingIntent) setSessionActivity()}に渡した場合は、指定したアクティビティをシステムが次のように開始します。それ以外の場合は、デフォルトのシステム インテントが開きます。指定対象のアクティビティでは、ユーザーに再生の一時停止または停止(再生コントロール)機能を提供する必要があります。

+ +
+Intent intent = new Intent(mContext, MyActivity.class);
+    PendingIntent pi = PendingIntent.getActivity(context, 99 /*request code*/,
+            intent, PendingIntent.FLAG_UPDATE_CURRENT);
+    mSession.setSessionActivity(pi);
+
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 + +
+ +
+ +

+ TV のハードウェアは、他の Android 端末とは大きく異なります。TV には、タッチスクリーン、カメラ、GPS 受信機など、他の Android 端末でよく使われるハードウェア機能がありません。そして TV は、2 次ハードウェア端末に完全に依存しています。つまり、ユーザーはリモコンやゲーム機のコントローラで TV アプリを操作する必要があります。TV アプリをビルドする際は、ハードウェア上の制限や TV 向けハードウェアの操作要件を慎重に考慮する必要があります。 +

+ +

+ このレッスンでは、TV でアプリが正常に動作するかどうかチェックする方法や、サポートされていないハードウェア機能を処理する方法、そして TV 端末用のコントローラを処理するための要件について説明します。 +

+ + +

TV 端末をチェックする

+ +

+ TV 端末やその他の端末の両方で動作するアプリをビルドする場合、アプリが実行される端末の種類をチェックして、アプリの動作を調整する必要があります。たとえば、{@link android.content.Intent} を介して起動するアプリの場合、アクティビティをテレビ向けに起動するか、携帯電話向けに起動するかを判断するために、アプリ側で端末のプロパティをチェックする必要があります。 +

+ +

+ TV 端末でアプリが正常に動作するかどうかを判断するには、{@link android.app.UiModeManager#getCurrentModeType UiModeManager.getCurrentModeType()} メソッドを使用して、その端末がアプリの TV モードで正常に動作するかどうかをチェックすることをお勧めします。次のコード例では、TV 端末でアプリが正常に動作するかどうかチェックする方法を示します。 +

+ +
+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")
+}
+
+ + +

サポートされていないハードウェア機能を処理する

+ +

+ アプリのデザインと機能によっては、特定のハードウェア機能を利用できないという事態を回避できる場合があります。このセクションでは、一般的に TV で使用できないハードウェア機能や、それらを検出する方法、そしてそれらの機能の代替案について説明します。 +

+ + +

サポートされていない TV ハードウェア機能

+ +

+ TV には他の端末と異なる用途がありますので、他の Android 端末で提供されることの多いハードウェア機能がない場合があります。このため、Android システムは TV 端末では次の機能をサポートしていません。 +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ハードウェアAndroid の Feature Descriptor
タッチスクリーン{@code android.hardware.touchscreen}
電話{@code android.hardware.telephony}
カメラ{@code android.hardware.camera}
近距離無線通信(NFC){@code android.hardware.nfc}
GPS{@code android.hardware.location.gps}
マイク{@code android.hardware.microphone}
+ + +

TV のハードウェア要件を宣言する

+ +

+ Android アプリでは、機能提供がない端末にインストールされてしまわないように、アプリのマニフェストでハードウェア機能の要件を宣言できます。TV 向けに既存のアプリを拡張している場合は、TV 端末へのインストールを阻害する可能性のあるハードウェア要件を宣言しているかどうかについて、アプリのマニフェストを詳細に見直す必要があります。 +

+ +

+ アプリでは TV で使用できないハードウェア機能(タッチスクリーンやカメラなど)を使用しているが、TV 向けにはそれらの機能がなくても構わない場合、アプリのマニフェストを編集して、それが不要な機能であることを示します。次のマニフェストのコード スニペットでは、TV 端末で使用できないハードウェア機能を(TV 以外の端末には提供する可能性がある場合でも)不要と宣言する方法を示します。 +

+ +
+<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"/>
+
+ +

+ なお、TV 端末向けのすべてのアプリは、TV アプリのビルドを開始するで説明したように、タッチスクリーン機能が不要であることを宣言する必要があります。アプリで上記の機能を 1 つ以上使用している場合は、マニフェストで該当する機能の {@code android:required} 属性の設定を {@code false} に変更します。 +

+ +

+ 警告:この値を {@code true} に設定してハードウェア機能を必要と宣言すると、TV 端末にインストールされず、Android 版 TV のホーム スクリーン ランチャーにもアプリが表示されなくなります。 +

+ +

+ アプリのハードウェア機能をオプションにする場合は、実行時にこれらの機能が利用できるかをチェックしてから、アプリの動作を調整する必要があります。次のセクションでは、ハードウェア機能をチェックする方法と、アプリの動作を変更するためのいくつかのアプローチについて説明します。 +

+ +

+ マニフェスト内でのフィルタリングと機能の宣言については、{@code uses-feature}ガイドを参照してください。 +

+ + +

ハードウェア機能を暗示するパーミッションを宣言する

+ +

+ {@code uses-permission} のマニフェストにおける宣言には、ハードウェア機能を暗示するものがあります。これは、アプリのマニフェストでいくつかのパーミッションを要求すると、アプリが TV 端末にインストールされず、使用されなくなることを意味します。次の一般によく要求されるパーミッションにより、暗黙的なハードウェア機能の要件が作成されます。 +

+ + + + + + + + + + + + + + + + + + + + + + +
パーミッション暗黙的なハードウェア機能
{@link android.Manifest.permission#RECORD_AUDIO}{@code android.hardware.microphone}
{@link android.Manifest.permission#CAMERA}{@code android.hardware.camera}
{@code android.hardware.camera.autofocus}
{@link android.Manifest.permission#ACCESS_COARSE_LOCATION}{@code android.hardware.location}
{@code android.hardware.location.network}
{@link android.Manifest.permission#ACCESS_FINE_LOCATION}{@code android.hardware.location}
{@code android.hardware.location.gps}
+ +

+ ハードウェア機能の要件を暗示するパーミッション要求を網羅したリストについては、{@code uses-feature}ガイドを参照してください。アプリが上記の機能のいずれかを要求する場合、暗示されたハードウェア機能についてマニフェストに {@code uses-feature} 宣言を含めて、不要であることを示します({@code android:required="false"})。 +

+ + +

ハードウェア機能をチェックする

+ +

+ Android のフレームワークでは、アプリを実行している端末でハードウェア機能が使用できない場合を判別できます。{@link android.content.pm.PackageManager#hasSystemFeature(String)} メソッドを使用して、実行時に特定の機能をチェックできます。この場合、チェック対象の機能を指定する単一の文字列の引数を使用します。 +

+ +

次のコード例では、アプリの実行時にハードウェア機能の利用可能性を検出する方法を示します。

+ +
+// 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.");
+}
+
+ + +

タッチスクリーン

+ +

+ TV には通常タッチスクリーンがないので、Android は TV 端末向けにはタッチスクリーン操作をサポートしていません。そもそも、タッチスクリーン操作は、ユーザーが 10 フィート離れた場所から視聴するという TV 特有の使用環境にそぐわないものです。 +

+ +

+ TV 端末ではリモコンの矢印ボタンによるナビゲーションをサポートして、TV 特有のインタラクション モデルに適したアプリをデザインする必要があります。TV 向けのコントロールを使用してナビゲーションを適切にサポートする方法については、TV 用のナビゲーションを作成するを参照してください。 +

+ + +

カメラ

+ +

+ TV にはカメラがないことが一般的ですが、カメラ関連アプリを提供することは可能です。たとえば、写真の撮影、表示、編集の機能があるアプリの場合、TV 向けに撮影機能を無効にながら、写真をの表示や編集は可能にすることができます。カメラ関連アプリをTV 向けにする場合、アプリのマニフェストには次の機能の宣言を追加します。 +

+ +
+<uses-feature android:name="android.hardware.camera" android:required="false" />
+
+ +

+ カメラ機能を除いてアプリを動作させる場合、カメラ機能の存在を検出し、アプリの動作を調整するためのコードを追加します。次のコード例では、カメラ機能の存在を検出する方法を示します。 +

+ +
+// 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.");
+}
+
+ + +

GPS

+ +

+ TV は据え付けタイプの室内用端末であり、全地球測位システム(GPS)の受信機を内蔵していません。アプリが位置情報を使用している場合、TV 端末のセットアップ時に郵便番号などの静的なロケーション プロバイダを構成して、ユーザーが位置を調べたり、それらを使用できるようにすることが可能です。 +

+ +
+// 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);
+}
+
+ + +

コントローラを処理する

+ +

+ TV 端末ではベーシックなタイプのリモコン、ゲーム機のコントローラといった、アプリを操作するための2 次ハードウェア端末が必要となります。これは、アプリで矢印ボタンによる入力をサポートする必要がある、ということです。そして、コントローラのオフライン操作と複数のタイプのコントローラによる入力を処理することも必要です。 +

+ + +

矢印ボタンによる最小限のコントロール

+ +

+ TV 端末のデフォルト コントローラはリモコン端末の矢印ボタンです。すなわち、上下、左右、[選択]、[戻る]、[ホーム] ボタンのみを使用して、アプリを操作できるようにする必要があります。ゲーム アプリの場合、通常は追加のコントロール機能のあるゲーム機のコントローラが必要ですが、TV ではリモコン端末の矢印ボタンでプレイできるようにする必要があります。この場合、コントローラが必要な旨をユーザーに警告した上で、リモコン端末の矢印ボタンでゲームを終了できるようにする必要があります。TV のリモコン端末の矢印ボタンによるナビゲーションを処理する方法については、TV 用のナビゲーションを作成するを参照してください。 +

+ + +

コントローラの接続の切断を処理する

+ +

+ TV 用コントローラは Bluetooth 端末であることが多く、定期的にスリープ モードに入って TV との接続を切断し、消費電力を節約しようとする場合があります。この場合、アプリ側で再接続イベントの処理を構成していないと、アプリが中断したり再起動する可能性が生じます。これらのイベントは、次のいずれかの場合に発生する可能性があります。 +

+ + + +

+ 接続の切断や再接続の対象となる TV アプリのアクティビティはすべて、アプリのマニフェストで再接続イベントを処理できるように構成する必要があります。次のコード サンプルでは、キーボードやナビゲーション端末の接続、切断、再接続などを含む構成の変更を処理するアクティビティの記述方法を示します。 +

+ +
+<activity
+  android:name="com.example.android.TvActivity"
+  android:label="@string/app_name"
+  android:configChanges="keyboard|keyboardHidden|navigation"
+  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>
+
+ +

+ この構成の変更により、Android のフレームワークによる再起動(ユーザー エクスペリエンスの観点から望ましくない)ではなく、再接続イベントを介してアプリの中断を回避することが可能です。 +

+ + +

矢印ボタンによる入力のバリエーションを処理する

+ +

+ TV 端末のユーザーは、複数のタイプのコントローラを使用して TV を操作する場合があります。たとえば、ベーシックなタイプのリモコンとゲーム機のコントローラを使用している場合があります。TV リモコンの矢印ボタンの機能をゲーム機のコントローラで実行する場合、送信されるキーコードはリモコン本体が送信するキーコードとは異なる場合があります。 +

+ +

+ ユーザーがアプリ操作のためにコントローラとリモコンを持ち替える必要がないよう、アプリでは、ゲーム機のコントローラからの矢印ボタンによる入力のバリエーションを処理する必要があります。入力のバリエーションの処理については、コントローラのアクションを処理するを参照してください。 +

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 + +
+
+

依存関係と前提条件

+
    +
  • Android 5.0(API レベル 21)以降
  • +
  • Android Studio 0.8 以降、Gradle 0.12 以降
  • +
+
+
+ +

+ Android は、ハイビジョン TV などの大画面の端末で使用するアプリ向けに最適化された、表現力豊かなユーザー エクスペリエンスを実現します。TV で使用できるアプリによって、ユーザーは自宅のソファでくつろぎながらさまざまな操作を行えるようになります。 +

+ +

+ TV アプリでは、携帯電話やタブレット向けのものと同じ構造を使用します。つまり、Android アプリのビルドに関する既知の技術を使用して新たな TV アプリを作成したり、既存のアプリを TV 端末でも使用できるように拡張したりできます。ただし、TV ユーザーのインタラクション モデルは、携帯電話やタブレット端末とは大きく異なっています。TV 端末向けアプリがユーザーに受け入れられるには、10 フィート離れた場所からでも容易に識別できる新しいレイアウト デザインや、リモコンの矢印ボタンや選択ボタンだけで操作できるナビゲーションが必要です。 +

+ +

+ このクラスでは、開発環境のセットアップやレイアウトとナビゲーションに関する基本的な要件、TV 端末では通常使用できないハードウェア機能の処理方法に関するガイダンスなど、TV 向けアプリのビルドを開始する方法を説明します。 +

+ +

+ 注意:TV アプリのビルドには、プロジェクトのセットアップ、ライブラリ インクルード、パッケージングの簡便性を備えた Android Studioの使用を推奨します。このトレーニングでは、Android Studio の使用を前提にしています。 +

+ + +

レッスン

+ +
+
TV アプリのビルドを開始する
+
TV アプリ用に Android Studio プロジェクトを新規作成したり、TV 端末で使用できるように既存アプリのプロジェクトを編集したりする方法を説明します。
+
TV 用のレイアウトをビルドする
+
TV 用のレイアウトに最低限必要な要件と、それらを実装する方法を説明します。
+
TV 用のナビゲーションを作成する
+
TV 用のナビゲーションに必要な要件と、TV と互換性のあるナビゲーションを実装する方法を説明します。
+
TV ハードウェアを処理する
+
作成したアプリの TV ハードウェアでの動作を確認したり、サポートされていないハードウェア機能を処理したり、コントローラ端末を管理したりする方法を説明します。
+
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 + +
+ +
+ +

+ TV スクリーンは 10 フィートほど離れて見ることが通常であり、他の Android 端末のディスプレイよりもはるかに大きいことが多く、小型の端末と同レベルの精度と色を再現できません。便利で楽しいユーザー エクスペリエンスを作成する上で、これらの要素を配慮して TV 端末向けアプリのレイアウトを作成する必要があります。 +

+ +

+ このレッスンでは、TV アプリ用の効果的なレイアウトをビルドするための最低限の要件と実装の詳細を説明します。 +

+ +

TV 向けのレイアウト テーマを使用する

+ +

+ Android のテーマは、TV アプリのレイアウトの基礎を提供しています。TV 端末上で動作するよう設計されたアプリのアクティビティに関しては、テーマを使用して表示を変更する必要があります。このセクションでは、どのテーマを使用したらよいかについて説明します。 +

+ +

Leanback テーマ

+ +

+ TV ユーザー インターフェースのサポート ライブラリである v17 leanback ライブラリ は、{@code Theme.Leanback} という TV アクティビティに関する標準的なテーマを提供しています。このテーマは、TV アプリに一貫性のある視覚的なスタイルを与えます。ほとんどの TV アプリにはこのテーマをお勧めします。このテーマは v17 leanback クラスを使用するすべての TV アプリに最適です。次のコード例では、アプリ内にあるアクティビティにこのテーマを適用する方法を示します。 +

+ +
+<activity
+  android:name="com.example.android.TvActivity"
+  android:label="@string/app_name"
+  android:theme="@style/Theme.Leanback">
+
+ + +

NoTitleBar テーマ

+ +

+ タイトル バーは、携帯電話やタブレットの Android アプリにとっては標準的なユーザー インターフェース エレメントですが、TV アプリには適していません。v17 leanback クラスを使用していない場合は、TV アクティビティにこのテーマを適用してタイトル バーの表示を控える必要があります。TV アプリのマニフェストに関する次のコード例では、このテーマを適用してタイトル バーの表示を削除する方法を示します。 +

+ +
+<application>
+  ...
+
+  <activity
+    android:name="com.example.android.TvActivity"
+    android:label="@string/app_name"
+    android:theme="@android:style/Theme.NoTitleBar">
+    ...
+
+  </activity>
+</application>
+
+ + +

基本的な TV レイアウトをビルドする

+ +

TV 端末用のレイアウトが、大きなスクリーンでも使いやすく効果的になるように、参考となるガイドラインがいくつかあります。次のヒントに従って、TV スクリーン用に最適化された横長のレイアウトをビルドします。 +

+ + + + +

オーバースキャン

+ +

TV 向けのレイアウトには、TV 規格の進化と、常に視聴者にフルスクリーン表示を提供したいという開発者側の意図に伴い、いくつかの特殊な要件があります。このため、TV 端末ではフルスクリーン表示の際にディスプレイ全体を埋められるように、アプリのレイアウト周囲がクリッピングされる場合があります。この動作を、一般にオーバースキャンと呼びます。 +

+ +

+ レイアウト周囲には 10%のマージンを与え、スクリーン エレメントがオーバースキャンによりクリッピングされないようにします。具体的には、アクティビティのベース レイアウトの左右には 27dp、上下には 48dp のマージンを設定します。次のレイアウト例では、TV アプリのルート レイアウト内でこれらのマージンを設定する方法を示します。 +

+ +
+<?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>
+
+ +

+ 警告:{@link android.support.v17.leanback.app.BrowseFragment} や関連ウィジェットなどの v17 leanback クラスを使用している場合、レイアウトには既にオーバースキャン用のマージンが設定されているため、重複して設定しないようにします。 +

+ +

使用可能なテキストとコントロールをビルドする

+ +

+ TV アプリのレイアウト内のテキストやコントロールは、遠くからでも見やすく、操作内容を理解できるようにする必要があります。次のヒントに従って、遠くから見ても簡単に判別可能なユーザー インターフェース エレメントを作成します。 +

+ + + +

+ 密度に依存しないピクセルと、スクリーン サイズが大きな場合のレイアウトのビルドについては、複数のスクリーンをサポートするを参照してください。 +

+ +

TV のレイアウト リソースを管理する

+ +

一般的なハイビジョン TV ディスプレイの解像度は 720p、1080i、1080p です。TV のレイアウトが 1920×1080 ピクセルのスクリーン サイズになるようにして、Android のシステムが必要に応じてアプリのレイアウト エレメントを 720p にダウンスケールできるようにします。通常は、ダウンスケーリング(ピクセル削除)してもレイアウトのプレゼンテーション品質が低下することはありません。ただし、アップスケーリングはレイアウトの品質を劣化させ、アプリのユーザー エクスペリエンスに悪影響を与えるアーチファクトを引き起こす可能性があります。

+ +

+ 画像を最適な状態にスケーリングするには、可能であれば 9patch 画像のエレメントとして配置します。レイアウト内に低品質な画像や小さな画像を配置した場合、ピクセル化され、ぼやけた、粗い表示になり、ユーザー エクスペリエンスの低下につながります。それを避けるには、高品質の画像を使用します。 +

+ +

+ 大きなスクリーン向けのレイアウトやリソースの最適化については、複数のスクリーンをデザインするを参照してください。 +

+ + +

レイアウトのアンチパターンを回避する

+ +

+ TV 端末には不向きでユーザー エクスペリエンスの低下につながるため、レイアウトのビルドに際して避けたほうがよいアプローチがいくつかあります。ここでは、TV のレイアウト開発の際に特に使用しないほうがよい、ユーザー インターフェースに関するアプローチをいくつか説明します。 +

+ + + +

TV に適したレイアウトのデザインについては、TV 向けデザインガイドを参照してください。

+ + +

大容量のビットマップを処理する

+ +

他の Android 端末と同様に、TV 端末ではメモリ容量が限られています。超高解像度の画像を使用してアプリのレイアウトをビルドしたり、アプリの動作に多くの高解像度の画像を使用した場合、すぐにメモリの上限に達し、メモリ不足エラーが発生する可能性があります。次のヒントに従って、このタイプの問題を回避します。

+ + + +

+ 画像処理の際に最高のパフォーマンスを得るには、ビットマップを効率的に表示するを参照してください。 +

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 + +
+ +
+ +

+ TV 端末では、アプリのナビゲーション コントロールが限定されています。TV アプリ向けの効率的なナビゲーション スキームを作成できるかどうかは、これらの限定されたナビゲーション コントロールと、アプリを使用するユーザー側の認識の限界についての理解にかかっています。TV 向け Android アプリをビルドする際には、ユーザーがタッチ スクリーンではなく TV のリモコン ボタンを使用して実際にどのようにアプリをナビゲートするかについて、よく考慮する必要があります。 +

+ +

+ このレッスンでは、効率的な TV アプリのナビゲーション スキームを作成するための最小要件と、アプリにそれらの要件を適用する方法を説明します。 +

+ + +

矢印ボタンによるナビゲーションを有効にする

+ +

+ TV 端末では、ユーザーはリモコン端末の矢印ボタンを使用して、ナビゲーション操作を行います。この操作では、上、下、左、右方向への移動のみが可能です。TV 向けにこの上なく最適化されたアプリをビルドするには、このような限られたコントロールのみを使用して、ユーザーがアプリのナビゲーション方法を簡単に習得できるナビゲーション スキームを提供する必要があります。 +

+ +

+ Android のフレームワークでは、レイアウト エレメント間のナビゲーションを自動的に処理するため、通常は特に何もする必要はありません。ただし、ナビゲーション上の不備がないか、実際のリモコンの矢印ボタンで十分にテストする必要があります。次のガイドラインに従って、アプリのナビゲーション システムが、TV 端末のリモコンの矢印ボタンを使用した場合に正しく動作するかどうかをテストします。 +

+ + + + +

矢印ボタンによるナビゲーションを編集する

+ +

+ Android のフレームワークでは、レイアウト内にあるフォーカス可能なエレメントの相対位置に基づいて、矢印ボタンによるナビゲーション スキームを自動的に適用します。TV 端末のリモコンの矢印ボタンを使用して、アプリ内に生成されたナビゲーション スキームをテストする必要があります。テスト後に、ある特定の方法でユーザーがレイアウト内を移動できるようにしたい場合には、コントロールに関する矢印ボタンによるナビゲーションを明示的にセットアップできます。 +

+ +

+ 注意:システムが適用したデフォルトの順序がうまく動作しない場合にのみ、これらの属性を使用してナビゲーション順序を変更します。 +

+ +

+ 次のコード サンプルでは、{@link android.widget.TextView} レイアウト オブジェクトで隣のコントロールがフォーカスを受け取るよう定義する方法を示します。 +

+ +
+<TextView android:id="@+id/Category1"
+        android:nextFocusDown="@+id/Category2"\>
+
+ +

+ 次の表では、Android ユーザー インターフェース ウィジェットで使用可能なナビゲーションの属性一覧を示します。 +

+ + + + + + + + + + + + + + + + + + + + + + +
属性機能
{@link android.R.attr#nextFocusDown}ユーザーが下に移動したときにフォーカスを受け取る隣のビューを定義します。
{@link android.R.attr#nextFocusLeft}ユーザーが左に移動したときにフォーカスを受け取る隣のビューを定義します。
{@link android.R.attr#nextFocusRight}ユーザーが右に移動したときにフォーカスを受け取る隣のビューを定義します。
{@link android.R.attr#nextFocusUp}ユーザーが上に移動したときにフォーカスを受け取る隣のビューを定義します。
+ +

+ これらの明示的なナビゲーション属性のいずれかを使用するには、レイアウト内の別のウィジェットの ID ({@code android:id} 値)に対する値を設定します。最後のコントロールが最初のコントロールにフォーカスを戻すようにするには、ナビゲーションの順序をループとしてセットアップする必要があります。 +

+ + + +

明確なフォーカスと選択を可能にする

+ +

+ TV 端末でアプリのナビゲーション スキームにとって重要なのは、スクリーン上のどのユーザー インターフェース エレメントにフォーカスがあるのかを、ユーザーが簡単に判別できるようにすることです。フォーカス状態のアイテムが明確でないと、ユーザーはどのアイテムに対してアクションが可能か判別できず、ストレスを感じてアプリを終了してしまうことになります。同じ理由で、アプリが起動直後やアイドル状態にある場合でも、ユーザーのアクションが可能なフォーカス状態のアイテムを常に配置しておく必要があります。 +

+ +

+ アプリのレイアウトと実装においては、色、サイズ、アニメーションや、これらの属性の組み合わせを使用して、ユーザーが次に可能なアクションを簡単に判別できるようにする必要があります。アプリ内では、一貫したスキームを使用してフォーカス状態を示すようにしてください。 +

+ +

+ Android はドローアブルとしての状態リスト リソースを提供しており、フォーカス状態の、そして選択済みのコントロールにハイライトを実装できます。次のコード例では、ボタンの視覚的な動作を有効にして、ユーザーがそのコントロールにナビゲートし、選択したことを表示する方法を示します。 +

+ +
+<!-- 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>
+
+ +

+ 次のレイアウトの XML サンプル コードは、{@link android.widget.Button} に対する 1 つ前の状態リスト ドローアブルにも該当します。 +

+ +
+<Button
+    android:layout_height="wrap_content"
+    android:layout_width="wrap_content"
+    android:background="@drawable/button" />
+
+ +

+ 周囲のハイライトがはっきりと見えるように、フォーカス可能で選択可能なコントロール内には十分なパディングを残してください。 +

+ +

+ TV アプリでの効率的な選択とフォーカスの設計に関する推奨事項については、TV のパターンを参照してください。 +

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 + +
+ +
+ +

+ TV アプリでは、携帯電話やタブレット向けのものと同じ構造を使用します。つまり、Android アプリのビルドに関する既知の技術を使用して新たな TV アプリを作成したり、既存のアプリを TV 端末でも使用できるように編集したりできます。 +

+ +

+ 重要:Google Play で Android TV アプリを提供するには、特定の要件を満たす必要があります。詳細については、TV アプリの品質に記載されている要件を参照してください。 +

+ +

+ このレッスンでは、TV アプリのビルドの際の開発環境の準備方法と、TV 端末上でアプリを使用できるようにするために最低限必要な変更について説明します。 +

+ + +

TV プロジェクトをセットアップする

+ +

+ このセクションでは、TV 端末向けに既存のアプリを変更したり、新しく作成する方法について説明します。TV 端末向けアプリを作成する際に使用する必要がある主なコンポーネントは次のとおりです。 +

+ + + + +

前提条件

+ +

TV 向けアプリのビルドを開始するには:

+ + + + +

TV アクティビティを宣言する

+ +

TV 端末向けアプリでは、{@link android.content.Intent#CATEGORY_LEANBACK_LAUNCHER} のインテント フィルタを使用して、アプリのマニフェストで TV 用ランチャーのアクティビティを宣言する必要があります。このフィルタは、アプリが TV 向けになっていることを判別しますので、Google Play 内で TV アプリと認識される上で必要です。この宣言は、ユーザーが TV のホーム スクリーンでアプリのアイコンを選択したときに、アプリ内のどのアクティビティが起動するかについても判別します。

+ +

次のコード スニペットでは、マニフェストにインテント フィルタを含める方法を示します。

+ +
+<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.TvActivity"
+    android:label="@string/app_name"
+    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>
+</application>
+
+ +

+ この例では、2 番目のアクティビティのマニフェスト エントリが、TV 端末で起動するアクティビティを指定しています。 +

+ +

+ 警告:アプリに {@link android.content.Intent#CATEGORY_LEANBACK_LAUNCHER} インテント フィルタを含めない場合、TV 端末で Google Play ストアを開いているユーザーにアプリが表示されません。開発者ツールを使用して TV 端末にロードする際にこのフィルタがない場合も、TV のユーザー にはアプリインターフェースが表示されません。 +

+ +

+ TV 向け用途で既存のアプリを変更する場合は、携帯電話やタブレットと同じアクティビティのレイアウトを使用しないでください。TV アプリや既存のアプリの TV 向け部分については、ソファでくつろぎながら TV リモコンを使用して、簡単にナビゲートできるシンプルなユーザー インターフェースを提供する必要があります。TV 向けアプリをデザインする際のガイドラインについては、TV 向けデザインガイドを参照してください。TV のインターフェースのレイアウトに関する最低限の実装要件についてはTV 用のレイアウトをビルドするを参照してください。 +

+ + +

タッチスクリーンの不要を宣言する

+ +

+ TV 端末向けアプリでは、入力はタッチスクリーンに依存しません 。これを明確にするために、TV アプリのマニフェストで {@code android.hardware.touchscreen} 機能が不要であることを宣言する必要があります。この設定により、アプリが TV 端末向けであると判別しますので、Google Play 内で TV アプリと認識される上で必要です。次のコード例では、マニフェストに宣言を含める方法を示します。 +

+ +
+<manifest>
+    <uses-feature android:name="android.hardware.touchscreen"
+              android:required="false" />
+    ...
+</manifest>
+
+ +

+ 警告:このコード例のようにアプリのマニフェストでタッチスクリーンが不要であると宣言しないと、アプリが TV 端末の Google Play ストアに表示されません。 +

+ + + +

+ アプリに Leanback ランチャーのインテント フィルタが含まれている場合は、ホーム スクリーンにバナーを配置する必要があります。バナーは、アプリやゲームの行のホーム スクリーン上に表示されるアプリの起動ポイントです。次のようにマニフェストにバナーを記述します。 +

+ +
+<application
+    ...
+    android:banner="@drawable/banner" >
+
+    ...
+</application>
+
+ +

+ {@code android:banner} 属性を使用して、<application> タグとともにアプリのすべてのアクティビティにデフォルトのバナーを配置するか、<activity> タグとともに特定のアクティビティにバナーを配置します。 +

+ +

+ TV 向けデザインの UI パターンガイドのバナーを参照してください。 +

+ +

TV サポート ライブラリを追加する

+ +

+ Android SDK には、TV アプリ向けのサポート ライブラリが用意されています。これらのライブラリでは、TV 端末向けに使用できる API とユーザー インターフェース ウィジェットを提供しています。同ライブラリは {@code <sdk>/extras/android/support/} ディレクトリにあります。ライブラリとその全般的な用途の一覧を次に示します。 +

+ + + +

+ 注意:これらのサポート ライブラリは TV アプリに必須ではありませんが、特にメディア カタログのブラウジング インターフェースを提供するアプリについては使用することを強くお勧めします。 +

+ +

+ v17 leanback ライブラリを使用する場合、v4 サポート ライブラリ に依存していることに注意してください。つまり、leanback ライブラリを使用するアプリには、次のサポート ライブラリをすべて含める必要があります。 +

+ + + +

+ v17 leanback ライブラリには、アプリのプロジェクトに含める際に、特定の手順を踏む必要があるリソースが含まれています。リソースを使用してサポート ライブラリをインポートする手順については、サポート ライブラリのセットアップを参照してください。 +

+ + +

TV アプリをビルドする

+ +

上記の手順を完了したら、TV 向けアプリのビルドに取りかかりましょう。TV アプリのビルドに役立つ次の補足的なトピックに目を通してください。

+ + +

TV アプリを実行する

+ +

+ アプリの実行は、開発プロセスの重要な一部です。Android SDK の AVD Manager では端末定義を提供しており、アプリの実行やテスト用の仮想 TV 端末を作成することができます。 +

+ +

仮想 TV 端末を作成するには:

+ +
    +
  1. AVD Manager を起動します。詳細については、AVD Manager のヘルプを参照してください。
  2. +
  3. [AVD Manager] ダイアログで [端末定義] タブをクリックします。
  4. +
  5. Android の TV 端末定義を選択し、[AVD の作成] をクリックします。
  6. +
  7. エミュレータのオプションを選択して、[OK] をクリックして AVD を作成します。

    + 注意:TV 用のエミュレータ端末で最高のパフォーマンスを得るには、[ホスト GPU を使用] オプションを有効にし、サポートされている場合には、仮想端末のアクセラレーションを使用します。エミュレータのハードウェア アクセラレーションについては、エミュレータを使用するを参照してください。 +

    +
  8. +
+ +

仮想 TV 端末上でアプリをテストするには:

+ +
    +
  1. 自分の開発環境に TV アプリをコンパイルします。
  2. +
  3. 自分の開発環境からアプリを実行し、ターゲットの TV 仮想端末を選択します。
  4. +
+ +

+ エミュレータの使用方法については、エミュレータを使用するを参照してください。Android Studio から仮想端末へのアプリのデプロイについては、Android Studio を使用してデバッグするを参照してください。ADT を使用した Eclipse からエミュレータへのアプリのデプロイについては、Eclipse から ADT を使用してビルド、実行するを参照してください。 +

-- cgit v1.1