Search code examples
androidlistviewandroid-sdcardillegalstateexceptionplaylist

Illeagal state exception while trying to play the next song from playlist


I am able to play a selected song from playlist but having illeagal state exception when trying to play the next song from the playlist. Able to get the path of the next song. Songs are retrieved from sd card. What am I doing wrong? What is the problem?

package com.example.mp3;


import java.io.File;
import java.io.IOException;
import java.util.ArrayList;

import android.app.ActionBar;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.preference.PreferenceManager;

import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;

import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Toast;


public class MainActivity extends Activity implements View.OnClickListener, OnCompletionListener {

    ListView list;
    ArrayAdapter<String> listAdapter ;
    ArrayList<String> listTest;
     ArrayList<String> listSoundNames;
    ImageButton play,stop,back,next;
    String songpath,song,strNURL,strNTITLE;
    int index,current_position;
    File[] listFile;
    SharedPreferences sharedPref;
    MediaPlayer mp;
    private static final String TAG = MainActivity.class.getSimpleName();

    @Override
    protected void onCreate(Bundle savedInstanceState) {



        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        sharedPref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
        song = sharedPref.getString("songname", "name");

        mp=new MediaPlayer();

        mp.setOnCompletionListener(this);


        list = (ListView)findViewById(R.id.list);
        listTest = new ArrayList<String>( );
        listSoundNames=new ArrayList<String>();

        play = (ImageButton)findViewById(R.id.play);
        back = (ImageButton)findViewById(R.id.prev);
        next = (ImageButton)findViewById(R.id.next);

        //adding listeners
        play.setOnClickListener(this);
        back.setOnClickListener(this);
        next.setOnClickListener(this);


        //action bar controls
        ActionBar bar = getActionBar();
        bar.setBackgroundDrawable(new ColorDrawable(Color.parseColor("#DF0174")));

        Scanner("/sdcard/");////storage path


        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        /////////////////////////////////////*Adding listener to songs*//////////////////////////////////////////////////
        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////

        if(listTest.size() != 0)
        {
            listAdapter = new ArrayAdapter<String> (MainActivity.this,R.layout.simplerow, listSoundNames);
            list.setAdapter(listAdapter);
            list.setOnItemClickListener(new OnItemClickListener() 
            {
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) //can two text be accessed here??
            {
                index = position;

                //accessing the song name
                String name = (String) ((TextView) view).getText();
                //Log.e(TAG, name);

                Toast.makeText(getApplicationContext(), name, Toast.LENGTH_SHORT).show();
                try{
                    mp.reset();
                    mp.setDataSource(listTest.get(position));//source
                    mp.prepare();
                    mp.start();
                    play.setImageResource(R.drawable.pause);
                    }
                catch(Exception e){e.printStackTrace();}



            }


            });




            }

        }



        ////////////////////////////////////////////////////////////////////////////////////////////
        //////////////////////////////////*Songs added here to list*////////////////////////////////
        ////////////////////////////////////////////////////////////////////////////////////////////

        private void Scanner(String path) {
            // TODO Auto-generated method stub
            {
                try 
                {
                        File fl = new File(path);
                        File[] listOfFiles = fl.listFiles();              

                        for (File listOfFile : listOfFiles)
                         {
                            String s = listOfFile.getName();

                            if(s.endsWith(".mp3"))
                            {

                            songpath = listOfFile.getPath();
                            listTest.add(songpath);//adding song names to list
                            //listTest.toString().replaceFirst(songpath, s);



                            // store file name in listSoundNames
                            int pos = s.lastIndexOf(".");
                            if (pos > 0)
                            {
                                song = s.substring(0, pos);
                            }
                            listSoundNames.add(song);

                            }


                            /////////////////////////////////
                            File f = new File(path+s+"/");
                            if (f.exists() && f.isDirectory()) {
                            Scanner(path+s+"/");
                            }
                            ////////////////////////////////


                        }



                }
            catch (Exception e) { }
            }

            }








    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub

        if (v.equals(play))
        {
            if(mp.isPlaying())
            {
                mp.pause();
                Toast.makeText(MainActivity.this, "paused", Toast.LENGTH_SHORT).show();
                //change in button image//
                play.setImageResource(R.drawable.play);

            }
            else
            {
                mp.start();
                Toast.makeText(MainActivity.this, "started", Toast.LENGTH_SHORT).show();
                //change in button image//
                play.setImageResource(R.drawable.pause);
                //
            }
        }


            if (v.equals(back))
            {
                //mp.setDataSource(Uri.parse(listTest.get(index).toString()));
                //index= mp.getCurrentPosition();
                //index = list.getCheckedItemPosition();
                //index = index -1;
                //mp.setDataSource(Uri.parse(listTest.get(index).toString()));
                /*try {
                    mp.setDataSource(listTest.get(index));
                    mp.prepare();
                    mp.start();
                } catch (IllegalArgumentException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (SecurityException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IllegalStateException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                */

                  Toast.makeText(MainActivity.this, ""+index, Toast.LENGTH_SHORT).show();
            }


            if (v.equals(next))
            {

                mp.stop();
                index = index +1;

                Uri uri = Uri.parse(listTest.get(index).toString());//getting the path of next song
                try {


                    mp.setDataSource(getApplicationContext(), uri);//setting new data source 


                } catch (IllegalArgumentException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (SecurityException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IllegalStateException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    Toast.makeText(MainActivity.this, "ERROR", Toast.LENGTH_SHORT).show();///PROBLEM:MOVING HERE AFTER CLICKING NEXT BUTTON
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                try {
                    mp.prepare();
                } catch (IllegalStateException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }        
                mp.start();//PROBLEM: NOT PLAYING
                Toast.makeText(MainActivity.this, ""+uri, Toast.LENGTH_SHORT).show();
            }


    }


    @Override
    public void onCompletion(MediaPlayer arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    protected void onPause() {
        super.onPause();
        mp.stop();
        Toast.makeText(getApplicationContext(), "paused", Toast.LENGTH_LONG).show();

    }

}

LOGCAT:

> 10-09 13:19:49.995: E/MediaPlayer(6863): attachNewPlayer called in
> state 64 10-09 13:19:49.997: W/System.err(6863):
> java.lang.IllegalStateException 10-09 13:19:50.009:
> W/System.err(6863):   at android.media.MediaPlayer.setDataSource(Native
> Method) 10-09 13:19:50.010: W/System.err(6863):   at
> android.media.MediaPlayer.setDataSource(MediaPlayer.java:984) 10-09
> 13:19:50.010: W/System.err(6863):     at
> android.media.MediaPlayer.setDataSource(MediaPlayer.java:963) 10-09
> 13:19:50.010: W/System.err(6863):     at
> android.media.MediaPlayer.setDataSource(MediaPlayer.java:926) 10-09
> 13:19:50.010: W/System.err(6863):     at
> android.media.MediaPlayer.setDataSource(MediaPlayer.java:874) 10-09
> 13:19:50.011: W/System.err(6863):     at
> android.media.MediaPlayer.setDataSource(MediaPlayer.java:858) 10-09
> 13:19:50.011: W/System.err(6863):     at
> com.example.mp3.MainActivity.onClick(MainActivity.java:258) 10-09
> 13:19:50.011: W/System.err(6863):     at
> android.view.View.performClick(View.java:4212) 10-09 13:19:50.011:
> W/System.err(6863):   at
> android.view.View$PerformClick.run(View.java:17476) 10-09
> 13:19:50.012: W/System.err(6863):     at
> android.os.Handler.handleCallback(Handler.java:800) 10-09
> 13:19:50.012: W/System.err(6863):     at
> android.os.Handler.dispatchMessage(Handler.java:100) 10-09
> 13:19:50.012: W/System.err(6863):     at
> android.os.Looper.loop(Looper.java:194) 10-09 13:19:50.012:
> W/System.err(6863):   at
> android.app.ActivityThread.main(ActivityThread.java:5371) 10-09
> 13:19:50.012: W/System.err(6863):     at
> java.lang.reflect.Method.invokeNative(Native Method) 10-09
> 13:19:50.012: W/System.err(6863):     at
> java.lang.reflect.Method.invoke(Method.java:525) 10-09 13:19:50.012:
> W/System.err(6863):   at
> com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
> 10-09 13:19:50.013: W/System.err(6863):   at
> com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600) 10-09
> 13:19:50.013: W/System.err(6863):     at
> dalvik.system.NativeStart.main(Native Method) 10-09 13:19:50.020:
> D/MediaPlayer(6863): Don't notify duration to com.example.mp3! 10-09
> 13:19:51.606: V/Provider/Settings(6863):  from settings cache , name =
> sound_effects_enabled , value = 0 10-09 13:19:51.629:
> I/SurfaceTextureClient(6863): [STC::queueBuffer] (this:0x516f4640)
> fps:0.32, dur:6177.53, max:6150.98, min:26.54 10-09 13:19:51.629:
> I/SurfaceTextureClient(6863): [STC::queueBuffer] this:0x516f4640,
> api:1, last queue time elapsed:6150.98

Solution

  • StateListExceptions

    Before changing MediaPlayer dataSource you need to set MP state back to idle, by calling reset(), and than prepare() it again