1

I am currently playing a song using MediaPlayer which plays fine. On user selecting a different song, I'm trying to play that out. But, I get error(1,-2147483648) and Error(1, -2147483648) by the MediaPlayer. These logs are printed after the call to prepareASync(); Note: The path of the file looks correct. However, how do I check for a valid filepath?

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

The code for reference is this: in onResume() of my main activity(on returning to which, I want to start playback) I am making the calls MusicUtils.createPlayer(); and 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 freed 2K, 46% free 3088K/5703K, external 1461K/1538K, paused 32ms

08-31 18:07:38.860: D/tag(23090): inside oncreate

08-31 18:07:38.860: D/ImageSwitcher(23090): cache size:1

08-31 18:07:39.030: D/ImageSwitcher(23090): TOTAL NUM IMAGES: 838

08-31 18:07:39.150: I/AudioSystem(23090): getting audio flinger

08-31 18:07:39.150: I/AudioSystem(23090): returning new audio session 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): after reset

08-31 18:07:39.160: D/MusicUtils(23090): after setDataSource

08-31 18:07:39.160: D/MusicUtils(23090): after setOnPreparedListener

08-31 18:07:39.160: D/MusicUtils(23090): after setting errorListener

08-31 18:07:39.170: D/MusicUtils(23090): after 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): after start

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): in onCreate before getAllSongsFromSDCARD

08-31 18:07:50.922: D/TAG(23090): set adapter

08-31 18:07:50.922: D/TAG(23090): set adapter done

08-31 18:07:51.953: D/dalvikvm(23090): GC_EXTERNAL_ALLOC freed 146K, 45% free 3264K/5831K, external 794K/855K, paused 29ms

08-31 18:07:53.905: D/MusicList(23090): after setItemChecked

08-31 18:07:54.585: D/Settings(23090): inside onActivityResult

08-31 18:07:55.476: W/KeyCharacterMap(23090): Can't open keycharmap file

08-31 18:07:55.476: W/KeyCharacterMap(23090): Error loading keycharmap

file '/system/usr/keychars/cy8c-touchscreen.kcm.bin'. hw.keyboards.65538.devname='cy8c-touchscreen' 08-31 18:07:55.476: I/KeyCharacterMap(23090): Using default keymap: /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): after reset

08-31 18:07:55.486: D/MusicUtils(23090): after setDataSource

08-31 18:07:55.486: D/MusicUtils(23090): after setOnPreparedListener

08-31 18:07:55.486: D/MusicUtils(23090): after setting errorListener

08-31 18:07:55.486: D/MusicUtils(23090): after prepareAsync

08-31 18:07:55.496: E/MediaPlayer(23090): error (1, -2147483648)

08-31 18:07:55.506: E/MediaPlayer(23090): Error (1,-2147483648)

08-31 18:07:55.506: D/MusicPlayer(23090): Error: 1,-2147483648

Namratha
  • 16,630
  • 27
  • 90
  • 125
  • set this line of code 'mp.setAudioStreamType(AudioManager.STREAM_MUSIC);' before setdatasource. i think this will help you. – Satheeshkumar Aug 31 '12 at 12:05
  • @Satheesh: I tried this, it didn't work. – Namratha Aug 31 '12 at 12:46
  • Okay when you set the data source value from a path try this two line of code " FileInputStream fis = new FileInputStream(mTrackToBePlayed); mPlayer.setDataSource(fis.getFD()); "to set the data source value. – Satheeshkumar Sep 03 '12 at 04:20
  • Is this to check if the file is created successfully? I tried this. But, the default track doesn't play either!(The default track used to play on launch of slideshow). Now, I get the logs - start called in state 1 and error(-38,0) – Namratha Sep 03 '12 at 04:27
  • Where is your file located ? on sdcard or else on the application path? – Satheeshkumar Sep 03 '12 at 04:43

2 Answers2

1

The sequence is correct. The path was going wrong. A hardcoded string instead of a Uri was being used. Thanks.

