Android app force closes when playing next song in array list

与世无争的帅哥 提交于 2019-12-25 07:29:02

问题


I'm creating an android app (for my own use) that lets me listen to my favourite songs from GTA V. Media Player streams the mp3 tracks from my dropbox account and all this works fine.

The problem is that after the first song finishes I want it to play the next song however when I run the app after the first song finishes playing the app crashes instead of playing the next song in the list.

Can somebody help me fix this issue i'm having?

thanks.

Code

public class channelx extends Activity implements MediaPlayer.OnPreparedListener {

    Button play, pause, home, refresh;
    protected Dialog mSplashDialog;

     private int playlistPos = 0;
        private List<Uri> myUris = new ArrayList<Uri>();
        private MediaPlayer sdrPlayer = new MediaPlayer();

    /** Called when the activity is first created. */@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.channelx);

        final ProgressDialog progressDialog = new ProgressDialog(channelx.this);

        progressDialog.setCancelable(false);
        progressDialog.setIndeterminate(true);
        progressDialog.setMessage("Loading...");
        progressDialog.show();

        final Timer t = new Timer();
        t.schedule(new TimerTask() {
            public void run() {
                progressDialog.dismiss(); 
                t.cancel(); 
            }
        }, 5000); 

        play = (Button) findViewById(R.id.play);
        pause = (Button) findViewById(R.id.pause);
        home = (Button) findViewById(R.id.home);
        refresh = (Button) findViewById(R.id.refresh);

         myUris.add(Uri.parse("https://db.tt/4ANlGRms"));
         myUris.add(Uri.parse("https://db.tt/TpmxsqGJ"));

         myUris.add(Uri.parse("https://db.tt/rbkYtuNI"));
         myUris.add(Uri.parse("https://db.tt/JYVHp9nm"));
         myUris.add(Uri.parse("https://db.tt/xWLATUQp"));
         myUris.add(Uri.parse("https://db.tt/WzV2TzFu"));
            // Add the others as well...

            initSong(myUris.get(playlistPos));

            sdrPlayer.setOnCompletionListener(new OnCompletionListener() {
                public void onCompletion(MediaPlayer mp) {
                    sdrPlayer.reset();

                    playlistPos++;
                    initSong(myUris.get(playlistPos));


                    sdrPlayer.start(); // Start it as well if you wish
                }
            });



        play.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                sdrPlayer.start();
            }
        }
        );


        pause.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                sdrPlayer.pause();
            }
        });

        home.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                AlertDialog.Builder builder1 = new AlertDialog.Builder(channelx.this);
                builder1.setMessage("Are you sure you want to leave this station? Playback will be stopped.");
                builder1.setCancelable(true);
                builder1.setPositiveButton("Continue",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {

                        sdrPlayer.stop();
                        Intent intent = new Intent(channelx.this, MainActivity.class);
                        startActivity(intent);
                    }
                });
                builder1.setNegativeButton("Cancel",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        dialog.cancel();
                    }
                });

                AlertDialog alert11 = builder1.create();
                alert11.show();

            }
        });

        refresh.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                sdrPlayer.stop();
                Intent intent = new Intent(channelx.this, channelx.class);
                startActivity(intent);
            }
        });

    }

    @Override
    public void onPrepared(MediaPlayer mp) {

    }

    public void initSong(Uri myUri) {
        try {
            sdrPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            sdrPlayer.setDataSource(this, myUri);           
            sdrPlayer.prepareAsync(); // don't use prepareAsync for mp3 playback
        }
        catch (IOException e) {

            e.printStackTrace();
            Toast.makeText(channelx.this,
                       "Please turn on WiFi and try again",
                       Toast.LENGTH_LONG).show();
        }
    }




}

LogCat

