изменение трека в медиаплеере android

В настоящее время я играю песню с помощью MediaPlayer, который воспроизводится нормально. Когда пользователь выбирает другую песню, я пытаюсь ее воспроизвести. Но я получаю ошибку (1, -2147483648) и ошибку (1, -2147483648) от MediaPlayer. Эти журналы распечатываются после вызова prepareASync(); Примечание. Путь к файлу выглядит правильно. Однако как мне проверить правильный путь к файлу?

The sequence is as follows:

           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;

Логкат:

08-31 18:07:36.348: D/dalvikvm(23090): GC_EXTERNAL_ALLOC освобождено 2K, 46% свободно 3088K/5703K, внешнее 1461K/1538K, пауза 32 мс

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): возвращает идентификатор нового аудиосеанса

08-31 18:07:39.150: D/IAudioFlinger(23090): newAudioSessionId в

08-31 18:07:39.150: D/IAudioFlinger(23090): newAudioSessionId Out, id = 175

08-31 18:07:39.150: D/MediaPlayer(23090): reset() в

08-31 18:07:39.150: D/MediaPlayer(23090): reset() выход

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): после подготовкиAsync

08-31 18:07:39.250: D/MediaPlayer(23090): start() в

08-31 18:07:39.260: D/MediaPlayer(23090): старт() вышел

08-31 18:07:39.270: D/MediaPlayer(23090): start() в

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): pause() out 08-31 18:07:49.560: D/dalvikvm(23090): GC_CONCURRENT освобождено 239K, 45% свободно 3260K/5831K, внешнее 494K/ 1006K, пауза 10 мс+7 мс

08-31 18:07:50.842: D/Music List(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 освобождено 146 КБ, 45% свободно 3264 КБ/5831 КБ, внешнее 794 КБ/855 КБ, пауза 29 мс

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): не удается открыть файл карты ключей

08-31 18:07:55.476: W/KeyCharacterMap(23090): ошибка при загрузке карты символов

файл '/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() в

08-31 18:07:55.486: D/MediaPlayer(23090): reset() выход

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): после подготовкиAsync

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


person Namratha    schedule 31.08.2012    source источник
comment
установите эту строку кода 'mp.setAudioStreamType (AudioManager.STREAM_MUSIC);' перед установкой источника данных. Я думаю, это поможет вам.   -  person Satheeshkumar    schedule 31.08.2012
comment
@Satheesh: я пробовал это, это не сработало.   -  person Namratha    schedule 31.08.2012
comment
Хорошо, когда вы устанавливаете значение источника данных из пути, попробуйте эти две строки кода FileInputStream fis = new FileInputStream(mTrackToBePlayed); mPlayer.setDataSource(fis.getFD()); для установки значения источника данных.   -  person Satheeshkumar    schedule 03.09.2012
comment
Это чтобы проверить, успешно ли создан файл? Я попробовал это. Но дорожка по умолчанию тоже не воспроизводится! (дорожка по умолчанию, используемая для воспроизведения при запуске слайд-шоу). Теперь я получаю журналы - запуск вызывается в состоянии 1 и ошибка (-38,0)   -  person Namratha    schedule 03.09.2012
comment
Где находится ваш файл? на SD-карте или еще по пути приложения?   -  person Satheeshkumar    schedule 03.09.2012


Ответы (2)


Последовательность правильная. Путь шел неправильно. Вместо Uri использовалась жестко заданная строка. Спасибо.

person Namratha    schedule 03.09.2012

person    schedule
comment
Я пробовал, не получается. Как я уже говорил ранее, дорожка по умолчанию не воспроизводится, если я делаю это вышеописанным способом. Моя исходная реализация воспроизводит дорожку по умолчанию. Я видел много примеров кода. Я не могу найти ничего, чего мне не хватает. Что это за ошибка (1,-2148..)? - person Namratha; 03.09.2012
comment
Хорошо. Где находится ваш файл? на SD-карте или еще по пути приложения? И каким образом вы получили путь к файлу, например, статически assdcard/media/new.mp3 или еще с помощью Environment.getExtrnalStorage - person Satheeshkumar; 03.09.2012
comment
Пожалуйста, проверьте изменения выше, чтобы увидеть, как я получаю путь к файлу. Файлы лежат на сд карте. Я также пытался воспроизвести тот же файл (первая дорожка) после mPlayer.pause(). Итак, я вызвал playTrack(currentTrack). Но это дало мне ту же ошибку, и ничего не воспроизводилось. Это означает, что путь не является проблемой, верно? Так как даже тот же файл не мог быть воспроизведен после паузы. Однако, если я делаю mPlayer.start() после pause(), он работает, но я не могу менять дорожки. - person Namratha; 03.09.2012
comment
Кроме того, в вашем onPreparedListener вы вызываете start для переменной класса. Разве мы не должны делать это на экземпляре, который получает обратный вызов? Это одно и то же? - person Namratha; 03.09.2012
comment
Кроме того, в вашем onPreparedListener вы вызываете start для переменной класса. Разве мы не должны делать это на экземпляре, который получает обратный вызов? Это одно и то же? Оба одинаковы. - person Satheeshkumar; 03.09.2012
comment
Я думаю, что безопаснее было бы присвоить локальную переменную переменной класса, верно? - person Namratha; 03.09.2012