Namratha
  • 16,630
  • 27
  • 90
  • 125
0
**Check with the following class it will list out all th songs in the device also it play the song when click on that name.**



public class NewMp3PlayerActivity extends Activity {
       ListView musiclist;

      int music_column_index,music_column_index1;
      int count;
      MediaPlayer mMediaPlayer;
      ImageView play, pause, forward, backward;
      int pposition;
      ArrayList<String> songs = new ArrayList<String>();      String songName;    Cursor musiccursor;
      /** Called when the activity is first created. */
      @Override
      public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.songpreview);

            play = (ImageView)findViewById(R.id.img_play);
            pause = (ImageView)findViewById(R.id.img_pause);
            forward = (ImageView)findViewById(R.id.img_forward);
            backward = (ImageView)findViewById(R.id.img_backward);

            play.setOnClickListener(OnClick);
            pause.setOnClickListener(OnClick);
            forward.setOnClickListener(OnClick);
            backward.setOnClickListener(OnClick);
            init_phone_music_grid();


      }

      View.OnClickListener OnClick = new View.OnClickListener() {
                @Override       public void onClick(View v) {           music_column_index = musiccursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA);        

            Log.e("", "musiccursor.getCount()-->"musiccursor.getCount());           switch(v.getId()){          case R.id.img_play:
                Log.v("", "list of songs-->"+songs);
                  if (mMediaPlayer.isPlaying()) {
                      mMediaPlayer.reset();
                }
                  mMediaPlayer.start();
                break;          case R.id.img_pause:
                  if (mMediaPlayer.isPlaying()) {
                      mMediaPlayer.pause();
                }
                break;          case R.id.img_forward: //                musiccursor.moveToPosition(pposition+1);

                try {
                     String filename="";
                        if (pposition < songs.size()){
                            pposition = pposition+1;
                            filename = songs.get(pposition);//musiccursor.getString(music_column_index);
                        }else{

                        }

                        Log.e("", "filename-->"+filename);
                    mMediaPlayer.reset();
                    mMediaPlayer.setDataSource(filename);
                    mMediaPlayer.prepare();
                    mMediaPlayer.start();
                } catch (IllegalArgumentException e) {
                    e.printStackTrace();
                } catch (IllegalStateException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } catch(IndexOutOfBoundsException ie){
                    pposition = 0;
                }

                break;          case R.id.img_backward:

                 try {
                     String filename_n="";
                        if (pposition <= songs.size()){
                            pposition = pposition-1;
                            filename_n = songs.get(pposition);//musiccursor.getString(music_column_index);
                        }else{

                        }
                        mMediaPlayer.reset();
                        mMediaPlayer.setDataSource(filename_n);
                        mMediaPlayer.prepare();
                        mMediaPlayer.start();
                    } catch (IllegalArgumentException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (IllegalStateException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    } catch(ArrayIndexOutOfBoundsException ar){
                        pposition = songs.size();
                    }
                break;          default:
                break;          }
                    }   };
      private void init_phone_music_grid() {
            System.gc(); 
            String[] proj = { MediaStore.Audio.Media._ID,MediaStore.Audio.Media.DATA,MediaStore.Audio.Media.DISPLAY_NAME,MediaStore.Video.Media.SIZE };
            musiccursor = managedQuery(MediaStore.Audio.Media.INTERNAL_CONTENT_URI, proj, null, null, null);
            Log.e("", "filename-->"musiccursor.getCount());
            count = musiccursor.getCount();
            musiclist = (ListView) findViewById(R.id.lst_music);
            musiclist.setAdapter(new MusicAdapter(getApplicationContext()));

            musiclist.setOnItemClickListener(musicgridlistener);
            mMediaPlayer = new MediaPlayer();
            mMediaPlayer.setOnCompletionListener(new OnCompletionListener() {

                @Override
                public void onCompletion(MediaPlayer mp) {
                    try {
                         String filename="";
                            if (pposition < songs.size()){
                                pposition = pposition+1;
                                filename = songs.get(pposition);//musiccursor.getString(music_column_index);
                            }else{

                            }

                            Log.e("", "filename-->"+filename);
                        mMediaPlayer.reset();
                        mMediaPlayer.setDataSource(filename);
                        mMediaPlayer.prepare();
                        mMediaPlayer.start();
                    } catch (IllegalArgumentException e) {
                        e.printStackTrace();
                    } catch (IllegalStateException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    } catch(IndexOutOfBoundsException ie){
                        pposition = 0;
                    }
                }           });
      }

      private OnItemClickListener musicgridlistener = new OnItemClickListener() {
            public void onItemClick(AdapterView parent, View v, int position,long id) {
                  System.gc();
                  pposition = position;
                  music_column_index = musiccursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA);
                  musiccursor.moveToPosition(position);
                  String filename = musiccursor.getString(music_column_index);
                  String filen = songs.get(pposition);
                  Log.e("", "index-->"+music_column_index);
                  try {
                        mMediaPlayer.reset();
                        mMediaPlayer.setDataSource(filen);
                        mMediaPlayer.prepare(); //                        mMediaPlayer.start();
                  } catch (Exception e) {

                  }
            }
      };



      public class MusicAdapter extends BaseAdapter {
            private Context mContext;

            public MusicAdapter(Context c) {
                  mContext = c;
            }

            public int getCount() {
                  return count;
            }

            public Object getItem(int position) {
                  return position;
            }

            public long getItemId(int position) {
                  return position;
            }

            public View getView(int position, View convertView, ViewGroup parent) {
                  System.gc();
                  TextView tv = new TextView(mContext.getApplicationContext());
                  String id = null;
                  if (convertView == null) {                     
                        music_column_index = musiccursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME);
                        music_column_index1 = musiccursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA);
                        musiccursor.moveToPosition(position);
                        id = musiccursor.getString(music_column_index);
                        songName = musiccursor.getString(music_column_index);
                        songs.add( musiccursor.getString(music_column_index1) );
                        music_column_index = musiccursor.getColumnIndexOrThrow(MediaStore.Audio.Media.SIZE);
                        musiccursor.moveToPosition(position);
                        id += " Size(KB):" + musiccursor.getString(music_column_index);
                        tv.setText(id);
                  } else
                        tv = (TextView) convertView;
                  return tv;
            }
      } }
