2014-05-08 93 views
0

我正在製作音樂播放器應用程序。 爲此,我在androidhive中提到了一個在線教程。 我主要活動爲AndroidBuildingMusicPlayerActivity,代碼爲:活動永遠不會啓動

public class AndroidBuildingMusicPlayerActivity extends Activity implements OnCompletionListener, SeekBar.OnSeekBarChangeListener { 

private ImageButton btnPlay; 
private ImageButton btnForward; 
private ImageButton btnBackward; 
private ImageButton btnNext; 
private ImageButton btnPrevious; 
private ImageButton btnPlaylist; 
private ImageButton btnRepeat; 
private ImageButton btnShuffle; 
private SeekBar songProgressBar; 
private TextView songTitleLabel; 
private TextView songCurrentDurationLabel; 
private TextView songTotalDurationLabel; 
// Media Player 
private MediaPlayer mp; 
// Handler to update UI timer, progress bar etc,. 
private Handler mHandler = new Handler();; 
private SongsManager songManager; 
private Utilities utils; 
private int seekForwardTime = 5000; // 5000 milliseconds 
private int seekBackwardTime = 5000; // 5000 milliseconds 
private int currentSongIndex = 0; 
private boolean isShuffle = false; 
private boolean isRepeat = false; 
private ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>(); 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.player); 

    // All player buttons 
    btnPlay = (ImageButton) findViewById(R.id.btnPlay); 
    btnForward = (ImageButton) findViewById(R.id.btnForward); 
    btnBackward = (ImageButton) findViewById(R.id.btnBackward); 
    btnNext = (ImageButton) findViewById(R.id.btnNext); 
    btnPrevious = (ImageButton) findViewById(R.id.btnPrevious); 
    btnPlaylist = (ImageButton) findViewById(R.id.btnPlaylist); 
    btnRepeat = (ImageButton) findViewById(R.id.btnRepeat); 
    btnShuffle = (ImageButton) findViewById(R.id.btnShuffle); 
    songProgressBar = (SeekBar) findViewById(R.id.songProgressBar); 
    songTitleLabel = (TextView) findViewById(R.id.songTitle); 
    songCurrentDurationLabel = (TextView) findViewById(R.id.songCurrentDurationLabel); 
    songTotalDurationLabel = (TextView) findViewById(R.id.songTotalDurationLabel); 

    // Mediaplayer 
    mp = new MediaPlayer(); 
    songManager = new SongsManager(); 
    utils = new Utilities(); 

    // Listeners 
    songProgressBar.setOnSeekBarChangeListener(this); // Important 
    mp.setOnCompletionListener(this); // Important 

    // Getting all songs list 
    songsList = songManager.getPlayList(); 

    // By default play first song 
    playSong(0); 

    /** 
    * Play button click event 
    * plays a song and changes button to pause image 
    * pauses a song and changes button to play image 
    * */ 
    btnPlay.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 
      // check for already playing 
      if(mp.isPlaying()){ 
       if(mp!=null){ 
        mp.pause(); 
        // Changing button image to play button 
        btnPlay.setImageResource(R.drawable.btn_play); 
       } 
      }else{ 
       // Resume song 
       if(mp!=null){ 
        mp.start(); 
        // Changing button image to pause button 
        btnPlay.setImageResource(R.drawable.btn_pause); 
       } 
      } 

     } 
    }); 

    /** 
    * Forward button click event 
    * Forwards song specified seconds 
    * */ 
    btnForward.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 
      // get current song position     
      int currentPosition = mp.getCurrentPosition(); 
      // check if seekForward time is lesser than song duration 
      if(currentPosition + seekForwardTime <= mp.getDuration()){ 
       // forward song 
       mp.seekTo(currentPosition + seekForwardTime); 
      }else{ 
       // forward to end position 
       mp.seekTo(mp.getDuration()); 
      } 
     } 
    }); 

    /** 
    * Backward button click event 
    * Backward song to specified seconds 
    * */ 
    btnBackward.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 
      // get current song position     
      int currentPosition = mp.getCurrentPosition(); 
      // check if seekBackward time is greater than 0 sec 
      if(currentPosition - seekBackwardTime >= 0){ 
       // forward song 
       mp.seekTo(currentPosition - seekBackwardTime); 
      }else{ 
       // backward to starting position 
       mp.seekTo(0); 
      } 

     } 
    }); 

    /** 
    * Next button click event 
    * Plays next song by taking currentSongIndex + 1 
    * */ 
    btnNext.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 
      // check if next song is there or not 
      if(currentSongIndex < (songsList.size() - 1)){ 
       playSong(currentSongIndex + 1); 
       currentSongIndex = currentSongIndex + 1; 
      }else{ 
       // play first song 
       playSong(0); 
       currentSongIndex = 0; 
      } 

     } 
    }); 

    /** 
    * Back button click event 
    * Plays previous song by currentSongIndex - 1 
    * */ 
    btnPrevious.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 
      if(currentSongIndex > 0){ 
       playSong(currentSongIndex - 1); 
       currentSongIndex = currentSongIndex - 1; 
      }else{ 
       // play last song 
       playSong(songsList.size() - 1); 
       currentSongIndex = songsList.size() - 1; 
      } 

     } 
    }); 

    /** 
    * Button Click event for Repeat button 
    * Enables repeat flag to true 
    * */ 
    btnRepeat.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 
      if(isRepeat){ 
       isRepeat = false; 
       Toast.makeText(getApplicationContext(), "Repeat is OFF", Toast.LENGTH_SHORT).show(); 
       btnRepeat.setImageResource(R.drawable.btn_repeat); 
      }else{ 
       // make repeat to true 
       isRepeat = true; 
       Toast.makeText(getApplicationContext(), "Repeat is ON", Toast.LENGTH_SHORT).show(); 
       // make shuffle to false 
       isShuffle = false; 
       btnRepeat.setImageResource(R.drawable.btn_repeat_focused); 
       btnShuffle.setImageResource(R.drawable.btn_shuffle); 
      } 
     } 
    }); 

    /** 
    * Button Click event for Shuffle button 
    * Enables shuffle flag to true 
    * */ 
    btnShuffle.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 
      if(isShuffle){ 
       isShuffle = false; 
       Toast.makeText(getApplicationContext(), "Shuffle is OFF", Toast.LENGTH_SHORT).show(); 
       btnShuffle.setImageResource(R.drawable.btn_shuffle); 
      }else{ 
       // make repeat to true 
       isShuffle= true; 
       Toast.makeText(getApplicationContext(), "Shuffle is ON", Toast.LENGTH_SHORT).show(); 
       // make shuffle to false 
       isRepeat = false; 
       btnShuffle.setImageResource(R.drawable.btn_shuffle_focused); 
       btnRepeat.setImageResource(R.drawable.btn_repeat); 
      } 
     } 
    }); 

    /** 
    * Button Click event for Play list click event 
    * Launches list activity which displays list of songs 
    * */ 
    btnPlaylist.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 
      Intent i = new Intent(getApplicationContext(), PlayListActivity.class); 
      startActivityForResult(i, 100);   
     } 
    }); 

} 

