0

I use the Firebase to allow users to save URL to play Youtube videos. But if the video is not fully loaded, click the button and it will crash on the next activity. If the video has already been loaded, whether the URL is correct or not, clicking the button to the next page will work.

I put the video of the process in youtube.

When Youtube video is loading then pressing the button will crash

Here is my code:

public class PersonalPageActivity extends YouTubeBaseActivity implements YouTubePlayer.OnInitializedListener,YouTubePlayer.PlaybackEventListener,YouTubePlayer.PlayerStateChangeListener {

private FirebaseAuth mAuth;

ImageView ImageView;
TextView NameTextview,Emailtextview,text;
private String name;
ImageButton videobtn;

YouTubePlayerView playerview;

String API_KEY="AIzaSyAJbnIeJT7HuLHtXHq6eT43SSYialtfElM";
String VIDEO_ID="";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_personal_page);


    ImageView=findViewById(R.id.Imageview);
    NameTextview=findViewById(R.id.NameTextview);
    Emailtextview=findViewById(R.id.Emailtextview);
    text=findViewById(R.id.text);

    playerview=findViewById(R.id.playerview);
    playerview.initialize(API_KEY,this);

    videobtn=findViewById(R.id.videobtn);


    mAuth = FirebaseAuth.getInstance();
    final FirebaseUser currentUser = mAuth.getCurrentUser();


    NameTextview.setText(currentUser.getDisplayName());
    Emailtextview.setText(currentUser.getEmail());

    Profile profile = Profile.getCurrentProfile();
    Uri userPhoto = profile.getProfilePictureUri(350, 350);
    Glide.with(PersonalPageActivity.this)
            .load(userPhoto.toString())
            .into(ImageView);

    videobtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent it = new Intent();
            it.setClass(PersonalPageActivity.this, VideoPageActivity.class);
            startActivity(it);
            finish();
        }
    });

}

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




    youTubePlayer.setPlayerStateChangeListener(this);
    youTubePlayer.setPlaybackEventListener(this);



    if(!b){
        FirebaseDatabase database = FirebaseDatabase.getInstance();
        DatabaseReference myVideo = database.getReference("Youtube");
        mAuth = FirebaseAuth.getInstance();
        final FirebaseUser currentUser = mAuth.getCurrentUser();
        Query q = myVideo.orderByChild("mail").equalTo(currentUser.getEmail());
        q.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot)  {
                for(DataSnapshot ds: dataSnapshot.getChildren()){

                    VIDEO_ID=ds.child("url").getValue().toString();


                    youTubePlayer.cueVideo(VIDEO_ID);
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });


    }
}

@Override
public void onPlaying() {

}

@Override
public void onLoaded(String s) {

}

@Override
public void onLoading() {

}

@Override
public void onVideoStarted() {

}

@Override
public void onVideoEnded() {

}

@Override
public void onError(YouTubePlayer.ErrorReason errorReason) {

}

@Override
public void onAdStarted() {

}

@Override
public void onBuffering(boolean b) {

}

@Override
public void onStopped() {

}

@Override
public void onPaused() {

}

@Override
public void onSeekTo(int i) {

}

@Override
public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult youTubeInitializationResult) {

}

public class Video {

    public String mail;
    public String url;

    public Video(){}
    public Video(String mail, String url){
        this.mail = mail;
        this.url = url;
    }
}
}




public class VideoPageActivity extends AppCompatActivity {

private FirebaseAuth mAuth;

EditText editText;
Button btn;
ImageButton Imgbtn;

FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference myVideo = database.getReference("Youtube");

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_video_page);

    editText=findViewById(R.id.editText);
    btn=findViewById(R.id.btn);
    Imgbtn=findViewById(R.id.Imgbtn);

    Imgbtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            AlertDialog.Builder alert = new AlertDialog.Builder(VideoPageActivity.this ,R.style.AlertDialogStyle);
            alert.setIcon(R.drawable.youtube);
            alert.setTitle("如何新增個人寵物Youtube Video");
            alert.setMessage(" 請先到想上傳的Youtube影片頁面上\n\n"+"以此網站為例\n\n"
                    + "https://www.youtube.com/watch?v=d7VIW1vYQRA\n\n" +
                    "僅需複製  =  後面全部即可\n\n"+"即為d7VIW1vYQRA\n\n"+"再張貼至空格處\n\n"+"點選確定即可新增\n\n"+"若無法新增,請檢查步驟是否有誤");
            alert.setPositiveButton("確定", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {

                }
            });

            alert.show();
        }
    });



    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            if(editText.getText().toString().matches("")) {
                Toast toast = Toast.makeText(VideoPageActivity.this, "您並未輸入網址哦!", Toast.LENGTH_SHORT);
                toast.show();
            }
            else{

                AlertDialog.Builder alert = new AlertDialog.Builder(VideoPageActivity.this ,R.style.AlertDialogStyle);
                alert.setIcon(R.drawable.doghouse);
                alert.setTitle("Take Me Home");
                alert.setMessage("已新增網址");
                alert.setPositiveButton("確定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                        mAuth = FirebaseAuth.getInstance();
                        final FirebaseUser currentUser = mAuth.getCurrentUser();


                        myVideo.addListenerForSingleValueEvent(new ValueEventListener() {
                            @Override
                            public void onDataChange(DataSnapshot dataSnapshot) {
                                for(DataSnapshot ds: dataSnapshot.getChildren()) {

                                    if ((ds.child("mail").getValue().equals(currentUser.getEmail())) ){
                                        String key = ds.getKey();
                                        Video s5 = new Video();
                                        s5.url = editText.getText().toString();
                                        s5.mail=currentUser.getEmail();
                                        myVideo.child(key).setValue(s5);


                                    }

                                    else{
                                        Video s1 = new Video();
                                        s1.url = editText.getText().toString();
                                        s1.mail=currentUser.getEmail();
                                        String k =  myVideo.push().getKey();
                                        myVideo.child(k).setValue(s1);
                                    }

                                    return;

                                }
                            }

                            @Override
                            public void onCancelled(DatabaseError databaseError) {

                            }
                        });

                        Intent it= new Intent();
                        it.setClass(VideoPageActivity.this,PersonalPageActivity.class);
                        startActivity(it);
                        finish();


                    }
                });


                alert.show();

            }



        }
    });


}



