2017-01-03 121 views
3

您好,我正在創建音樂播放器應用程序。當我點擊mediaplayer中的listview時,會播放多首歌曲

我有一個問題,當我點擊listview播放歌曲。

當我再次點擊listview,然後歌曲一起播放。

上一首歌不停止。

我跟着很多tuts和博客和stackoverflow的答案,但沒有任何工作。

這裏是我的活動包含歌曲列表視圖: -

public class songlist extends AppCompatActivity 
    implements NavigationView.OnNavigationItemSelectedListener { 

    private ListView lv_songlist; 
    public Cursor cursor; 

    private MediaCursorAdapter mediaAdapter = null; 
    private String currentFile; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.songlist); 

     lv_songlist = (ListView) findViewById(R.id.songlist); 


     cursor = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, null); 

     if (null != cursor) 
     { 
      cursor.moveToFirst(); 

      mediaAdapter = new MediaCursorAdapter(this, R.layout.listitem, cursor); 



      lv_songlist.setAdapter(mediaAdapter); 
      lv_songlist.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
       @Override 
       public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
        currentFile = (String) view.getTag(); 

        Intent myIntent = new Intent(songlist.this, 
         now_playing.class); 
        myIntent.putExtra("song",""+currentFile); 
        myIntent.putExtra("cursor-position",cursor.getPosition()); 
        startActivity(myIntent); 
       } 
      }); 
     } 

     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
     fab.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 

       Intent myIntent = new Intent(songlist.this, 
        now_playing.class); 
       myIntent.putExtra("song",""); 
       startActivity(myIntent); 
      } 
     }); 

     DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
     ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
      this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 
     drawer.setDrawerListener(toggle); 
     toggle.syncState(); 

     NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); 
     navigationView.setNavigationItemSelectedListener(this); 
    } 

    @Override 
    public void onBackPressed() { 
     DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
     if (drawer.isDrawerOpen(GravityCompat.START)) 
     { 
      drawer.closeDrawer(GravityCompat.START); 
     } 
     else 
     { 
      super.onBackPressed(); 
     } 
    } 

     @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.songlist, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     int id = item.getItemId(); 

     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

    @SuppressWarnings("StatementWithEmptyBody") 
    @Override 
    public boolean onNavigationItemSelected(MenuItem item) { 
     int id = item.getItemId(); 

     if (id == R.id.nav_camera) 
     { 
     } 
     else if (id == R.id.nav_gallery) { 

     } else if (id == R.id.nav_slideshow) { 

     } else if (id == R.id.nav_manage) { 

     } else if (id == R.id.nav_share) { 

     } else if (id == R.id.nav_send) { 

     } 

     DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
     drawer.closeDrawer(GravityCompat.START); 
     return true; 
    } 



    private class MediaCursorAdapter extends SimpleCursorAdapter { 

     public MediaCursorAdapter(Context context, int layout, Cursor c) { 
      super(context, layout, c, 
       new String[]{MediaStore.MediaColumns.DISPLAY_NAME, MediaStore.MediaColumns.TITLE, MediaStore.Audio.AudioColumns.DURATION}, 
       new int[]{R.id.displayname, R.id.title, R.id.duration}); 
     } 

     @Override 
     public void bindView(View view, Context context, Cursor cursor) { 
      TextView title = (TextView) view.findViewById(R.id.title); 
      TextView name = (TextView) view.findViewById(R.id.displayname); 
      TextView duration = (TextView) view.findViewById(R.id.duration); 

      name.setText(cursor.getString(
       cursor.getColumnIndex(MediaStore.MediaColumns.DISPLAY_NAME))); 

      title.setText(cursor.getString(
       cursor.getColumnIndex(MediaStore.MediaColumns.TITLE))); 

      long durationInMs = Long.parseLong(cursor.getString(
       cursor.getColumnIndex(MediaStore.Audio.AudioColumns.DURATION))); 

      Duration d = new Duration(); 

      String durationInMin = d.convertDuration(durationInMs); 

      duration.setText("" + durationInMin); 

      view.setTag(cursor.getString(cursor.getColumnIndex(MediaStore.MediaColumns.DATA))); 
     } 

     @Override 
     public View newView(Context context, Cursor cursor, ViewGroup parent) { 
      LayoutInflater inflater = LayoutInflater.from(context); 
      View v = inflater.inflate(R.layout.listitem, parent, false); 

      bindView(v, context, cursor); 

      return v; 
     } 
    } 


    } 

,這是我的音樂演奏活動起着歌曲一起: -

public class now_playing extends AppCompatActivity implements View.OnClickListener{ 