Satheeshkumar
  • 452
  • 4
  • 13
  • I tried, it doesn't. Like I said earlier, the default track doesn't play if I do it in the above way. My original implementation plays out the default track. I have seen many code samples. I can't find anything that I'm missing. What is that error(1,-2148..)? – Namratha Sep 03 '12 at 04:57
  • Okay. Where is your file located ? on sdcard or else on the application path? And which way you got the fil path for example statically as"sdcard/media/new.mp3" or else using Environment.getExtrnalStorage – Satheeshkumar Sep 03 '12 at 05:02
  • Please check the edits above to see how I obtain the filepath. The files are on the sd card. I also tried to play out the same file(firdt track) after mPlayer.pause(). So, I called playTrack(currentTrack). But, this gave me the same error and nothing played. This implies that the path is not the issue right? Since even the same file couldn't be played out after being paused. However, if I do mPlayer.start() after pause() it works but I am not able to change tracks. – Namratha Sep 03 '12 at 05:42
  • Also, in your onPreparedListener, you are calling start on the class variable. Shouldn't we do it on the instance that the callback recieves? Is the same thing? – Namratha Sep 03 '12 at 05:51
  • "Also, in your onPreparedListener, you are calling start on the class variable. Shouldn't we do it on the instance that the callback recieves? Is the same thing?" Both are the same . – Satheeshkumar Sep 03 '12 at 09:07
  • I think a safe thing to do would be to assign the local variable to the class variable right? – Namratha Sep 03 '12 at 09:20