/** 
* Receiving song index from playlist view 
* and play the song 
* */ 
@Override 
protected void onActivityResult(int requestCode, 
           int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if(resultCode == 100){ 
     currentSongIndex = data.getExtras().getInt("songIndex"); 
     // play selected song 
     playSong(currentSongIndex); 
    } 

} 

/** 
* Function to play a song 
* @param songIndex - index of song 
* */ 
public void playSong(int songIndex){ 
    // Play song 
    try { 
     mp.reset(); 
     mp.setDataSource(songsList.get(songIndex).get("songPath")); 
     mp.prepare(); 
     mp.start(); 
     // Displaying Song title 
     String songTitle = songsList.get(songIndex).get("songTitle"); 
     songTitleLabel.setText(songTitle); 

     // Changing Button Image to pause image 
     btnPlay.setImageResource(R.drawable.btn_pause); 

     // set Progress bar values 
     songProgressBar.setProgress(0); 
     songProgressBar.setMax(100); 

     // Updating progress bar 
     updateProgressBar();    
    } catch (IllegalArgumentException e) { 
     e.printStackTrace(); 
    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

/** 
* Update timer on seekbar 
* */ 
public void updateProgressBar() { 
    mHandler.postDelayed(mUpdateTimeTask, 100);   
} 

/** 
* Background Runnable thread 
* */ 
private Runnable mUpdateTimeTask = new Runnable() { 
     public void run() { 
      long totalDuration = mp.getDuration(); 
      long currentDuration = mp.getCurrentPosition(); 

      // Displaying Total Duration time 
      songTotalDurationLabel.setText(""+utils.milliSecondsToTimer(totalDuration)); 
      // Displaying time completed playing 
      songCurrentDurationLabel.setText(""+utils.milliSecondsToTimer(currentDuration)); 

      // Updating progress bar 
      int progress = (int)(utils.getProgressPercentage(currentDuration, totalDuration)); 
      //Log.d("Progress", ""+progress); 
      songProgressBar.setProgress(progress); 

      // Running this thread after 100 milliseconds 
      mHandler.postDelayed(this, 100); 
     } 
    }; 

/** 
* 
* */ 
@Override 
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch) { 

} 

/** 
* When user starts moving the progress handler 
* */ 
@Override 
public void onStartTrackingTouch(SeekBar seekBar) { 
    // remove message Handler from updating progress bar 
    mHandler.removeCallbacks(mUpdateTimeTask); 
} 

/** 
* When user stops moving the progress hanlder 
* */ 
@Override 
public void onStopTrackingTouch(SeekBar seekBar) { 
    mHandler.removeCallbacks(mUpdateTimeTask); 
    int totalDuration = mp.getDuration(); 
    int currentPosition = utils.progressToTimer(seekBar.getProgress(), totalDuration); 

    // forward or backward to certain seconds 
    mp.seekTo(currentPosition); 

    // update timer progress again 
    updateProgressBar(); 
} 

/** 
* On Song Playing completed 
* if repeat is ON play same song again 
* if shuffle is ON play random song 
* */ 
@Override 
public void onCompletion(MediaPlayer arg0) { 

    // check for repeat is ON or OFF 
    if(isRepeat){ 
     // repeat is on play same song again 
     playSong(currentSongIndex); 
    } else if(isShuffle){ 
     // shuffle is on - play a random song 
     Random rand = new Random(); 
     currentSongIndex = rand.nextInt((songsList.size() - 1) - 0 + 1) + 0; 
     playSong(currentSongIndex); 
    } else{ 
     // no repeat or shuffle ON - play next song 
     if(currentSongIndex < (songsList.size() - 1)){ 
      playSong(currentSongIndex + 1); 
      currentSongIndex = currentSongIndex + 1; 
     }else{ 
      // play first song 
      playSong(0); 
      currentSongIndex = 0; 
     } 
    } 
} 

@Override 
public void onDestroy(){ 
super.onDestroy(); 
    mp.release(); 
} 

} 