    private MediaPlayer mp = new MediaPlayer(); 
    private Cursor cursor; 
    private RelativeLayout rl_album; 
    private TextView Title_now_playing,duration_now_playing; 
    private String Title,Duration,currentSong; 
    private int cursorPosition; 
    private ImageButton playPrev,playNext,seekFwd,seekBwd; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.now_playing); 


     setTitle(""); 
     cursor = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, null); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     android.support.v7.app.ActionBar mActionBar = getSupportActionBar(); 



     LayoutInflater mInflater = LayoutInflater.from(this); 

     View mCustomView = mInflater.inflate(R.layout.custom_layout_now_playing_for_action_bar, null); 


     Title_now_playing = (TextView) mCustomView.findViewById(R.id.title_text); 
     duration_now_playing = (TextView) findViewById(R.id.duration); 

     playNext = (ImageButton) findViewById(R.id.playNext); 

     rl_album = (RelativeLayout) findViewById(R.id.rl_album); 
     Title_now_playing.setText(Title); 

     mActionBar.setCustomView(mCustomView); 
     mActionBar.setDisplayShowCustomEnabled(true); 


     Intent in = getIntent(); 
     currentSong = in.getStringExtra("song"); 
     cursorPosition = in.getIntExtra("cursor-position",1); 

      displayDetails(); 


     playNext.setOnClickListener(this); 
    } 



    void displayDetails(){ 
     mp.stop(); 
     mp.reset(); 
     if(!currentSong.equals("")) 
     { 
      cursor.move(cursorPosition+1); 
      try { 
       mp.setDataSource(currentSong); 
       mp.prepare(); 
       mp.start(); 
      } catch (IllegalArgumentException e) { 
       e.printStackTrace(); 
      } catch (IllegalStateException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

      Title = cursor.getString(cursor.getColumnIndex(MediaStore.MediaColumns.DISPLAY_NAME)); 
      int duration = cursor.getColumnIndex 
       (MediaStore.Audio.Media.DURATION); 

      long SongDuration = cursor.getLong(duration); 
      com.example.davda.musicmain.Duration d = new Duration(); 
      Duration = d.convertDuration(SongDuration); 
      duration_now_playing.setText(Duration); 
      Title_now_playing.setText(Title); 

      ContentResolver musicResolve = getContentResolver(); 
      Uri smusicUri = MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI; 
      Cursor musicCursorTogetAlbum =musicResolve.query(smusicUri,null   //should use where clause(_ID==albumid) 
       ,null, null, null); 



      musicCursorTogetAlbum.move(cursorPosition+1);  //i put only one song in my external storage to keep things simple; 
     try{ 
      int x = musicCursorTogetAlbum.getColumnIndex(MediaStore.Audio.Albums.ALBUM_ART); 
      String thisArt = musicCursorTogetAlbum.getString(x); 


      Bitmap bm = BitmapFactory.decodeFile(thisArt); 
      Drawable dr = new BitmapDrawable(getResources(), bm); 

      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { 
       rl_album.setBackground(dr); 
      } 
     }catch (RuntimeException re) 
     { 
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { 
       rl_album.setBackgroundColor(Color.BLACK); 
      } 
     } 
    } 
} 


public boolean onCreateOptionsMenu(Menu menu) { 

    getMenuInflater().inflate(R.menu.now_playing_menu, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    switch (item.getItemId()) { 

     case android.R.id.home: 
      Intent myIntent = new Intent(now_playing.this, 
        songlist.class); 
      startActivity(myIntent); 
      return true; 

     case R.id.custom_equalizer: 
      Toast.makeText(now_playing.this,"Custom Equalizer button pressed. Good broooooooooooooooooooooo...",Toast.LENGTH_LONG).show(); 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 


    @Override 
    public void onClick(View v) { 
     switch (v.getId()) { 
      case R.id.playNext: { 

       cursor.moveToNext(); 

       currentSong = cursor.getString(cursor.getColumnIndex(MediaStore.MediaColumns.DATA)); 

       displayDetails(); 

      } 
     } 
    } 
} 
+0

無需創建每次媒體播放器的新實例使用的MediaPlayer,使用單個實例,當你停止音樂,你也應該用mediaPlayer.release釋放實例(); –

+0

它現在通過使MediaPlayer靜態工作。感謝@Rucha Bhatt – Pedo

回答

2

因爲你是cre在您的活動中每次都會看到MediaPlayer的新實例。

使用MediaPlayer的單個實例。

創建一個singleton類並從那裏使用MediaPlayer。

或者您可以將MediaPlayer製作爲ListView活動中的公共靜態。

public static MediaPlayer mp = new MediaPlayer(); 

而在你now_playing活動

+1

非常感謝你,先生。有效。 – Pedo

1

我有同樣的問題和固定的像這個。更改爲您的項目要求。

聲明你mediaPlayer實例全球

static MediaPlayer mediaPlayer = new MediaPlayer(); 

創建AudioManager和音量設置(注:我用最大音量播放聲音):

AudioManager mAudioManager = (AudioManager) getSystemService(AUDIO_SERVICE); 
     int maxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); 
     mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, maxVolume, AudioManager.FLAG_PLAY_SOUND); 

然後把這個代碼在您的播放按鈕onClick

 try { 

      if (mediaPlayer != null) { 
       if (mediaPlayer.isPlaying()) { 
        mediaPlayer.stop(); 
       } 
       mediaPlayer.release(); 
       mediaPlayer = null; 
      } 

      mediaPlayer.setDataSource(filePath); 
      mediaPlayer.prepare(); 
      mediaPlayer.start(); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
+0

非常感謝您的先生,在靜態工作的幫助下。 – Pedo

相關問題