YouTubePlayer together with AppCompat v7 library
Asked Answered
P

3

7

I have developed an app that uses YouTube android API to play a certain video inside the app. At that time I have used as target API 19, and also target API 19. Now I want do change the design of the app switching to Material Design using target API 22 and also using AppCompat-v7 :22+ library. But the YouTubeBaseActivity cant be opened and the application crashes. Below I will post what I have done so far.

EventDetail.java

public class EventDetail extends YouTubeBaseActivity implements
        YouTubePlayer.OnInitializedListener { .
.
.
protected void onCreate(Bundle savedInstanceState) {

        // remove the shadow from action bar
        setTheme(R.style.Theme_TranslucentActionBar_ActionBar_NoOverlay);

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_event_detail);

        // enable back button

        getSupportActionBar().setHomeButtonEnabled(true);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        // setting the action bar initially transparent
        mActionBarBackgroundDrawable = new ColorDrawable(
                Color.parseColor("#ec5c59"));
        mActionBarBackgroundDrawable.setAlpha(0);

        getSupportActionBar().setBackgroundDrawable(mActionBarBackgroundDrawable);

        // binding the scrollview

...

Manifest File

<activity
        android:name="com.dev.apk.evente.al.EventDetail"
        android:icon="@drawable/ikona_projekte"
        android:label="@string/title_activity_event_detail"
        android:screenOrientation="portrait"
        android:theme="@style/Theme.TranslucentActionBar.ActionBar.Overlay" />

Layut File:

<RelativeLayout
    android:id="@+id/video_layout"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="20dp"
    android:paddingLeft="23dp"
    android:paddingRight="23dp"
    android:paddingBottom="15dp"
    android:background="@drawable/event_background_block" >

    <TextView
        android:id="@+id/video_label"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:background="@color/white"
        android:gravity="left"
        android:paddingTop="10dp"

        android:paddingBottom="10dp"
        android:text="Video"
        android:textColor="@color/VeryDarkGray"
        android:textSize="22sp" >
    </TextView>

    <com.google.android.youtube.player.YouTubePlayerView
        android:id="@+id/youtube_view"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/video_label"
        android:background="@color/white" />
</RelativeLayout>

Theme.xml File

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <style name="Theme.TranslucentActionBar" parent="Theme.AppCompat.Light.DarkActionBar">

        <item name="android:actionBarStyle">@style/Widget.ActionBar</item>
    </style>

    <style name="Theme.TranslucentActionBar.ActionBar" />

    <style name="Theme.TranslucentActionBar.ActionBar.Overlay">
        <item name="android:actionBarStyle">@style/Widget.ActionBar.Transparent</item>
        <item name="android:windowActionBarOverlay">true</item>
        <item name="colorPrimary">@color/evente_date_color</item>
        <item name="colorPrimaryDark">@color/evente_darken_color</item>
    </style>

    <!-- Theme without ActionBar shadow (inherits main theme) -->

    <style name="Theme.TranslucentActionBar.ActionBar.NoOverlay" parent="Theme.TranslucentActionBar.ActionBar.Overlay">
        <item name="android:windowContentOverlay">@null</item>
    </style>

</resources>

So at the beginning it doesn't open because the method getActionBar() return Null, then i changed it to getSupportActionBar() but i doesn't recognized it. Then at the end I changed this line in the following:

public class EventDetail extends AppCompatActivity implements
        YouTubePlayer.OnInitializedListener {

and it gives me the following error:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myikub.al/com.dev.apk.evente.al.EventDetail}: android.view.InflateException: Binary XML file line #250: Error inflating class com.google.android.youtube.player.YouTubePlayerView
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2342)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417)
    at android.app.ActivityThread.access$600(ActivityThread.java:148)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1355)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:150)
    at android.app.ActivityThread.main(ActivityThread.java:5406)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:525)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
    at dalvik.system.NativeStart.main(Native Method)
Caused by: android.view.InflateException: Binary XML file line #250: Error inflating class com.google.android.youtube.player.YouTubePlayerView
    at android.view.LayoutInflater.createView(LayoutInflater.java:620)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:696)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:758)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:758)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
    at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:249)
    at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:106)
    at com.dev.apk.evente.al.EventDetail.onCreate(EventDetail.java:112)
    at android.app.Activity.performCreate(Activity.java:5303)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2296)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417)
    at android.app.ActivityThread.access$600(ActivityThread.java:148)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1355)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:150)
    at android.app.ActivityThread.main(ActivityThread.java:5406)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:525)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
    at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.reflect.InvocationTargetException
    at java.lang.reflect.Constructor.constructNative(Native Method)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
    at android.view.LayoutInflater.createView(LayoutInflater.java:594)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:696)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:758)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:758)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
    at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:249)
    at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:106)
    at com.dev.apk.evente.al.EventDetail.onCreate(EventDetail.java:112)
    at android.app.Activity.performCreate(Activity.java:5303)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2296)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417)
    at android.app.ActivityThread.access$600(ActivityThread.java:148)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1355)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:150)
    at android.app.ActivityThread.main(ActivityThread.java:5406)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:525)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
    at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalStateException: A YouTubePlayerView can only be created with an Activity  which extends YouTubeBaseActivity as its context.
    at com.google.android.youtube.player.YouTubePlayerView.<init>(Unknown Source)
    ....

I am using Android Studio. Any idea will be appreciated.

Partitive answered 7/5, 2015 at 13:0 Comment(1)
I think you have to check out more info here : developers.google.com/youtube/android/player/…Propene
H
13

The problem is that you're using the YouTubePlayerView, which requires your Activity to extend YouTubeBaseActivity. Then you changed your activity, so that it now extends AppCompatActivity. This breaks YouTubePlayerView.

The solution is pretty simple: use the YouTubePlayerFragment class. This does not pose any requirement on the Activity, leaving you with plenty of options for your theming.

Heda answered 7/5, 2015 at 13:4 Comment(5)
Thanks @dextor, it solved my problem, I have just finished implementing it and it works like before.Partitive
but there is one problem though, when I try to run the application on an Android Lollipop Device, it gives me the following error : Service Intent must be explicit: Intent { act=com.google.android.youtube.api.service.START }Partitive
That's because you're using an old version of the SDK. Updating to 1.2.1 fixes this issue.Heda
@Partitive can you please answer your question and tell us how to implement YouTubePlayerFragment , also it is a good practice to answer your own question.Drusi
people say YouTubePlayerFragment is buggy - https://mcmap.net/q/1479019/-youtube-iframe-vs-youtube-android-player-apiBillyebilobate
I
0

According to the stack trace the activity has to extend YouTubeBaseActivity when using the YouTube API

If you need to have an actionbar then I think the best route is to change the style to have no actionbar and just use a toolbar in your view.

Improvisatory answered 7/5, 2015 at 13:4 Comment(0)
B
0

paste this code inside gradle app

compile 'com.google.android.gms:play-services:8.4.0'
compile files('libs/YouTubeAndroidPlayerApi.jar')
Barium answered 28/7, 2017 at 12:39 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.