05-26 15:37:14.574: D/MediaPlayer(16744): mIsAboveSense55:-1
05-26 15:37:14.574: D/MediaPlayer(16744): sense_version:5.5
05-26 15:37:14.574: D/MediaPlayer(16744): ver s1:   55000
05-26 15:37:14.574: D/MediaPlayer(16744): ver s2:   55000
05-26 15:37:14.664: V/MediaPlayer(16744): network type=wifi
05-26 15:37:14.664: D/MediaPlayer(16744): mIsAboveSense55:1
05-26 15:37:14.694: D/MediaPlayer(16744): Couldn't open file on client side, trying server side
05-26 15:37:14.694: I/MediaPlayer(16744): setLPAflag() in
05-26 15:37:14.704: D/MediaPlayer(16744): SystemProperties.get htc.audio.mirrorlink.status: 
05-26 15:37:14.704: D/MediaPlayer(16744): set AwesomePlayer LPA flag to false +
05-26 15:37:14.704: D/MediaPlayer(16744): set AwesomePlayer LPA flag to false -
05-26 15:37:14.704: I/MediaPlayer(16744): setLPAflag() out
05-26 15:37:14.754: D/MediaPlayer(16744): Mediaplayer receives message, message type: 8
05-26 15:37:22.833: W/MediaPlayer(16744): info/warning (1, 902)
05-26 15:37:22.833: D/MediaPlayer(16744): Mediaplayer receives message, message type: 200
05-26 15:37:22.833: D/MediaPlayer(16744): Mediaplayer receives message, message type: 5
05-26 15:37:22.833: D/MediaPlayer(16744): Mediaplayer receives message, message type: 1
05-26 15:37:22.853: E/MediaPlayer(16744): Should have subtitle controller already set
05-26 15:37:24.044: D/[MediaPluginDLNA](16744): [getIsRegionSupported] sRegionCode: 6
05-26 15:37:24.044: D/[MediaPluginDLNA](16744): not in Mirror mode
05-26 15:37:24.044: D/MediaPlayer(16744): doStart() in
05-26 15:37:24.044: D/MediaPlayer(16744): Htc_getIntParameter = 902
05-26 15:37:24.184: D/MediaPlayer(16744): Mediaplayer receives message, message type: 6
05-26 15:37:25.115: D/MediaPlayer(16744): Mediaplayer receives message, message type: 7
05-26 15:37:26.176: W/MediaPlayer(16744): info/warning (703, 0)
05-26 15:37:26.176: W/MediaPlayer(16744): info/warning (701, 0)
05-26 15:37:26.176: D/MediaPlayer(16744): Mediaplayer receives message, message type: 200
05-26 15:37:26.186: D/MediaPlayer(16744): Mediaplayer receives message, message type: 200
05-26 15:37:27.177: W/MediaPlayer(16744): info/warning (702, 0)
05-26 15:37:27.207: D/MediaPlayer(16744): Mediaplayer receives message, message type: 200
05-26 15:37:28.238: D/MediaPlayer(16744): Mediaplayer receives message, message type: 7
05-26 15:37:29.370: W/MediaPlayer(16744): info/warning (703, 0)
05-26 15:37:29.370: W/MediaPlayer(16744): info/warning (701, 0)
05-26 15:37:29.370: D/MediaPlayer(16744): Mediaplayer receives message, message type: 200
05-26 15:37:29.370: D/MediaPlayer(16744): Mediaplayer receives message, message type: 200
05-26 15:37:30.391: W/MediaPlayer(16744): info/warning (702, 0)
05-26 15:37:30.401: D/MediaPlayer(16744): Mediaplayer receives message, message type: 200
05-26 15:37:31.412: D/MediaPlayer(16744): Mediaplayer receives message, message type: 7
05-26 15:37:31.612: W/MediaPlayer(16744): info/warning (703, 0)
05-26 15:37:31.612: W/MediaPlayer(16744): info/warning (701, 0)
05-26 15:37:31.612: D/MediaPlayer(16744): Mediaplayer receives message, message type: 200
05-26 15:37:31.612: D/MediaPlayer(16744): Mediaplayer receives message, message type: 200
05-26 15:37:32.433: W/MediaPlayer(16744): info/warning (702, 0)
05-26 15:37:32.433: D/MediaPlayer(16744): Mediaplayer receives message, message type: 200
05-26 15:39:16.584: D/MediaPlayer(16744): Mediaplayer receives message, message type: 7
05-26 15:39:16.764: E/MediaPlayer(16744): internal/external state mismatch corrected
05-26 15:39:16.774: D/MediaPlayer(16744): Mediaplayer receives message, message type: 2
05-26 15:39:16.774: D/MediaPlayer(16744): reset() in
05-26 15:39:16.814: D/MediaPlayer(16744): reset() out
05-26 15:39:16.814: D/MediaPlayer(16744): reset() out
05-26 15:39:16.824: D/MediaPlayer(16744): mIsAboveSense55:1
05-26 15:39:16.864: V/MediaPlayer(16744): network type=wifi
05-26 15:39:16.864: D/MediaPlayer(16744): mIsAboveSense55:1
05-26 15:39:16.894: D/MediaPlayer(16744): Couldn't open file on client side, trying server side
05-26 15:39:16.894: I/MediaPlayer(16744): setLPAflag() in
05-26 15:39:16.894: D/MediaPlayer(16744): SystemProperties.get htc.audio.mirrorlink.status: 
05-26 15:39:16.904: D/MediaPlayer(16744): set AwesomePlayer LPA flag to false +
05-26 15:39:16.904: D/MediaPlayer(16744): set AwesomePlayer LPA flag to false -
05-26 15:39:16.904: I/MediaPlayer(16744): setLPAflag() out
05-26 15:39:16.904: D/[MediaPluginDLNA](16744): [getIsRegionSupported] sRegionCode: 6
05-26 15:39:16.904: D/MediaPlayer(16744): doStart() in
05-26 15:39:16.904: D/MediaPlayer(16744): Htc_getIntParameter = 0
05-26 15:39:16.904: E/MediaPlayer(16744): start called in state 4
05-26 15:39:16.904: E/MediaPlayer(16744): error (-38, 0)
05-26 15:39:16.904: D/MediaPlayer(16744): start() out
05-26 15:39:16.904: D/MediaPlayer(16744): U58 Send PlaybackCompleteEvent
05-26 15:39:16.924: D/MediaPlayer(16744): Mediaplayer receives message, message type: 100
05-26 15:39:16.924: E/MediaPlayer(16744): Error (-38,0)
05-26 15:39:16.924: D/MediaPlayer(16744): reset() in
05-26 15:39:16.924: D/MediaPlayer(16744): reset() out
05-26 15:39:16.924: D/MediaPlayer(16744): reset() out
05-26 15:39:16.934: E/MediaPlayer(16744): error (1, -107)
05-26 15:39:16.934: D/MediaPlayer(16744): mIsAboveSense55:1
05-26 15:39:16.934: V/MediaPlayer(16744): network type=wifi
05-26 15:39:16.934: D/MediaPlayer(16744): mIsAboveSense55:1
05-26 15:39:16.934: D/MediaPlayer(16744): Couldn't open file on client side, trying server side
05-26 15:39:16.934: I/MediaPlayer(16744): setLPAflag() in
05-26 15:39:16.934: D/MediaPlayer(16744): SystemProperties.get htc.audio.mirrorlink.status: 
05-26 15:39:16.934: D/MediaPlayer(16744): set AwesomePlayer LPA flag to false +
05-26 15:39:16.934: D/MediaPlayer(16744): set AwesomePlayer LPA flag to false -
05-26 15:39:16.934: I/MediaPlayer(16744): setLPAflag() out
05-26 15:39:16.934: D/[MediaPluginDLNA](16744): [getIsRegionSupported] sRegionCode: 6
05-26 15:39:16.934: D/MediaPlayer(16744): doStart() in
05-26 15:39:16.944: D/MediaPlayer(16744): Htc_getIntParameter = 0
05-26 15:39:16.944: E/MediaPlayer(16744): start called in state 4
05-26 15:39:16.944: E/MediaPlayer(16744): error (-38, 0)
05-26 15:39:16.944: D/MediaPlayer(16744): start() out
05-26 15:39:16.944: D/MediaPlayer(16744): Mediaplayer receives message, message type: 100
05-26 15:39:16.944: E/MediaPlayer(16744): Error (1,-107)
05-26 15:39:16.944: D/MediaPlayer(16744): reset() in
05-26 15:39:16.944: D/MediaPlayer(16744): reset() out
05-26 15:39:16.944: D/MediaPlayer(16744): reset() out
05-26 15:39:16.944: D/MediaPlayer(16744): mIsAboveSense55:1
05-26 15:39:16.944: E/MediaPlayer(16744): error (1, -107)
05-26 15:39:16.955: V/MediaPlayer(16744): network type=wifi
05-26 15:39:16.955: D/MediaPlayer(16744): mIsAboveSense55:1
05-26 15:39:16.965: D/MediaPlayer(16744): Couldn't open file on client side, trying server side
05-26 15:39:16.965: I/MediaPlayer(16744): setLPAflag() in
05-26 15:39:16.965: D/MediaPlayer(16744): SystemProperties.get htc.audio.mirrorlink.status: 
05-26 15:39:16.975: D/MediaPlayer(16744): set AwesomePlayer LPA flag to false +
05-26 15:39:16.975: D/MediaPlayer(16744): set AwesomePlayer LPA flag to false -
05-26 15:39:16.975: I/MediaPlayer(16744): setLPAflag() out
05-26 15:39:16.975: D/[MediaPluginDLNA](16744): [getIsRegionSupported] sRegionCode: 6
05-26 15:39:16.975: D/MediaPlayer(16744): doStart() in
05-26 15:39:16.975: D/MediaPlayer(16744): Htc_getIntParameter = 0
05-26 15:39:16.975: E/MediaPlayer(16744): start called in state 4
05-26 15:39:16.975: E/MediaPlayer(16744): error (-38, 0)
05-26 15:39:16.975: D/MediaPlayer(16744): start() out
05-26 15:39:16.975: D/MediaPlayer(16744): Mediaplayer receives message, message type: 100
05-26 15:39:16.975: E/MediaPlayer(16744): Error (1,-107)
05-26 15:39:16.975: D/MediaPlayer(16744): reset() in
05-26 15:39:16.975: D/MediaPlayer(16744): reset() out
05-26 15:39:16.975: D/MediaPlayer(16744): reset() out
05-26 15:39:16.975: D/MediaPlayer(16744): mIsAboveSense55:1
05-26 15:39:16.985: E/MediaPlayer(16744): error (1, -107)
05-26 15:39:16.985: V/MediaPlayer(16744): network type=wifi
05-26 15:39:16.985: D/MediaPlayer(16744): mIsAboveSense55:1
05-26 15:39:16.995: D/MediaPlayer(16744): Couldn't open file on client side, trying server side
05-26 15:39:16.995: I/MediaPlayer(16744): setLPAflag() in
05-26 15:39:16.995: D/MediaPlayer(16744): SystemProperties.get htc.audio.mirrorlink.status: 
05-26 15:39:16.995: D/MediaPlayer(16744): set AwesomePlayer LPA flag to false +
05-26 15:39:16.995: D/MediaPlayer(16744): set AwesomePlayer LPA flag to false -
05-26 15:39:16.995: I/MediaPlayer(16744): setLPAflag() out
05-26 15:39:17.005: D/[MediaPluginDLNA](16744): [getIsRegionSupported] sRegionCode: 6
05-26 15:39:17.005: D/MediaPlayer(16744): doStart() in
05-26 15:39:17.005: D/MediaPlayer(16744): Htc_getIntParameter = 0
05-26 15:39:17.005: E/MediaPlayer(16744): start called in state 4
05-26 15:39:17.005: E/MediaPlayer(16744): error (-38, 0)
05-26 15:39:17.005: D/MediaPlayer(16744): start() out
05-26 15:39:17.005: D/MediaPlayer(16744): Mediaplayer receives message, message type: 100
05-26 15:39:17.005: E/MediaPlayer(16744): Error (1,-107)
05-26 15:39:17.005: D/MediaPlayer(16744): reset() in
05-26 15:39:17.005: D/MediaPlayer(16744): reset() out
05-26 15:39:17.005: D/MediaPlayer(16744): reset() out
05-26 15:39:17.005: D/MediaPlayer(16744): mIsAboveSense55:1
05-26 15:39:17.015: E/MediaPlayer(16744): error (1, -107)
05-26 15:39:17.015: V/MediaPlayer(16744): network type=wifi
05-26 15:39:17.015: D/MediaPlayer(16744): mIsAboveSense55:1
05-26 15:39:17.015: D/MediaPlayer(16744): Couldn't open file on client side, trying server side
05-26 15:39:17.025: I/MediaPlayer(16744): setLPAflag() in
05-26 15:39:17.025: D/MediaPlayer(16744): SystemProperties.get htc.audio.mirrorlink.status: 
05-26 15:39:17.025: D/MediaPlayer(16744): set AwesomePlayer LPA flag to false +
05-26 15:39:17.025: D/MediaPlayer(16744): set AwesomePlayer LPA flag to false -
05-26 15:39:17.025: I/MediaPlayer(16744): setLPAflag() out
05-26 15:39:17.025: D/[MediaPluginDLNA](16744): [getIsRegionSupported] sRegionCode: 6
05-26 15:39:17.025: D/MediaPlayer(16744): doStart() in
05-26 15:39:17.025: D/MediaPlayer(16744): Htc_getIntParameter = 0
05-26 15:39:17.025: E/MediaPlayer(16744): start called in state 4
05-26 15:39:17.025: E/MediaPlayer(16744): error (-38, 0)
05-26 15:39:17.025: D/MediaPlayer(16744): start() out
05-26 15:39:17.025: D/MediaPlayer(16744): Mediaplayer receives message, message type: 100
05-26 15:39:17.025: E/MediaPlayer(16744): Error (1,-107)
05-26 15:39:17.025: D/MediaPlayer(16744): reset() in
05-26 15:39:17.035: D/MediaPlayer(16744): reset() out
05-26 15:39:17.035: D/MediaPlayer(16744): reset() out
05-26 15:39:17.035: W/dalvikvm(16744): threadid=1: thread exiting with uncaught exception (group=0x4167de18)
05-26 15:39:17.035: E/MediaPlayer(16744): error (1, -107)
05-26 15:39:17.045: E/AndroidRuntime(16744): FATAL EXCEPTION: main
05-26 15:39:17.045: E/AndroidRuntime(16744): Process: com.example.gtavradio, PID: 16744
05-26 15:39:17.045: E/AndroidRuntime(16744): java.lang.IndexOutOfBoundsException: Invalid index 6, size is 6
05-26 15:39:17.045: E/AndroidRuntime(16744):    at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
05-26 15:39:17.045: E/AndroidRuntime(16744):    at java.util.ArrayList.get(ArrayList.java:308)
05-26 15:39:17.045: E/AndroidRuntime(16744):    at com.example.gtavradio.channelx$2.onCompletion(channelx.java:75)
05-26 15:39:17.045: E/AndroidRuntime(16744):    at android.media.MediaPlayer$EventHandler.handleMessage(MediaPlayer.java:3162)
05-26 15:39:17.045: E/AndroidRuntime(16744):    at android.os.Handler.dispatchMessage(Handler.java:102)
05-26 15:39:17.045: E/AndroidRuntime(16744):    at android.os.Looper.loop(Looper.java:157)
05-26 15:39:17.045: E/AndroidRuntime(16744):    at android.app.ActivityThread.main(ActivityThread.java:5872)
05-26 15:39:17.045: E/AndroidRuntime(16744):    at java.lang.reflect.Method.invokeNative(Native Method)
05-26 15:39:17.045: E/AndroidRuntime(16744):    at java.lang.reflect.Method.invoke(Method.java:515)
05-26 15:39:17.045: E/AndroidRuntime(16744):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1069)
05-26 15:39:17.045: E/AndroidRuntime(16744):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:885)
05-26 15:39:17.045: E/AndroidRuntime(16744):    at dalvik.system.NativeStart.main(Native Method)
05-26 15:39:19.918: D/Process(16744): killProcess, pid=16744
05-26 15:39:19.918: D/Process(16744): com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException:131 java.lang.ThreadGroup.uncaughtException:693 java.lang.ThreadGroup.uncaughtException:690 

