Ich versuche, in meiner App die DrawerLayout mit der YouTubePlayerSupportFragment zu integrieren. Ich möchte Fragmente in die Hauptaktivität laden, indem ich das Menü Navigationsleiste benutze.Android: mit DrawerLayout und YouTubePlayerSupportFragment
Ich habe heruntergeladen "YouTubeAndroidPlayerApi.jar" Datei und in den Ordner "libs". Von com.android.support habe ich auch Abhängigkeiten in build.gradle (app) Datei für appcompact, Design und Support hinzugefügt:
apply plugin: 'com.android.application'
android {
compileSdkVersion 24
buildToolsVersion "24.0.1"
defaultConfig {
applicationId "com.test.xyz.testing"
minSdkVersion 19
targetSdkVersion 24
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile files('libs/YouTubeAndroidPlayerApi.jar')
compile 'com.android.support:appcompat-v7:24.2.1'
compile 'com.android.support:design:24.2.1'
compile 'com.android.support:support-v4:24.2.1'
testCompile 'junit:junit:4.12'
}
Das ist "activity_main.xml" file:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:background="@color/colorPrimary"
tools:context="com.test.xyz.testing.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="24sp"
android:textColor="#ffffff"
android:layout_centerInParent="true"
android:text="Relative Layout" />
<FrameLayout
android:id="@+id/frame"
android:layout_width="match_parent"
android:layout_height="400dp"
android:layout_alignParentTop="true"
android:background="#333333"
></FrameLayout>
</RelativeLayout>
<ListView
android:id="@+id/listView"
android:layout_width="500dp"
android:layout_height="match_parent"
android:layout_gravity="left"
android:background="@android:color/holo_blue_dark"
>
</ListView>
</android.support.v4.widget.DrawerLayout>
Ich habe zwei Fragmente hinzugefügt: ein einfaches Fragment und eines für das YouTubePlayerSupportFragment. Diese ist der Code für die YoutubePlayerSupportFragment (die die App zum Absturz bringt):
package com.test.xyz.testing;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.google.android.youtube.player.YouTubeBaseActivity;
import com.google.android.youtube.player.YouTubeInitializationResult;
import com.google.android.youtube.player.YouTubePlayer;
import com.google.android.youtube.player.YouTubePlayer.OnInitializedListener;
import com.google.android.youtube.player.YouTubePlayer.Provider;
import com.google.android.youtube.player.YouTubePlayerFragment;
import com.google.android.youtube.player.YouTubePlayerSupportFragment;
import com.google.android.youtube.player.YouTubePlayerView;
public class PlayerYoutubeFrag extends YouTubePlayerSupportFragment {
private String currentVideoID = "video_id";
private YouTubePlayer activePlayer;
public static PlayerYoutubeFrag newInstance(String url) {
PlayerYoutubeFrag playerYouTubeFrag = new PlayerYoutubeFrag();
Bundle bundle = new Bundle();
bundle.putString("url", url);
playerYouTubeFrag.setArguments(bundle);
playerYouTubeFrag.init(); //This line right here
return playerYouTubeFrag;
}
private void init() {
initialize(Config.YOUTUBE_ANDROID_KEY, new OnInitializedListener() {
@Override
public void onInitializationFailure(Provider arg0, YouTubeInitializationResult arg1) { }
@Override
public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer player, boolean wasRestored) {
activePlayer = player;
activePlayer.setPlayerStyle(YouTubePlayer.PlayerStyle.DEFAULT);
if (!wasRestored) {
activePlayer.loadVideo(getArguments().getString("url"), 0);
}
}
});
}
}
Dies ist der Code für die "MainActivity.java" file:
package com.test.xyz.testing;
import android.net.Uri;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import layout.SettingsFragment;
public class MainActivity extends AppCompatActivity
implements SettingsFragment.OnFragmentInteractionListener {
ListView listView;
ArrayAdapter<String> listAdapter;
String fragmentArray[] = {"Frag1", "Frag2"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.listView);
listAdapter = new ArrayAdapter<String>(this, R.layout.list_text, R.id.list_text_view, fragmentArray);
listView.setAdapter(listAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Fragment fragment;
switch (i) {
case 0:
fragment = new SettingsFragment();
break;
case 1:
fragment = null;
break;
default:
fragment = null;
break;
}
FragmentManager fragmentManager = getSupportFragmentManager();
if (fragment != null) {
fragmentManager.beginTransaction().replace(R.id.frame, fragment).commit();
}
else {
String video_id = "LHcP4MWABGY";
PlayerYoutubeFrag myFragment = PlayerYoutubeFrag.newInstance(video_id);
fragmentManager.beginTransaction().replace(R.id.frame, myFragment).commit();
}
}
});
}
@Override
public void onFragmentInteraction(Uri uri) {
}
}
Die Navigationsleiste funktioniert gut. Grundsätzlich, wenn ich auf den ersten Eintrag des Drawers klicke, wird das SettingsFragment korrekt geladen. Wenn ich auf den zweiten Eintrag des Drawers klicke, sollte der PlayerYoutubeFrag (der YouTubePlayerSupportFragment erweitert) mit einer Zeichenfolge von video_id geladen werden. Der App Absturz in der letzten Zeile:
String video_id = "LHcP4MWABGY";
PlayerYoutubeFrag myFragment = PlayerYoutubeFrag.newInstance(video_id);
fragmentManager.beginTransaction().replace(R.id.frame, myFragment).commit();
Dies ist das Protokoll:
FATAL EXCEPTION: main
Process: com.test.xyz.testing, PID: 28303
java.lang.SecurityException: Not allowed to bind to service Intent { act=com.google.android.youtube.api.service.START pkg=com.google.android.youtube }
at android.app.ContextImpl.bindServiceCommon(ContextImpl.java:1460)
at android.app.ContextImpl.bindService(ContextImpl.java:1418)
at android.content.ContextWrapper.bindService(ContextWrapper.java:632)
at com.google.android.youtube.player.internal.r.e(Unknown Source)
at com.google.android.youtube.player.YouTubePlayerView.a(Unknown Source)
at com.google.android.youtube.player.YouTubePlayerSupportFragment.a(Unknown Source)
at com.google.android.youtube.player.YouTubePlayerSupportFragment.onCreateView(Unknown Source)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:2080)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1108)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1290)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:801)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1677)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:536)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:7325)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
nicht sicher, wie dies zu beheben. Oder könnte mich jemand auf ein funktionierendes Beispiel einer App verweisen, die eine Schublade und ein Youtube-Fragment verwendet?
Ja und ja. Youtube App auf die letzte Version aktualisiert – revy