読者です 読者をやめる 読者になる 読者になる

くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

YouTube Player Libraryを使って、動画を再生してみる

少し前の記事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" />

現象としては、

  1. 動画は読み込まれるが再生ボタンを押すとすぐ止まる。。。
  2. 全画面ボタンを押して、再生すると問題なく動作する
  3. 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だけがダメな感じでした。。。

[PR] めもらばではこんなあぷりを作っています!