EDIT: ignore some of the daft commentary on my code

NEW LOG

05-26 16:20:11.884: E/MediaPlayer(1530): attachNewPlayer called in state 128
05-26 16:20:11.884: W/dalvikvm(1530): threadid=1: thread exiting with uncaught exception (group=0x4167de18)
05-26 16:20:11.904: E/AndroidRuntime(1530): FATAL EXCEPTION: main
05-26 16:20:11.904: E/AndroidRuntime(1530): Process: com.example.gtavradio, PID: 1530
05-26 16:20:11.904: E/AndroidRuntime(1530): java.lang.IllegalStateException
05-26 16:20:11.904: E/AndroidRuntime(1530):     at android.media.MediaPlayer._setDataSource(Native Method)
05-26 16:20:11.904: E/AndroidRuntime(1530):     at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1236)
05-26 16:20:11.904: E/AndroidRuntime(1530):     at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1203)
05-26 16:20:11.904: E/AndroidRuntime(1530):     at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1137)
05-26 16:20:11.904: E/AndroidRuntime(1530):     at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1032)
05-26 16:20:11.904: E/AndroidRuntime(1530):     at com.example.gtavradio.channelx.initSong(channelx.java:155)
05-26 16:20:11.904: E/AndroidRuntime(1530):     at com.example.gtavradio.channelx$2.onCompletion(channelx.java:78)
05-26 16:20:11.904: E/AndroidRuntime(1530):     at android.media.MediaPlayer$EventHandler.handleMessage(MediaPlayer.java:3089)
05-26 16:20:11.904: E/AndroidRuntime(1530):     at android.os.Handler.dispatchMessage(Handler.java:102)
05-26 16:20:11.904: E/AndroidRuntime(1530):     at android.os.Looper.loop(Looper.java:157)
05-26 16:20:11.904: E/AndroidRuntime(1530):     at android.app.ActivityThread.main(ActivityThread.java:5872)
05-26 16:20:11.904: E/AndroidRuntime(1530):     at java.lang.reflect.Method.invokeNative(Native Method)
05-26 16:20:11.904: E/AndroidRuntime(1530):     at java.lang.reflect.Method.invoke(Method.java:515)
05-26 16:20:11.904: E/AndroidRuntime(1530):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1069)
05-26 16:20:11.904: E/AndroidRuntime(1530):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:885)
05-26 16:20:11.904: E/AndroidRuntime(1530):     at dalvik.system.NativeStart.main(Native Method)

