我目前正在播放一首使用MediaPlayer播放音樂的歌曲。在用戶選擇一首不同的歌曲時,我試圖播放它。 但是,MediaPlayer出現錯誤(1,-2147483648)和Error(1,-2147483648)。 在調用prepareASync()之後打印這些日誌。 注意:文件的路徑看起來是正確的。但是,如何檢查有效的文件路徑?更改曲目媒體播放器android
的順序如下:
mPlayer.reset();
Log.d(TAG,"after reset");
mPlayer.setDataSource(mTrackToBePlayed);
Log.d(TAG,"after setDataSource");
// mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mPlayer.setOnPreparedListener(preparedListener);
Log.d(TAG,"after setOnPreparedListener");
mPlayer.setOnErrorListener(errorListener);
Log.d(TAG,"after setting errorListener");
mPlayer.prepareAsync();
Log.d(TAG,"after prepareAsync");
參考的代碼是這樣的:在我的主要活動的onResume()(上回我要開始播放它,)我正在調用MusicUtils。的createPlayer();和 MusicUtils.playTrack(mCurrentTrack);
public static void playTrack(String track) {
mTrackToBePlayed = track;
try {
mPlayer.reset();
Log.d(TAG,"after reset");
mPlayer.setDataSource(mTrackToBePlayed);
Log.d(TAG,"after setDataSource");
// mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mPlayer.setOnPreparedListener(preparedListener);
Log.d(TAG,"after setOnPreparedListener");
mPlayer.setOnErrorListener(errorListener);
Log.d(TAG,"after setting errorListener");
mPlayer.prepareAsync();
Log.d(TAG,"after prepareAsync");
} catch (IOException e) {
} catch(IllegalArgumentException e) {
}
preparedListener = new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
// TODO Auto-generated method stub
mp.start();
Log.d(TAG,"after start");
}
};
errorListener = new MediaPlayer.OnErrorListener() {
public boolean onError(MediaPlayer mp, int what, int extra) {
switch (what) {
case MediaPlayer.MEDIA_ERROR_SERVER_DIED:
Log.d(TAG,"in onError");
// mIsInitialized = false;
mp.release();
// Creating a new MediaPlayer and settings its wakemode does not
// require the media service, so it's OK to do this now, while the
// service is still being restarted
try{
mp = new MediaPlayer();
mp.reset();
mp.setDataSource(mTrackToBePlayed);
// mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
mp.prepareAsync();
mPlayer = mp;
// mPlayer.start();
} catch (Exception e) {
}
//MediaPlayer.create(mContext, mTrackToBePlayed);
// mPlayer.setWakeMode(MediaPlaybackService.this, PowerManager.PARTIAL_WAKE_LOCK);
return true;
default:
Log.d("MusicPlayer", "Error: " + what + "," + extra);
break;
}
return false;
}
};
//mPlayer.start();
}
public static boolean isPlaying() {
return mPlayer.isPlaying();
}
public static void pauseTrack() {
mPlayer.pause();
}
public static void startTrack() {
mPlayer.start();
}
public static void stopTrack() {
mPlayer.stop();
}
public static void releasePlayer() {
mPlayer.release();
}
This function is present in MusicUtils and is used to obtain the first track that the cursor returns
public static void retrieveDefaultPath() {
String[] STAR = { "*" };
Uri allsongsuri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
String selection = MediaStore.Audio.Media.IS_MUSIC + " != 0";
mCursor = mContentResolver.query(allsongsuri, STAR, selection, null, null);
if (mCursor != null) {
if (mCursor.moveToFirst()) {
//do {
//mSongName = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME));
//mSongList.add(mSongName);//populate the list of display names
int song_id = mCursor.getInt(mCursor.getColumnIndex(MediaStore.Audio.Media._ID));
//mMusicIDs.put(song_id, counter++);//fill the HashMap with IDs corresponding to the positions
String fullpath = mCursor.getString(mCursor.getColumnIndex(MediaStore.Audio.Media.DATA));
String album_name = mCursor.getString(mCursor.getColumnIndex(MediaStore.Audio.Media.ALBUM));
int album_id = mCursor.getInt(mCursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID));
String artist_name = mCursor.getString(mCursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));
int artist_id = mCursor.getInt(mCursor.getColumnIndex(MediaStore.Audio.Media.ARTIST_ID));
//} while (cursor.moveToNext());
mDefaultPath = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI + "/" + song_id;
Slideshow.mCurrentTrack = mDefaultPath;
}
if (mCursor != null) {
mCursor.close();
}
}
}
The following function is used to obtain all the tracks on the device to display using the ListActivity.
public void getAllSongsFromSDCARD() {
String[] STAR = { "*" };
Uri allsongsuri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
String selection = MediaStore.Audio.Media.IS_MUSIC + " != 0";
cursor = managedQuery(allsongsuri, STAR, selection, null, null);
if (cursor != null) {
if (cursor.moveToFirst()) {
do {
mSongName = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME));
mSongList.add(mSongName);//populate the list of display names
int song_id = cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Media._ID));
Log.d("Music List","ID: "+song_id+" counter:"+counter);
mMusicIDs.put(counter++, song_id);//fill the HashMap with IDs corresponding to the positions
String fullpath = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));
String album_name = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM));
int album_id = cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID));
String artist_name = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));
int artist_id = cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST_ID));
} while (cursor.moveToNext());
}
cursor.close();
}
}
I use the ID that the user selects and obtain the filepath in the following way:
music_id = (Integer)mMusicIDs.get(position);
mSelectedPath = mSelectedPath + "/" + music_id;
logcat的:
08-31 18:07:36.348:d/dalvikvm(23090):GC_EXTERNAL_ALLOC釋放2K,46%的遊離3088K/5703K,外部1461K/1538K,暫停爲32ms
08-31 18:07:38.860:d /標籤(23090):內部的OnCreate
08-31 18:07:38.860:d/ImageSwitcher(23090):高速緩存的大小:1
08-31 18:07:39.030:d/ImageSwitcher(23090):TOTAL NUM IMAGES:838
08-31 18:07:39.150:I/AudioSystem(23090):越來越音頻拋油
08-31 18:07:39.150:I/AudioSystem(23090):返回新的音頻會話ID
08 -31 18:07:39.150:D/IAudioFlinger(23090):newAudioSessionId
08-31 18:07:39.150:D/IAudioFlinger 23090):newAudioSessionId缺貨,ID = 175
08-31 18:07:39.150:d/MediaPlayer的(23090):07:39.150:在
08-31 18復位()d/MediaPlayer的( 23090):復位()出
08-31 18:07:39.150:d/MusicUtils(23090):復位後
08-31 18:07:39.160:d/MusicUtils(23090):後setDataSource
08-31 18:07:39.160:D/MusicUtils(23090):setOnPreparedListener之後
08-31 18:07:39.160:d/MusicUtils(23090):之後設置errorListener
08-31 18:07:39.170:d/MusicUtils(23090):後prepareAsync
08- 31 18:07:39.250:d/MediaPlayer的(23090):開始()在
08-31 18:07:39.260:d/MediaPlayer的(23090):開始()出
08-31 18 :07:39。270:d/MediaPlayer的(23090):開始()在
08-31 18:07:39.270:d/MediaPlayer的(23090):開始()出
08-31 18:07:39.270: d/MusicUtils(23090):啓動後
08-31 18:07:49.340:d/MediaPlayer的(23090):暫停()在
08-31 18:07:49.340:d/MediaPlayer的( 23090):暫停()out 08-31 18:07:49.560:D/dalvikvm(23090):GC_CONCURRENT已釋放239K,45%空閒3260K/5831K,外部494K/1006K,暫停10ms + 7ms
08-31 18:07:50.842:d /音樂列表(23090):在的onCreate getAllSongsFromSDCARD
前08-31 18:07:50.922:d/TAG(23090):設置適配器
08- 31 18:07:50.922:D/TAG(23090):設置適配器完成
08-31 18:07:51.953:D/dalvikvm(23090):GC_EXTERNAL_ALLOC釋放146K,45%空閒3264K/5831K,外部794K/855K,暫停29ms
08-31 18:07:53.905:d/MusicList(23090):setItemChecked後
08-31 18: 07:54.585:d /設置(23090):內onActivityResult
08-31 18:07:55.476:W/KeyCharacterMap(23090):無法打開keycharmap文件
08-31 18:07: 55.476:W/KeyCharacterMap(23090):Error loading loading keycharmap
file'/system/usr/keychars/cy8c-touchscreen.kcm.bin'。 hw.keyboards.65538.devname = 'cy8c-觸摸屏' 08-31 18:07:55.476:I/KeyCharacterMap(23090):使用默認 鍵盤佈局/system/usr/keychars/qwerty.kcm.bin
08-31 18:07:55.486:d/MediaPlayer的(23090):復位()在
08-31 18:07:55.486:d/MediaPlayer的(23090):復位()出
08 -31 18:07:55.486:d/MusicUtils(23090):復位
08-31 18後:07:55.486:d/MusicUtils(23090):的setDataSource後
08-31 18:07:55.486:d/MusicUtils(23090):後setOnPreparedListener
08-31 18:07:55.486:d/MusicUtils(23090):在設置errorListener
08-31後18:07:55.486:d/MusicUtils(23090):07:55.496:prepareAsync
08-31 18後E/MediaPlayer的(23090):錯誤(1,-2147483648)
08-31 18 :07:55.506:E/MediaPlayer(23090):錯誤(1,-2147483648)
08-31 18:07:55.506 :D/MusicPlayer(23090):錯誤:1,-2147483648
發佈LogCat錯誤 – iTurki
設置此行代碼'mp.setAudioStreamType(AudioManager.STREAM_MUSIC);'在setdatasource之前。我認爲這會幫助你。 – Satheesh
@Satheesh:我試過了,它不起作用。 – Namratha