【发布时间】:2012-08-31 11:47:06
【问题描述】:
我目前正在使用 MediaPlayer 播放一首可以正常播放的歌曲。在用户选择不同的歌曲时,我正在尝试播放。 但是,MediaPlayer 收到错误(1,-2147483648)和错误(1,-2147483648)。 这些日志在调用 prepareASync() 后打印; 注意:文件的路径看起来是正确的。但是,如何检查有效的文件路径?
顺序如下:
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();
}
此函数存在于 MusicUtils 中,用于获取光标返回的第一首曲目
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();
}
}
我使用用户选择的ID并通过以下方式获取文件路径:
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/tag(23090): oncreate 内部
08-31 18:07:38.860:D/ImageSwitcher(23090):缓存大小:1
08-31 18:07:39.030:D/ImageSwitcher(23090):图像总数: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 In
08-31 18:07:39.150: D/IAudioFlinger(23090): newAudioSessionId Out, id = 175
08-31 18:07:39.150: D/MediaPlayer(23090): reset() in
08-31 18:07:39.150: D/MediaPlayer(23090): reset() out
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): start() in
08-31 18:07:39.260: D/MediaPlayer(23090): start() out
08-31 18:07:39.270: D/MediaPlayer(23090): start() in
08-31 18:07:39.270: D/MediaPlayer(23090): start() out
08-31 18:07:39.270: D/MusicUtils(23090): 开始后
08-31 18:07:49.340: D/MediaPlayer(23090): pause() in
08-31 18:07:49.340: D/MediaPlayer(23090): pause() out 08-31 18:07:49.560: D/dalvikvm(23090): GC_CONCURRENT freed 239K, 45% free 3260K/5831K, external 494K/1006K, paused 10ms+7ms
08-31 18:07:50.842: D/Music List(23090): 在 getAllSongsFromSDCARD 之前的 onCreate 中
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/Settings(23090): onActivityResult 内部
08-31 18:07:55.476:W/KeyCharacterMap(23090):无法打开 keycharmap 文件
08-31 18:07:55.476: W/KeyCharacterMap(23090): 加载 keycharmap 时出错
文件'/system/usr/keychars/cy8c-touchscreen.kcm.bin'。 hw.keyboards.65538.devname='cy8c-touchscreen' 08-31 18:07:55.476: I/KeyCharacterMap(23090): 使用默认值 键盘映射:/system/usr/keychars/qwerty.kcm.bin
08-31 18:07:55.486: D/MediaPlayer(23090): reset() in
08-31 18:07:55.486: D/MediaPlayer(23090): reset() out
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):prepareAsync 之后
08-31 18:07:55.496: 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
【问题讨论】:
-
设置这行代码'mp.setAudioStreamType(AudioManager.STREAM_MUSIC);'在设置数据源之前。我想这会对你有所帮助。
-
@Satheesh:我试过了,没用。
-
好的,当您从路径设置数据源值时,请尝试使用这两行代码“FileInputStream fis = new FileInputStream(mTrackToBePlayed); mPlayer.setDataSource(fis.getFD());”来设置数据源值。
-
这是为了检查文件是否创建成功?我试过这个。但是,默认曲目也不播放!(用于在幻灯片启动时播放的默认曲目)。现在,我得到了日志 - 在状态 1 中调用 start 和 error(-38,0)
-
您的文件在哪里?在 sdcard 上还是在应用程序路径上?
标签: android android-mediaplayer mediaplayback