EDIT this code now doesn't crash the app but it still doesn't play the next song automatically, I have to repress play to get it to play the next song

sdrPlayer.setOnCompletionListener(new OnCompletionListener() {
                public void onCompletion(MediaPlayer mp) {
                    sdrPlayer.stop();
                            sdrPlayer.reset();


                    playlistPos++;
                    if (playlistPos == myUris.size()) {
                        playlistPos = 0;
                    }
                    initSong(myUris.get(playlistPos));

                    //sdrPlayer.start(); // Start it as well if you wish
                }
            });

回答1:


You've got an array index out of bounds exception -- I assume this is caused by

playlistPos++;
initSong(myUris.get(playlistPos));

Just check that the playlistPos isn't greater than the playlist size:

playlistPos++;

if (playlistPos == myUris.size()) {
    playlistPos = 0;
}

initSong(myUris.get(playlistPos));

Which will loop the playlist for you.

Now, to prevent the other error you're getting, try removing the sdrPlayer.start() from the onCompletionListener, and only call start when the player is prepared.

sdrPlayer.setOnPreparedListener(new OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {
        sdrPlayer.start();
    }
});

EDIT : Here is some working code:

public class MainActivity extends Activity {

    private MediaPlayer mp;
    private int playlistPos = 0;
    private List<Uri> playlist;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        playlist = createPlaylist();
        mp = new MediaPlayer();
        initMediaPlayer();
        initSong();
    }


    private void initMediaPlayer() {
        mp.setOnCompletionListener(new OnCompletionListener() {

            @Override
            public void onCompletion(MediaPlayer mp) {
                playlistPos++;

                if (playlistPos == playlist.size()) {
                    playlistPos = 0;
                }

                initSong();
            }
        });

        mp.setOnPreparedListener(new OnPreparedListener() {

            @Override
            public void onPrepared(MediaPlayer mp) {
                mp.start();
            }
        });
    }


    private void initSong() {
        mp.reset();
        try {
            mp.setDataSource(this, playlist.get(playlistPos));
        }
        catch (IOException e) {
            e.printStackTrace();
        }

        mp.prepareAsync();
    }


    private List<Uri> createPlaylist() {
        List<Uri> myUris = new ArrayList<Uri>();
        myUris.add(Uri.parse("https://db.tt/4ANlGRms"));
        myUris.add(Uri.parse("https://db.tt/TpmxsqGJ"));
        myUris.add(Uri.parse("https://db.tt/rbkYtuNI"));
        myUris.add(Uri.parse("https://db.tt/JYVHp9nm"));
        myUris.add(Uri.parse("https://db.tt/xWLATUQp"));
        myUris.add(Uri.parse("https://db.tt/WzV2TzFu"));
        return myUris;
    }

}



