This is my Firebase Database structure I'm very new to Android development
and Firebase
. I have some experience in JavaFX
. I'm trying to build a small app that users can listen to music together synchronously. I use MediaPlayer
library to stream music from Firebase storage. But in order to play the music (MediaPlayer object), MediaPlayer object has to been initialized. Whenever I try to play the music, I get a runtime error that MediaPlayer object has not been initialized due to Firebase delay. This is because Firebase methods are asynchronous. I want a method that actually starts the music to wait until MediaPlayer object has been initialized. I've seen some inner interface callback mechanism. But I couldn't make it.
This is my code:
DatabaseReference myRef;
String myUri="https://firebasestorage.googleapis.com/v0/b/listentest-1297.appspot.com/o/Musics%2Fsong.mp3?alt=media&token=23626e51-e062-469e-9204-8405a14051fd";
MediaPlayer mediaPlayer;
boolean isFirstTimePlayClick = true;
int isPlayingFirebase = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_third);
myRef = FirebaseDatabase.getInstance().getReference("MusicRooms");
/*
FirebaseStorage storage = FirebaseStorage.getInstance();
StorageReference storageRef = storage.getReferenceFromUrl("gs://listentest-1297.appspot.com/Musics/song.mp3");
storageRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri) {
myUri = uri.toString();
}
});*/
myRef.child(secondActivity.musicRoomID).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
isPlayingFirebase = dataSnapshot.getValue(MusicRoom.class).getIsPlaying();
playResume();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
public void playPauseBtn(View view) {
if (isPlayingFirebase == 1) {
myRef.child(secondActivity.musicRoomID).child("isPlaying").setValue(0);
} else {
myRef.child(secondActivity.musicRoomID).child("isPlaying").setValue(1);
}
}
public void playResume() {
if (isFirstTimePlayClick) {
try {
mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(myUri);
mediaPlayer.prepare();
mediaPlayer.start();
isFirstTimePlayClick = false;
} catch (Exception e) {
Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_SHORT).show();
}
} else{
if(mediaPlayer.isPlaying()){
mediaPlayer.pause();
}
else{
mediaPlayer.start();
}
}
}