雖然我有一個ListActivity PlayListActivity,並且代碼:

public class PlayListActivity extends ListActivity { 
    // Songs list 
    public ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>(); 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.playlist); 

     ArrayList<HashMap<String, String>> songsListData = new ArrayList<HashMap<String, String>>(); 

     SongsManager plm = new SongsManager(); 
     // get all songs from sdcard 
     this.songsList = plm.getPlayList(); 

     // looping through playlist 
     for (int i = 0; i < songsList.size(); i++) { 
      // creating new HashMap 
      HashMap<String, String> song = songsList.get(i); 

      // adding HashList to ArrayList 
      songsListData.add(song); 
     } 

     // Adding menuItems to ListView 
     ListAdapter adapter = new SimpleAdapter(this, songsListData, 
       R.layout.playlist_item, new String[] { "songTitle" }, new int[] { 
         R.id.songTitle }); 

     setListAdapter(adapter); 

     // selecting single ListView item 
     ListView lv = getListView(); 
     // listening to single listitem click 
     lv.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> parent, View view, 
        int position, long id) { 
       // getting listitem index 
       int songIndex = position; 

       // Starting new intent 
       Intent in = new Intent(getApplicationContext(), 
         AndroidBuildingMusicPlayerActivity.class); 
       // Sending songIndex to PlayerActivity 
       in.putExtra("songIndex", songIndex); 
       setResult(100, in); 
       // Closing PlayListView 
       finish(); 
      } 
     }); 

    } 
} 

每當我把AndroidBuildingMusicPlayerActivity爲主要活動,宋開始。 但是每當我嘗試使用PlayListActivity作爲主要活動時,應該在listclick上啓動的AndroidBuildingMusicPlayerActivity永遠不會被激發

回答

0

您沒有在onItemClick中啓動活動。使用

startActivity(in) 
0

你的孩子的活動從來沒有開始,因爲你缺少startActivity(intent)

 @Override 
     public void onItemClick(AdapterView<?> parent, View view, 
       int position, long id) { 
      // getting listitem index 
      int songIndex = position; 

      // Starting new intent 
      Intent in = new Intent(getApplicationContext(), 
        AndroidBuildingMusicPlayerActivity.class); 
      // Sending songIndex to PlayerActivity 
      in.putExtra("songIndex", songIndex); 
      startActivity(in); 

     } 
通話