回答2:


The error code is related to the Array size.

java.lang.IndexOutOfBoundsException: Invalid index 6, size is 6

Somewhere in the Code your code turns out to play the next song with the Index number of 6. I am not sure whether this gets from the Dropbox API or you're making it up. But the error is something like this

int[6] songIds = [10, 14, 12, 54, 24, 54];
/* then somewhere while playing 
 * you reference the array as */
songIds[6];

This is clear sign that the Song you're trying to play isn't a part of the Array. You need to play the song number 5 or you need to go back to the first song. You should remember that the Array index starts from 0 and go upto arraysize - 1.

Maybe the playlistPos is being set to 6 inside the Initialization of the Playlist. You should make sure of that.




回答3:


i'm pretty in android and java:( but i think solve this problem :

public class QueuePlay extends Thread {

    private Vector<SoundPair> mVoiceQueue = new Vector<SoundPair>();
    private PlaySound playSound;
    Object lock = new Object();

    public QueuePlay() {
    };

    // *********************************************************
    public synchronized QueuePlay setPlaySound(PlaySound playSound) {

        this.playSound = playSound;

        playSound.setEventListenerPlay(new OnEventListenerPlay() {

            @Override
            public void onPlaySound(SoundPair soundPair) {
                Log.i("MSH", "onPlaySound->" + soundPair.toString());
            }

            @Override
            public void onFinishSound(SoundPair soundPair) {
                Log.e("MSH", "onFinishSound->" + soundPair.toString());
                synchronized (lock) {
                    lock.notify();
                }
            }

            @Override
            public void onErrorOccurred(String errorMsg) {
                // TODO Auto-generated method stub
                Log.i("MSH", "onErrorOccurred->" + errorMsg);
            }
        });
        return this;
    }

