0

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)

Phantômaxx
  • 37,901
  • 21
  • 84
  • 115
john
  • 31
  • 5
  • Please also post the stacktrace. – user3673952 Jun 08 '20 at 16:08
  • now you can see i have added where there is problem and also logs. – john Jun 08 '20 at 16:12
  • check this: https://stackoverflow.com/a/49101309/8475893 – prashant17 Jun 08 '20 at 16:55
  • you can't do `mediaplayer.start()` after `mediaplayer.stop()`. This caused the `IllegalStateException`you get. Read [this](https://developer.android.com/reference/android/media/MediaPlayer#:~:text=When%20a%20MediaPlayer%20object%20is,cycle%20of%20the%20MediaPlayer%20object). Change `mediaplayer.stop()` to `mediaplayer.pause()` – GGK stands for Ukraine Jun 24 '20 at 08:19

0 Answers0