public static class Video {

    public String mail;
    public String url;
}


@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) { // 攔截返回鍵
        Intent it= new Intent();
        it.setClass(VideoPageActivity.this,PersonalPageActivity.class);
        startActivity(it);
        finish();
    }
    return true;
}
}

Crash log

    --------- beginning of crash
12-19 14:47:40.214 3331-3331/com.example.jakehuang.takemehome E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.jakehuang.takemehome, PID: 3331
    java.lang.IllegalStateException: This YouTubePlayer has been released
        at hue.a(SourceFile:98)
        at hue.a(SourceFile:209)
        at acye.onTransact(SourceFile:16)
        at android.os.Binder.transact(Binder.java:604)
        at com.google.android.youtube.player.internal.d$a$a.a(Unknown Source:23)
        at com.google.android.youtube.player.internal.s.cueVideo(Unknown Source:2)
        at com.google.android.youtube.player.internal.s.cueVideo(Unknown Source:1)
        at com.example.jakehuang.takemehome.PersonalPageActivity$2.onDataChange(PersonalPageActivity.java:128)
        at com.google.firebase.database.zzp.onDataChange(Unknown Source:7)
        at com.google.android.gms.internal.zzegf.zza(Unknown Source:13)
        at com.google.android.gms.internal.zzeia.zzbyc(Unknown Source:2)
        at com.google.android.gms.internal.zzeig.run(Unknown Source:71)
        at android.os.Handler.handleCallback(Handler.java:789)
        at android.os.Handler.dispatchMessage(Handler.java:98)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6541)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
12-19 14:47:42.512 3331-3581/com.example.jakehuang.takemehome E/StudioProfiler: JVMTI error: 15(JVMTI_ERROR_THREAD_NOT_ALIVE) 
12-19 14:47:42.515 3331-3581/com.example.jakehuang.takemehome I/chatty: uid=10089(u0_a89) Binder:3331_5 identical 3 lines
12-19 14:47:42.515 3331-3581/com.example.jakehuang.takemehome E/StudioProfiler: JVMTI error: 15(JVMTI_ERROR_THREAD_NOT_ALIVE) 
12-19 14:47:55.085 3331-3336/com.example.jakehuang.takemehome I/zygote: Do partial code cache collection, code=245KB, data=133KB
12-19 14:47:55.086 3331-3336/com.example.jakehuang.takemehome I/zygote: After code cache collection, code=242KB, data=132KB
    Increasing code cache capacity to 1024KB
12-19 14:48:08.960 3331-3351/com.example.jakehuang.takemehome W/BiChannelGoogleApi: [FirebaseAuth: ] getGoogleApiForMethod() returned Gms
12-19 14:48:11.418 3331-3581/com.example.jakehuang.takemehome D/FirebaseAuth: Notifying id token listeners about user ( mDhIgMq88SModK2CLEGoS18X52c2 ).
Frank van Puffelen
  • 565,676
  • 79
  • 828
  • 807
Cheng
  • 1
  • 2
  • Where is your Crash Log? you need to share it with question? – AskNilesh Dec 19 '18 at 06:32
  • As a little advice, try not to use "onKeyDown" for that kind of actions (ex starting an Intent), as because holding the key down, the event gets fired multiple times and you will encounter bad behaviors. As about your problem, the crash stacktrace would be awesome ! – Ionut J. Bejan Dec 19 '18 at 06:35
  • added it @NileshRathod – Cheng Dec 19 '18 at 06:53
  • @Cheng check this https://stackoverflow.com/questions/21332765/android-youtube-player-has-been-released and this https://stackoverflow.com/questions/20606709/youtubeapi-illegalstateexception-player-has-been-released – AskNilesh Dec 19 '18 at 06:54
  • @NileshRathod Still don't know how to solve it TAT – Cheng Dec 19 '18 at 07:29
  • @NileshRathod I solved it.Thank you so much! – Cheng Dec 19 '18 at 12:56
  • @Cheng happy to hear that and also Please post your solution as answer so it can help other in future – AskNilesh Dec 19 '18 at 12:58

0 Answers0