    // -------------------------------------------
    public synchronized void addToVoiceQueue(SoundPair soundPair) {
        mVoiceQueue.add(soundPair);
        Log.i("MSH", "addToVoiceQueue->" + soundPair.toString());
        notify();

    }

    // -----------------------------------------
    private synchronized SoundPair getNextVoiceFromQueue()
            throws InterruptedException {

        while (mVoiceQueue.size() == 0)
            wait();

        SoundPair soundPair = (SoundPair) mVoiceQueue.get(0);
        Log.i("MSH", "getNextVoiceFromQueue->" + soundPair.toString());
        mVoiceQueue.removeElementAt(0);
        return soundPair;
    }

    private synchronized void playSound_(SoundPair aMessage) throws Exception {
        if (playSound != null) {
            playSound._play_numbers(aMessage);
        }
    }

    @Override
    public void run() {
        try {
            while (!isInterrupted()) {
                SoundPair message = getNextVoiceFromQueue();
                playSound_(message);

                synchronized (lock) {
                    lock.wait();
                }
            }
        } catch (Exception e) {
            Log.e("MSH", e.getMessage()
                    + "->RUN->Exception (Queue Play voice) ");

        } finally {

        }
    }
}

and so

public class PlaySound {

private final int MAX_NUMBER_NO = 41;
private final int MAX_QUEUE_NO = 101;

private Context context;
private AppController ac = new AppController();
private MediaPlayer mPlayer;

int number_no[] = new int[MAX_NUMBER_NO];// یک
int queue_no[] = new int[MAX_QUEUE_NO];// شماره 1 به باجه

public interface OnEventListenerPlay {
    public void onPlaySound(SoundPair soundPair);

