问题
I am working on a project. I am using YouTubeAndroidPlayerAPI
and Webview
in my activity.
when I try to run a video with its id, it runs. Problem is but if the video id is null, then I am not running or initializing the video as explained in the code, then It gives me the following logcat output and my application gets crash with giving the message as "Unfortunately You tube has stopped"
. Can anyone help me as I had done lot of searches but couldn't find any solution.
My Activity extends SherlockYouTubeActivity
. The SherlockYouTubeActivity
contains the SherlockActivity code but inspite of Activty
it extends the YouTubeBaseActivity
. Hence by doing so I had extended both the SherlockActivity
and YouTubeBaseActivity
to my Activity via Multilevel Inheritance
.
My LogCat Output
is as Follows:-
09-09 18:41:18.201: E/AndroidRuntime(25534): FATAL EXCEPTION: main
09-09 18:41:18.201: E/AndroidRuntime(25534): java.lang.IllegalStateException: android.os.DeadObjectException
09-09 18:41:18.201: E/AndroidRuntime(25534): at com.google.android.youtube.api.jar.client.RemoteEmbeddedPlayer.K(SourceFile:229)
09-09 18:41:18.201: E/AndroidRuntime(25534): at com.google.android.apps.youtube.api.jar.a.a.a(SourceFile:62)
09-09 18:41:18.201: E/AndroidRuntime(25534): at com.google.android.apps.youtube.api.jar.a.s.b(SourceFile:945)
09-09 18:41:18.201: E/AndroidRuntime(25534): at com.google.android.apps.youtube.api.jar.y.a(SourceFile:180)
09-09 18:41:18.201: E/AndroidRuntime(25534): at com.google.android.apps.youtube.api.jar.a.a.k(SourceFile:576)
09-09 18:41:18.201: E/AndroidRuntime(25534): at com.google.android.youtube.api.jar.client.RemoteEmbeddedPlayer.e(SourceFile:51)
09-09 18:41:18.201: E/AndroidRuntime(25534): at com.google.android.youtube.api.jar.client.c.run(SourceFile:715)
09-09 18:41:18.201: E/AndroidRuntime(25534): at android.os.Handler.handleCallback(Handler.java:730)
09-09 18:41:18.201: E/AndroidRuntime(25534): at android.os.Handler.dispatchMessage(Handler.java:92)
09-09 18:41:18.201: E/AndroidRuntime(25534): at android.os.Looper.loop(Looper.java:176)
09-09 18:41:18.201: E/AndroidRuntime(25534): at android.app.ActivityThread.main(ActivityThread.java:5419)
09-09 18:41:18.201: E/AndroidRuntime(25534): at java.lang.reflect.Method.invokeNative(Native Method)
09-09 18:41:18.201: E/AndroidRuntime(25534): at java.lang.reflect.Method.invoke(Method.java:525)
09-09 18:41:18.201: E/AndroidRuntime(25534): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046)
09-09 18:41:18.201: E/AndroidRuntime(25534): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862)
09-09 18:41:18.201: E/AndroidRuntime(25534): at dalvik.system.NativeStart.main(Native Method)
09-09 18:41:18.201: E/AndroidRuntime(25534): Caused by: android.os.DeadObjectException
09-09 18:41:18.201: E/AndroidRuntime(25534): at android.os.BinderProxy.transact(Native Method)
09-09 18:41:18.201: E/AndroidRuntime(25534): at com.google.android.apps.youtube.api.b.a.aq.e(SourceFile:466)
09-09 18:41:18.201: E/AndroidRuntime(25534): at com.google.android.youtube.api.jar.client.RemoteEmbeddedPlayer.K(SourceFile:226)
09-09 18:41:18.201: E/AndroidRuntime(25534): ... 15 more
My XML file is as:-
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:ads="http://schemas.android.com/apk/lib/com.google.ads"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.ads.doubleclick.DfpAdView
android:id="@+id/adView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:gravity="center"
android:layout_centerHorizontal="true"
ads:adUnitId="MYADDID"
ads:adSize="BANNER"
/>
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:id="@+id/ScrollView_StoryDetails2"
android:layout_above="@+id/adView">
<RelativeLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center">
<WebView android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
/>
<com.google.android.youtube.player.YouTubePlayerView
android:id="@+id/youtube_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/content"
android:layout_alignParentBottom="true"
android:layout_marginBottom="5dp"
/>
</RelativeLayout>
</ScrollView>
<TextView
android:id="@+id/tNoNet"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:text="No Internet Connection, Reading Offline."
android:layout_centerHorizontal="true"
android:textColor="#000000"
android:layout_gravity="center_horizontal"
android:textStyle="bold"
android:textSize="12sp"
android:typeface="serif"
android:background="#FF7E00"
android:paddingLeft="5dp"
android:paddingRight="5dp"
android:paddingTop="3dp"
android:paddingBottom="3dp"/>
</RelativeLayout>
My Activity Class is as Follows:-
public class StoryDetail extends SherlockYouTubeActivity implements
YouTubePlayer.OnInitializedListener
{
private String sVideoId;
public String html;
String sCategory;
SharedPreferences sPref;
private YouTubePlayer YPlayer;
private static final String YoutubeDeveloperKey = "MY_YOUTUBE_DEVELOPER_KEY";
private static final int RECOVERY_DIALOG_REQUEST = 1;
public boolean netConnected=false;
WebView content;
WebView myWebView;
WebView wvAdd;
TextView tNoNet;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.story_detail2);
Bundle b=new Bundle();
b=getIntent().getExtras();
// Get the vedioId...
sVideoId = b.getString("videoId");
YouTubePlayerView youTubeView = (YouTubePlayerView) findViewById(R.id.youtube_view);
if(sVideoId!=null)
{
try{
youTubeView.initialize(YoutubeDeveloperKey, this);
}
catch(IllegalStateException e){
e.printStackTrace();
}
}
else{
youTubeView.setVisibility(8);//Gone
}
ActionBar bar = getSupportActionBar();
bar.setDisplayShowTitleEnabled(false);
bar.setDisplayUseLogoEnabled(false);
bar.setDisplayHomeAsUpEnabled(true);
tNoNet=(TextView)findViewById(R.id.tNoNet);
checkInternetConnection();
// Create an image loader
//mImageLoader = new ImageLoader(3);
// Look up the DfpAdView as a resource and load a request.
DfpAdView adView = (DfpAdView)this.findViewById(R.id.adView);
adView.loadAd(new AdRequest());
// Get the fields
content = (WebView) findViewById(R.id.content);
content.getSettings().setPluginState(PluginState.ON_DEMAND);
content.getSettings().setJavaScriptEnabled(true);
content.getSettings().setAllowFileAccess(true);
content.setWebChromeClient(new WebChromeClient());
content.setWebViewClient(new MyAppWebViewClient());
html = "<html>SOME_STUFFS TO SHOW ON WEBVIEW</html>";
content.loadDataWithBaseURL("http://bgr.in/", html, "text/html", "UTF-8", "");
}
public checkInternetConnection(){
// Some Code Goes Here...
}
@Override
public void onBackPressed()
{
if(content.canGoBack()){
content.goBack();
}
else
super.onBackPressed();
}
/**
* Menu handling
*/
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getSupportMenuInflater();
inflater.inflate(R.menu.story_detail, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.share:
/**
*Some Code Goes Here
*/
return true;
case R.id.comments:
/**
*Some Code Goes Here
*/
return true;
case android.R.id.home:
// This is called when the Home (Up) button is pressed
// in the Action Bar.
/**
*Some Code Goes Here
*/
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onPause() {
super.onPause();
content.onPause();
}
@Override
public void onResume() {
super.onResume();
content.onResume();
}
@Override
protected void onDestroy() {
super.onDestroy();
content.loadUrl("about:blank");
}
@Override
public void onInitializationFailure(Provider arg0,
YouTubeInitializationResult arg1) {
// TODO Auto-generated method stub
if (arg1.isUserRecoverableError()) {
arg1.getErrorDialog(this, RECOVERY_DIALOG_REQUEST).show();
} else {
String errorMessage = String.format(
"There was an error initializing the YouTubePlayer",
arg1.toString());
}
}
@Override
public void onInitializationSuccess(Provider arg0, YouTubePlayer arg1,
boolean arg2) {
// TODO Auto-generated method stub
if (!arg2) {
YPlayer = arg1;
if(sVideoId!=null){
try{
YPlayer.loadVideo(sVideoId);
}
catch(IllegalStateException e){
e.printStackTrace();
}
}
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == RECOVERY_DIALOG_REQUEST) {
// Retry initialization if user performed a recovery action
if(sVideoId!=null){
getYouTubePlayerProvider().initialize(YoutubeDeveloperKey, this);
}
}
}
protected YouTubePlayer.Provider getYouTubePlayerProvider() {
return (YouTubePlayerView) findViewById(R.id.youtube_view);
}
}
Any Help would be Appreciated from the Bottom of the Heart. Thanks in Advance..
回答1:
Well above code work fine now, All what was creating that exception was that, some of the VideoId were null and some were "" hence the VideoId whose value was "" was creating an the exception to me as I was only checking for null values and not for "" value of VideoId. Now the issue is resolved.
If any one need to use Youtube Android API code can simply use the above code. It works fine even in Sherlock Activity.
Thanks for the feedsbacks of those who tried and supported me.
回答2:
Try catching all exceptions instead of only catching
IllegalStateException
replace your code like this
if(sVideoId!=null){
try{
YPlayer.loadVideo(sVideoId);
}
catch(Exception e){
e.printStackTrace();
}
}
handle all exceptions. Do something when you get
android.os.DeadObjectException
回答3:
Kindly Update your app to the latest version of Youtube and it starts working
来源:https://stackoverflow.com/questions/25747226/youtube-player-crashes-with-giving-java-lang-illegalstateexception-android-os-d