2012-08-31 52 views
0

我目前正在播放一首使用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

+0

發佈LogCat錯誤 – iTurki

+0

設置此行代碼'mp.setAudioStreamType(AudioManager.STREAM_MUSIC);'在setdatasource之前。我認爲這會幫助你。 – Satheesh

+0

@Satheesh:我試過了,它不起作用。 – Namratha

回答

0

該序列是正確的。路徑出錯了。正在使用硬編碼的字符串而不是Uri。謝謝。

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; 
      } 
     } } 
+0

我試過了,它沒有。就像我之前所說的那樣,如果以上述方式進行操作,默認音軌不會播放。我的原始實現播放默認音軌。我見過很多代碼示例。我找不到任何我想念的東西。那是什麼錯誤(1,-2148 ..)? – Namratha

+0

好的。你的文件在哪裏?在SD卡上或者在應用程序路徑上?以哪種方式獲取fil路徑,例如靜態地作爲「sdcard/media/new.mp3」或使用Environment.getExtrnalStorage – Satheesh

+0

請檢查上面的編輯以查看我如何獲取文件路徑。這些文件在SD卡上。我也嘗試在mPlayer.pause()之後播放相同的文件(firdt track)。所以,我叫了playTrack(currentTrack)。但是,這給了我同樣的錯誤,沒有發揮。這意味着這條道路不是問題嗎?因爲即使相同的文件暫停後也無法播放。但是,如果我在pause()之後執行mPlayer.start(),它可以工作,但我無法更改曲目。 – Namratha