    public void onFinishSound(SoundPair soundPair);

    public void onErrorOccurred(String errorMsg);
}

private OnEventListenerPlay mOnEventListenerPlay = null;

public void setEventListenerPlay(OnEventListenerPlay mOnEventListener) {
    this.mOnEventListenerPlay = mOnEventListener;
}

// ----------------------------------------------------------------------
public PlaySound(Context context) {
    this.context = AppController.mContext;
    getRawResource();
}

private void getRawResource() {

    for (int i = 1; i < queue_no.length; i++) {
        queue_no[i] = context.getResources().getIdentifier("raw/s" + i,
                "raw", context.getPackageName());
    }
    for (int i = 1; i < number_no.length; i++) {
        number_no[i] = context.getResources().getIdentifier("raw/n" + i,
                "raw", context.getPackageName());
    }

}

public void _play_numbers(final SoundPair soundPair) throws Exception {
    if (soundPair != null) {
        final int baje = soundPair.getBaje();
        final int shoamre = soundPair.getShoamre();
        try {
            if ((shoamre > 0 && shoamre < queue_no.length)) {
                mPlayer = MediaPlayer.create(context, queue_no[shoamre]);
                mPlayer.start();
                if (mOnEventListenerPlay != null)
                    mOnEventListenerPlay.onPlaySound(soundPair);
                mPlayer.setOnCompletionListener(new OnCompletionListener() {
                    @Override
                    public void onCompletion(MediaPlayer mp) {
                        mPlayer.stop();
                        if (baje > 0 && baje < number_no.length) {
                            mPlayer = MediaPlayer.create(context,
                                    number_no[baje]);
                            mPlayer.start();
                            mPlayer.setOnCompletionListener(new OnCompletionListener() {

                                @Override
                                public void onCompletion(MediaPlayer mp) {
                                    mPlayer.stop();
                                    if (mOnEventListenerPlay != null)
                                        mOnEventListenerPlay.onFinishSound(soundPair);
                                }
                            });
                        } else
                            ac.logError(getClass(), "number: " + baje
                                    + " Not In Range:"
                                    + (number_no.length - 1));
                    }
                });
            } else {
                ac.logError(getClass(), "queue: " + shoamre
                        + " Not In Range:" + (queue_no.length - 1));

            }
        } catch (Exception ex) {
            ac.logError(getClass(), ex.getMessage());
            if (mOnEventListenerPlay != null)
                mOnEventListenerPlay.onErrorOccurred( ex.getMessage());
        }

    }

}

}


来源:https://stackoverflow.com/questions/23872763/android-app-force-closes-when-playing-next-song-in-array-list

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!