少し前の記事でYouTube Data APIで動画の情報を取ってくることができたので、次はPlayer APIで動画を再生してみる。
だうんろーど&いんすとーる
下記のダウンロードページからzipをダウンロードしてくる。 - YouTube Android Player API - Download - YouTube — Google Developers
zipを展開するこんな感じ。
├── README ├── docs │ ├── index.html │ └── reference ├── libs │ └── YouTubeAndroidPlayerApi.jar └── sample ├── AndroidManifest.xml ├── LICENSE.txt ├── build.xml ├── gen ├── libs ├── proguard.cfg ├── project.properties ├── res └── src
「libs/YouTubeAndroidPlayerApi.jar」が本体なので、適当なとこにおいてパスを通せばOK
自分の場合は、AndroidStudioなので、app/libs配下に配置
MyAndroidStudioApp ├── MyAndroidStudioApp.iml ├── app │ ├── app.iml │ ├── build │ ├── build.gradle │ ├── libs │ │ └── YouTubeAndroidPlayerApi.jar │ ├── proguard-rules.pro │ └── src ├── build ├── build.gradle ├── gradle ├── gradle.properties ├── gradlew ├── gradlew.bat ├── local.properties └── settings.gradle
YouTubePlayerViewをLayoutでつかう
サンプルは以下な感じ。Viewとして使う場合には、YouTubePlayerViewを使うらしい。 - YouTubePlayerView - YouTube — Google Developers
YouTubePlayerFragmentというFragmentもあるみたいです。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <com.google.android.youtube.player.YouTubePlayerView android:id="@+id/view_player" android:layout_width="0dp" android:layout_height="match_parent" android:layout_gravity="center_vertical" android:layout_weight="3" /> <LinearLayout android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:orientation="vertical" > <ListView android:id="@+id/list_related_videos" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout> </LinearLayout>
YouTubeBaseActivityとかJava系
サンプルはこんな感じ。YouTubeFailureRecoveryActivityはダウンロードしてきたzipに入ってたサンプルを流用。
public class PlayerActivity extends YouTubeFailureRecoveryActivity { private static final String DEVELOPER_KEY = "your api key"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_player); YouTubePlayerView youTubeView = (YouTubePlayerView) findViewById(R.id.view_player); youTubeView.initialize(DeveloperKey.DEVELOPER_KEY, this); } @Override public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer player, boolean wasRestored) { if (!wasRestored) { this.player = player; player.loadVideo(VIDEO_ID); player.play(); } } @Override protected YouTubePlayer.Provider getYouTubePlayerProvider() { return (YouTubePlayerView) findViewById(R.id.view_player); } }
public abstract class YouTubeFailureRecoveryActivity extends YouTubeBaseActivity implements YouTubePlayer.OnInitializedListener { private static final int RECOVERY_DIALOG_REQUEST = 1; @Override public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult errorReason) { if (errorReason.isUserRecoverableError()) { errorReason.getErrorDialog(this, RECOVERY_DIALOG_REQUEST).show(); } else { String errorMessage = String.format(getString(R.string.error_player), errorReason.toString()); Toast.makeText(this, errorMessage, Toast.LENGTH_LONG).show(); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == RECOVERY_DIALOG_REQUEST) { // Retry initialization if user performed a recovery action getYouTubePlayerProvider().initialize(DeveloperKey.DEVELOPER_KEY, this); } } protected abstract YouTubePlayer.Provider getYouTubePlayerProvider(); }
とりあえず動いたー!!
ハマった!!
下記みたいな感じにしてたら、うまく動かなかった。。。 よくわからないが、属性の指定が良くなかったらしい。。。
<com.google.android.youtube.player.YouTubePlayerView android:id="@+id/view_player" android:layout_width="0dp" android:layout_height="match_parent" android:layout_gravity="center_vertical" android:layout_weight="3" android:paddingLeft="12dp" />
現象としては、
- 動画は読み込まれるが再生ボタンを押すとすぐ止まる。。。
- 全画面ボタンを押して、再生すると問題なく動作する
- YouTubePlayerFragmentにしてもだめ。。。
LogCatにはこんなログが出てるし。。。
W/YouTubeAndroidPlayerAPI﹕ YouTube video playback stopped due to unauthorized overlay on top of player. The YouTubePlayerView is not contained inside its ancestor com.google.android.youtube.player.YouTubePlayerView{2203be98 V.E..... ........ 0,0-960,628 #7f090001 app:id/view_player}. The distances between the ancestor's edges and that of the YouTubePlayerView is: left: -16, top: 0, right: 0, bottom: 0 (these should all be positive).
いろいろ試してみたら、「android:paddingLeft="12dp"」が悪かったよう。 こいつを外したらちゃんと再生されました〜 marginでも大丈夫見たい。paddingだけがダメな感じでした。。。