my app crashes when I press the play button multiple times and I don't know what to do. the music is streamed from the URL of the firebase. Any suggestions in the code would be appreciated. Also the please note that the button is basically a clickable image view which changes its images on click.
is my sequence of media player class is correct or not I don't know but it eventually crashes my app when click play button multiple times
ImageView play,download;
TextView name;
MediaPlayer mediaPlayer;
DownloadManager downloadManager;
Boolean nir=true;
DrawerLayout drawer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_music_info);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
final NavigationView navigationView=findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
mediaPlayer = new MediaPlayer();
final int index=getIntent().getIntExtra("audiourl",0);
play=findViewById(R.id.play);
download=findViewById(R.id.download);
name=findViewById(R.id.name);
String url=array_class.arrayurl2.get(index).getUrl();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
name.setText(array_class.arrayurl2.get(index).getName());
play.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(nir) {
mediaPlayer.stop();
mediaPlayer.reset();
play.setImageResource(R.drawable.pause_white);
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
new Player().execute(array_class.arrayurl2.get(index).getUrl());
Toast.makeText(music_info.this, "please wait", Toast.LENGTH_SHORT).show();
nir=false;
}else {
mediaPlayer.stop();
play.setImageResource(R.drawable.play_white);
nir=true;
}
}
});
download.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
downloadManager=(DownloadManager)getSystemService(Context.DOWNLOAD_SERVICE);
Uri uri= Uri.parse(array_class.arrayurl2.get(index).getUrl());
DownloadManager.Request request=new DownloadManager.Request(uri);
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
request.setMimeType("audio/MP3");
request.allowScanningByMediaScanner();
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS,array_class.arrayurl2.get(index).getName()+".mp3");
request.setTitle(array_class.arrayurl2.get(index).getName());
Long reference=downloadManager.enqueue(request);
}
});
drawer = findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle=new ActionBarDrawerToggle(this,drawer,toolbar,
R.string.navigation_drawer_open,R.string.navigation_drawer_close);
drawer.addDrawerListener(toggle);
toggle.syncState();
setResult(1);
}
@Override
public void onBackPressed() {
mediaPlayer.stop();
if (drawer.isDrawerOpen(GravityCompat.START)){
drawer.closeDrawer(GravityCompat.START);
}else {
finish();
super.onBackPressed();
}
}
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
switch (menuItem.getItemId()){
case R.id.nav_wallpaper:
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,new fragment_wallpaper())
.commit();
break;
case R.id.nav_ringtone:
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,new fragment_ringtone())
.commit();
break;
}
drawer.closeDrawer(GravityCompat.START);
return true;
}
public class Player extends AsyncTask<String, Void, Void> {
@Override
protected Void doInBackground(String... params) {
String url=params[0];
try {
mediaPlayer.setDataSource(url);
} catch (IOException e) {
e.printStackTrace();
}
try {
mediaPlayer.prepare(); // log is pointing problem is here
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void avoid) {
mediaPlayer.start();
}
@Override
protected void onPreExecute() {
mediaPlayer.stop();
}
}
}
logs
E/MediaPlayerNative: stop called in state 4, mPlayer(0x794ab11fc0)
error (-38, 0)
E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
Process: com.napps.wallpaper, PID: 25749
java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:354)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
at java.util.concurrent.FutureTask.run(FutureTask.java:271)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:764)
Caused by: java.lang.IllegalStateException
at android.media.MediaPlayer._prepare(Native Method)
at android.media.MediaPlayer.prepare(MediaPlayer.java:1335)
at com.napps.wallpaper.music_info$Player.doInBackground(music_info.java:158)
at com.napps.wallpaper.music_info$Player.doInBackground(music_info.java:146)
at android.os.AsyncTask$2.call(AsyncTask.java:333)