2017-05-30 49 views
0

我的YouTube播放器崩潰,我不知道爲什麼。YouTube播放器崩潰(java.lang.NullPointerException,null對象引用)

這是我的Java代碼:

public class YoutubeActivity extends AppCompatActivity 
    implements NavigationView.OnNavigationItemSelectedListener, YouTubePlayer.OnInitializedListener { 

private YouTubePlayerSupportFragment playerFragment; 
private YouTubePlayer mPlayer; 
private String YouTubeKey = "I DO NOT PUBLISH MY KEY"; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_youtube); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
      this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 
    drawer.setDrawerListener(toggle); 
    toggle.syncState(); 

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); 
    navigationView.setNavigationItemSelectedListener(this); 


    playerFragment = (YouTubePlayerSupportFragment) getSupportFragmentManager().findFragmentById(R.id.youtube_player_fragment); 
    playerFragment.initialize(YouTubeKey, this); 
} 


@SuppressWarnings("StatementWithEmptyBody") 
@Override 
public boolean onNavigationItemSelected(MenuItem item) { 
    // Handle navigation view item clicks here. 
    int id = item.getItemId(); 

    if (id == R.id.nav_photo) { 

    } else if (id == R.id.nav_gallery) { 

    } else if (id == R.id.nav_video) { 

    } 

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    drawer.closeDrawer(GravityCompat.START); 
    return true; 
} 

@Override 
public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer youTubePlayer, boolean b) { 
    mPlayer = youTubePlayer; 

    //Enables automatic control of orientation 
    mPlayer.setFullscreenControlFlags(YouTubePlayer.FULLSCREEN_FLAG_CONTROL_ORIENTATION); 

    //Show full screen in landscape mode always 
    mPlayer.addFullscreenControlFlag(YouTubePlayer.FULLSCREEN_FLAG_ALWAYS_FULLSCREEN_IN_LANDSCAPE); 

    //System controls will appear automatically 
    mPlayer.addFullscreenControlFlag(YouTubePlayer.FULLSCREEN_FLAG_CONTROL_SYSTEM_UI); 

    if (!b) { 
     mPlayer.cueVideo("9rLZYyMbJic"); 
     mPlayer.loadVideo("9rLZYyMbJic"); 
    } 
    else 
    { 
     mPlayer.play(); 
    } 
} 

@Override 
public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult youTubeInitializationResult) { 
    mPlayer = null; 
    String ausgabe = youTubeInitializationResult.toString(); 
    Log.d("hi", ausgabe); 
} } 

這是崩潰日誌:

05 - 30 20: 14: 39.013 16232 - 16232/de.sammy.flugradarlive E/AndroidRuntime: FATAL EXCEPTION: main 
Process: de.sammy.flugradarlive, PID: 16232 
java.lang.RuntimeException: Unable to start activity ComponentInfo { 
    de.sammy.flugradarlive/de.sammy.flugradarlive.YoutubeActivity 
}: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.android.youtube.player.YouTubePlayerSupportFragment.initialize(java.lang.String, com.google.android.youtube.player.YouTubePlayer$OnInitializedListener)' 
on a null object reference 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java: 2702) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java: 2767) 
at android.app.ActivityThread.access$900(ActivityThread.java: 177) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java: 1449) 
at android.os.Handler.dispatchMessage(Handler.java: 102) 
at android.os.Looper.loop(Looper.java: 145) 
at android.app.ActivityThread.main(ActivityThread.java: 5951) 
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java: 372) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java: 1400) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java: 1195) 
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.android.youtube.player.YouTubePlayerSupportFragment.initialize(java.lang.String, com.google.android.youtube.player.YouTubePlayer$OnInitializedListener)' 
on a null object reference 
at de.sammy.flugradarlive.YoutubeActivity.onCreate(YoutubeActivity.java: 50) 
at android.app.Activity.performCreate(Activity.java: 6289) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java: 1119) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java: 2655) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java: 2767) 
at android.app.ActivityThread.access$900(ActivityThread.java: 177) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java: 1449) 
at android.os.Handler.dispatchMessage(Handler.java: 102) 
at android.os.Looper.loop(Looper.java: 145) 
at android.app.ActivityThread.main(ActivityThread.java: 5951) 
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java: 372) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java: 1400) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java: 1195) 
05 - 30 20: 14: 41.055 16232 - 16232/de.sammy.flugradarlive I/Process: Sending signal.PID: 16232 SIG: 9 
+0

什麼是XML片段看起來像(R.id.youtube_player_fragment)? – RaceYouAnytime

+0

因爲我有<片段 機器人:ID = 「@ + ID/youtube_player_fragment」 機器人:名稱= 「com.google.android.youtube.player.YouTubePlayerFragment」 機器人:layout_width = 「match_parent」 機器人:layout_height =」 wrap_content「/>在我的content_youtube.xml –

回答

0

現在我們需要一些額外的信息,以明確回答這個問題,但現在看來,這條線是返回null,這表明你想看看你的資源XML,並確保你正確地抓取片段。

getSupportFragmentManager().findFragmentById(R.id.youtube_player_fragment);

你可以從考慮看看此相關的問題中獲益:

findFragmentById return null


我懷疑問題可能出在你的資源XML,你不使用支持庫聲明片段。

嘗試使用:

<fragment 
    android:name="com.google.android.youtube.player.YouTubePlayerSupportFragment" 
+0

我認爲這個方法playerFragment.initialize(YouTubeKey,this);返回null,不是嗎? –

+0

@FabianSawischa我在我的答案中添加了一個編輯。您是否嘗試在佈局中切換名稱以使用支持庫? – RaceYouAnytime

+0

謝謝隊友!你幫了我很多。 –

0

我嘗試了很多的這些建議,但沒有爲我工作。我最終創建了一個容器,然後在運行時用YouTubeFragment替換它。這對我來說非常合適。

  1. 創建一個containerView在我的佈局文件,請注意我的佈局文件中它只是一個部分

    <View 
        android:padding="10dp" 
        android:layout_width="match_parent" 
        android:layout_height="1dp" 
        android:background="@color/gray90"/> 
    
    
    
    <FrameLayout 
        android:padding="20dp" 
        android:id="@+id/youtubeContent" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"/> 
    
  2. 然後,我創建了YouTube的片段的實例如下

    youTubePlayerFragment = YouTubePlayerSupportFragment.newInstance();

  3. 我然後替換它使用如下的標準方法: -

    FragmentManager經理= getFragmentManager(); FragmentTransaction transaction = manager.beginTransaction(); transaction.replace(R.id.youtubeContent,youTubePlayerFragment).commit();

我希望這可以幫助別人

相關問題