问题
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