[Android] YouTubePlayerフルスクリーン時の再読み込み回避方法
前回の「YouTube API V3を導入する第一歩」の内容を修正/加筆して行きます。
Manifest
内に記述。
<activity> android:configChanges="keyboardHidden|orientation|screenSize" </activity>
orientation を記述すれば大丈夫みたいですが、
screenSize も記述しないとエミュレーターを使用した際に
再読み込みしてしまう、らしいです。(未確認)
configChanges については、下記が詳しく載っています。
Y.A.M の雑記帳
http://y-anz-m.blogspot.jp/2010/03/android.html
XML
PlayerFragmentを設定していたら下記の様にPlayerView用に書き換えてください。
<com.google.android.youtube.player.YouTubePlayerView android:id="@+id/youtube" android:name="com.google.android.youtube.player.YouTubePlayerView" android:layout_width="match_parent" android:layout_height="wrap_content" />
Activity
public class MainActivity extends YouTubeBaseActivity implements YouTubePlayer.OnInitializedListener, YouTubePlayer.OnFullscreenListener
今回は前回の様にYouTubePlayerFragmentではなく
YouTubePlayerViewを使用するのでYouTubeBaseActivityの継承が必須です。
何故FragmentからViewに変更したのかと言うと、
カスタマイズするにはこうしないといけないから、みたいです。
…こんな説明ですいません(汗)
恐らくYouTubePlayerFragmentとは、YouTubePlayerViewをカスタマイズして
フラグメント化したものなのではないでしょうか。(…未確認)
アクティビティ内のonCreateに追記。
@Override protected void onCreate(Bundle savedInstanceState) { // YouTubePlayerFragment から YouTubePlayerViewのインスタンスを取得に変更 youTubePlayer = (YouTubePlayerView) findViewById (R.id.youtube); }
アクティビティ内のonInitializationSuccessに追記。
@Override public void onInitializationSuccess(YouTubePlayer.Provider provider, final YouTubePlayer player, boolean wasRestored) { // Playerフルスクリーン時の挙動を手動制御に設定 player.addFullscreenControlFlag(YouTubePlayer.FULLSCREEN_FLAG_CUSTOM_LAYOUT); player.setOnFullscreenListener(this); }
そして、フルスクリーン時と通常時のレイアウトの定義が必要です。
フルスクリーンの状態(画面の向き)を変更すると、下記①〜③の順で呼ばれます。
① フルスクリーンの状態をbooleanで返す。
@Override public void onFullscreen(boolean isFullscreen) { // アプリケーションのウィンドウの中で有効なスペース全体をプレーヤーのビューが占有する必要がある。 fullscreen = isFullscreen; }
② 画面レイアウトの定義
@Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); // 横向きにした場合にアクティビティが再構成されないようにする必要がある。 doLayout(); }
③ 上記②で呼ぶレイアウトの定義。
private void doLayout() { // プレイヤーのパラメータを取得 LinearLayout.LayoutParams playerParams = (LinearLayout.LayoutParams) youTubePlayer.getLayoutParams(); // フルスクリーンの場合 if (fullscreen) { // YouTubePlayerの画面サイズを設定 playerParams.width = LinearLayout.LayoutParams.MATCH_PARENT; playerParams.height = LinearLayout.LayoutParams.MATCH_PARENT; // プレイヤー以外を非表示にする toolbar.setVisibility(View.GONE); otherViews.setVisibility(View.GONE); } // フルスクリーンではない場合 else { // プレイヤー以外も表示する toolbar.setVisibility(View.VISIBLE); otherViews.setVisibility(View.VISIBLE); // 「 miniTube 」画面下部のパラメータを取得 ViewGroup.LayoutParams otherViewsParams = otherViews.getLayoutParams(); // 画面を横向きにした場合のレイアウト if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { // PlayerとotherViewsのパラメータを設定 playerParams.width = otherViewsParams.width = 0; playerParams.height = WRAP_CONTENT; otherViewsParams.height = MATCH_PARENT; playerParams.weight = 1; // 外枠のレイアウト baseLayout.setOrientation(LinearLayout.HORIZONTAL); } // 画面が縦の場合のレイアウト else { // PlayerとotherViewsのパラメータを設定 playerParams.width = otherViewsParams.width = MATCH_PARENT; playerParams.height = WRAP_CONTENT; playerParams.weight = 0; otherViewsParams.height = MATCH_PARENT; // 外枠のレイアウト baseLayout.setOrientation(LinearLayout.VERTICAL); } } }
③で使用したレイアウトのパーツは下記の様に区分けしています。
緑枠 = toolbar
赤枠 = youTubePlayer
黄枠 = otherViews
上記3つを囲む外枠 = baseLayout
これでいけるはずです!
※スピナーの枠の右に表示されるはずの小さい三角マークが消えました...
extends を Activity から YouTubeBaseActivity に変更したのが原因だと思うのですが謎です。
これはもうスピナーをカスタマイズしろって事なんでしょうか笑
AndroidアプリにYouTube API V3を導入する第一歩。
先日リリースしたアプリ「miniTube」では、YouTubePlayer API V3とYouTubeData APIを利用しています。
Player API = 再生などを行うプレイヤー画面。
Data API = 検索結果などのデータを引っ張ってくるAPIって事ですね。
これらを利用するにはGoogle Developersからサンプルアプリケーション(デモ)をダウンロードして解読すれば良いのですが、コメントも全て英語です(笑)
そこで、ここで部分的にでも解説できれば役立つ人もいるかなと思います。
今回はプレイヤーの表示と再生をするための最低限の内容にしました。
因みに僕の環境はMacのAndroid Studio 1.0.1です。
準備
ここでは割愛しますが、まずはGoogle DevelopersからYouTubePlayerAPIを利用するためのAPIキーを入手してください。
それからPlayer API(YouTubeAndroidPlayerApi.jar)をダウンロードしてlibsに入れましょう。
Android StudioではlibsにAPI.jarを入れたら、gradleに記述が必要です。
という事でgradle。
dependencies {
compile files('libs/YouTubeAndroidPlayerApi.jar')
}
XML
プレイヤーとボタンを好きな位置に配置しましょう。
プレイヤーにはViewとFragmentが有りますが、
再生するだけならFragmentが簡単ですので今回はこちらで。
Viewはカスタマイズする時に必要っぽいです。
<fragment
android:id="@+id/youtube"
android:name="com.google.android.youtube.player.YouTubePlayerFragment"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
Activity
1、クラスにインターフェースをimplementsして、フィールド変数を記述。
public class MainActivity implements YouTubePlayer.OnInitializedListener { // フィールド変数 private YouTubePlayer player; private YouTubePlayerFragment youTubePlayer;
2、onCreate辺りにこちらを。
"動画ID"とは、下記を例とすると"Ea_V2qOx5Hs"の部分です。
// ボタン Button btn = (Button) findViewById (R.id.btn); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { player.loadVideo("動画ID"); }); // YouTubePlayerのフラグメント youTubePlayer = (YouTubePlayerFragment) getFragmentManager().findFragmentById(R.id.youtube); // プレイヤーを利用するために初期化する youTubePlayer.initialize("最初に取得したAPIキーを記述", this);
3、上記のプレイヤー初期化(initialize)で呼ばれるメソッド。成功時と失敗時の二つ。
// プレーヤーの初期化成功時に呼ばれる @Override public void onInitializationSuccess(YouTubePlayer.Provider arg0, final YouTubePlayer player, boolean wasRestored) { this.player = player; } // プレーヤーの初期化失敗時に呼ばれる @Override public void onInitializationFailure(YouTubePlayer.Provider arg0, YouTubeInitializationResult errorReason) { }
4、最後に、Playerの状態保存とその復帰で必要なメソッド。
Playerが置かれたアクティビティから画面遷移したりした場合に勝手に呼ばれます。
// YouTubePlayerの状態を保存 @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); } // アクティビティが戻ると呼ばれるっぽい // フルスクリーンにすると呼ばれた // YouTubePlayerの状態を復帰 @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); }
これで、ボタンを押すと動画が再生されるアプリが完成しました。
Androidアプリ、「miniTube」がダウンロード開始になりました。
はじめまして。
僕はAndroidアプリを開発しています。
まだまだ勉強中ですが、気付いた事やメモなどを書いていきます。
まず僕の開発したアプリを紹介します。
「miniTube」
https://play.google.com/store/apps/details?id=and0901.app.collectactivity
名前の通り、YouTubeのAPIを利用しています。
売りは、自分や友達のプレイリストを共有できる!です。
instagramの様な使い方をされる事を想定して制作してますので、
SNS連携やウェブ版などのサービスはこれから充実させて行こうと考えてます。
<使い方>
1、友達と繋がるためにアプリ独自のアカウントを登録。
2、YouTubeと同じ様に、検索、プレイリスト作成、動画登録。
3、友達のアカウントを登録。
以上で取り敢えずは終了です。
シンプルですね。
もちろん繋がりを持たずに個人で使う事もできますが、
それだと公式アプリで十分なので、
みんなで使ってもらえると楽しさも倍増すると思います。
まだ利用者も少ないので無料だし広告も有りません。
データベースはニフティさんのNCMBの無料版を利用していて、
サーバーの維持費も"今の所は"かかっていませんので。
是非一度使ってみてください。
よろしくお願いします〜