簡體   English   中英

播放陣列列表中的下一首歌曲時,Android應用程序強制關閉

[英]Android app force closes when playing next song in array list

我正在創建一個Android應用程序(供我自己使用),可以讓我從GTA V收聽自己喜歡的歌曲。MediaPlayer從我的保管箱帳戶中流過mp3曲目,並且一切正常。

問題在於第一首歌曲結束后,我希望它播放下一首歌曲,但是當我在第一首歌曲結束播放后運行應用程序時,應用程序崩潰,而不是播放列表中的下一首歌曲。

有人可以幫我解決我遇到的這個問題嗎?

謝謝。

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 

編輯:忽略對我的代碼的一些愚蠢的評論

新日志

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)

現在編輯此代碼不會使應用程序崩潰,但仍不會自動播放下一首歌曲,我必須抑制播放才能使其播放下一首歌曲

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
                }
            });

您有一個數組索引超出范圍異常-我認為這是由

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

只需檢查playlistPos是否大於播放列表大小即可:

playlistPos++;

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

initSong(myUris.get(playlistPos));

它將為您循環播放列表。

現在,為防止出現其他錯誤,請嘗試從onCompletionListener刪除sdrPlayer.start() ,並且僅在准備播放器時調用start。

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

編輯:這是一些工作代碼:

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;
    }

}

錯誤代碼與數組大小有關。

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

在代碼中的某個位置,您的代碼竟然播放了索引號為6的下一首歌曲。我不確定這是從Dropbox API獲得還是您正在制作。 但是錯誤是這樣的

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

這清楚地表明您要播放的歌曲不是數組的一部分。 您需要播放5號歌曲,或者您需要返回第一首歌曲。 您應該記住,數組索引從0開始,一直到arraysize - 1

也許在playlistPos的初始化中將playlistPos設置為6 您應該確保這一點。

我在android和java中很漂亮:(但我認為可以解決此問題:

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 {

        }
    }
}

所以

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());
        }

    }

}

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM