7

Ho sviluppato un'applicazione che utilizza YouTube android API per riprodurre un determinato video all'interno dell'app. In quel momento ho usato come target API 19 e ho anche scelto l'API 19. Ora voglio cambiare il design dell'app passando a Material Design usando l'API di destinazione 22 e usando anche AppCompat-v7 :22+ library. Ma il YouTubeBaseActivity non può essere aperto e l'applicazione si arresta in modo anomalo. Di seguito pubblicherò ciò che ho fatto finora.YouTubePlayer insieme alla libreria AppCompat v7

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

<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" /> 

File 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

<?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> 

Quindi all'inizio non si apre perché il metodo getActionBar() restituisce Null, quindi l'ho modificato in getSupportActionBar() ma non lo riconosco. Poi alla fine ho cambiato questa linea in quanto segue:

public class EventDetail extends AppCompatActivity implements 
     YouTubePlayer.OnInitializedListener { 

e mi dà il seguente errore:

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) 
    .... 

Sto usando Android Studio. Qualsiasi idea sarà apprezzata.

+0

io penso che si debba controllare di più informazioni qui: https://developers.google.com/youtube/android/player/sample-applications –

risposta

12

Il problema è che si sta utilizzando il YouTubePlayerView, che richiede la vostra Activity per estendere YouTubeBaseActivity. Quindi hai cambiato la tua attività, in modo che ora si estenda AppCompatActivity. Questo si rompe YouTubePlayerView.

La soluzione è piuttosto semplice: utilizzare la classe YouTubePlayerFragment. Questo non pone alcun requisito sullo Activity, lasciandoti molte opzioni per il tuo tema.

+0

Grazie @dextor , ha risolto il mio problema, ho appena finito di implementarlo e funziona come prima. – Xhulio

+0

ma c'è un problema però, quando provo a eseguire l'applicazione su un dispositivo Android Lollipop, mi dà il seguente errore: Intent servizio deve essere esplicito: Intent {act = com.google.android.youtube.api.service. START} – Xhulio

+1

Questo perché stai utilizzando una versione precedente dell'SDK. L'aggiornamento alla versione 1.2.1 risolve questo problema. – Sebastiano

0

Secondo lo stack tracciare l'attività è di estendere YouTubeBaseActivity quando si utilizza l'API di YouTube

Se avete bisogno di avere un ActionBar allora penso che la strada migliore è quella di cambiare lo stile di non avere ActionBar e basta usare un toolbar nella tua vista.

0

incolla questo codice all'interno dell'app Gradle

compile 'com.google.android.gms:play-services:8.4.0' 
compile files('libs/YouTubeAndroidPlayerApi.jar')