Youtube Player を Fragment に埋め込む

今や公開されてるAPIも多すぎて...

プレーヤーを WebView なしで埋め込みたいだけなのに...

YouTube_—_Google_Developers

YouTube — Google Developers

いちいち調べるのが面倒なので手順メモ.

・ libs/ 以下にタウンドードした jar を置く.

dependencies {
    compile files('libs/YouTubeAndroidPlayerApi.jar')
}

・ API11+ であれば全て使える.
DEVELOPER_KEY を取得する必要がある.

・ 画面の回転時の再読み込みを AndroidManifest.xml で考慮.

    <activity
        ...
        android:screenOrientation="nosensor"
        android:configChanges="orientation|screenSize|keyboardHidden”>

・ YouTubeFailureRecoveryActivity 作成する.

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

}

・ Activity の親に YouTubeFailureRecoveryActivity を.

public class PlayerViewDemoActivity extends YouTubeFailureRecoveryActivity {

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.playerview_demo);

    // 処理開始
    YouTubePlayerView youTubeView = (YouTubePlayerView) findViewById(R.id.youtube_view);
    youTubeView.initialize(DeveloperKey.DEVELOPER_KEY, this);
  }

  @Override
  public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer player,
      boolean wasRestored) {
    if (!wasRestored) {
      player.cueVideo("wKJ9KzGQq0w”); // 動画ID
    }
  }

  @Override
  protected YouTubePlayer.Provider getYouTubePlayerProvider() {
    return (YouTubePlayerView) findViewById(R.id.youtube_view); // プレーヤーID
  }

}

・ レイアウト (layout/playerview_demo.xml)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

  <TextView
      android:layout_width="match_parent"
      android:layout_height="0dp"
      android:layout_weight="1"
      android:textAppearance="@android:style/TextAppearance.Small"
      android:gravity="center"
      android:text="@string/playerview_text"/>

  <com.google.android.youtube.player.YouTubePlayerView
      android:id="@+id/youtube_view"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"/>

</LinearLayout>

という雰囲気.

Fragment 内に埋め込むなら, Activity が固定されてるものとして,

   @Override
   public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

     int section = getArguments().getInt(ARG_SECTION_NUMBER);
     View rootView = inflater.inflate(R.layout.playerview_demo, container, false);


     // 処理開始
     YouTubePlayerView youTubeView = (YouTubePlayerView) rootview.findViewById(R.id.youtube_view);

     youTubePlayerFragment.initialize(DeveloperKey.DEVELOPER_KEY,
                                      (YouTubePlayer.OnInitializedListener)getActivity());
   }

YouTube Android Player API - YouTube — Google Developers
サンプルアプリケーション - YouTube — Google Developers


「Google Play 開発者サービスのバージョン 5208000 を使用する APK をアップロードしました。バージョン 5100000 以下を使用してください。」でアップロードできない

なんなんだろうな, まじで.

APK_-_Google_Play_Developer_Console

バージョン 5100000 以下を使用してください

と書いてるので最新バージョンは, 5.1.00 と推定.

dependencies {
    compile "com.google.android.gms:play-services:5.1.00"
}

アウチ.

きっと, ベストな バージョンは 「5.0.89」なのでしょうね?

dependencies {
    compile "com.google.android.gms:play-services:5.0.89"
}

なんか, ここら, 最近あやしい...

「Google Play services out of date. Requires 5208000 but found 5089036」といってるけどこれは?


gradle なら AndroidManifest.xml 内 <uses-sdk> が不要だった件

_uses-sdk____Android_Developers

Android Studio が警告なフキダシを出してる.

main_AndroidManifest

記述が2箇所あってきもちが悪かったのですが.

build.gradle

android {
    ...
    defaultConfig {
        minSdkVersion 9
        targetSdkVersion 19
    }
    ...
}

AndroidManifest.xml

<uses-sdk
    android:minSdkVersion="9"
    android:targetSdkVersion="19"/>

Android Studio の設定で「バージョン」の記述してるとこありすぎね?

で, AndroidManifest.xml側の記述は不要らしい.

Gradle overrides the manifest values, and I prefer to update build.gradle file rather than manifest. And probably this is the right way using Gradle. Gradle supports product flavours which can be controled via IDE and those product flavors can change many things in our Manifest like package name, version code, version name, target SDK and many other. Then by one click in Android Studio You can change many properties and generate another apk.

You can left the manifest as it is and do all configuration in build.gradle. You can safely remove

<uses-sdk></uses-sdk>

from manifest as well as version codes.

Android studio: why are minSdkVersion and targetSdkVersion specified both in AndroidManifest.xml and build.gradle? - Stack Overflow

Gradle が自動埋め込んでくれるっぽい.

apk化後, バラしてみてみると確認できます.

android-apktool - A tool for reverse engineering Android apk files - Google Project Hosting