2017-01-03 4 views
3

Привет, я создаю приложение для музыкального плеера.Несколько песен играют, когда я нажимаю на listview в медиаплеере

У меня проблема в том, что когда я нажимаю на listview, он играет песню.

Когда я снова щелкнул по списку, песни воспроизводятся вместе.

Предыдущая песня не останавливается.

Я следил за многими сообщениями и блогами и ответами 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.release(); –

+0

Теперь он работал, создавая MediaPlayer как static.Thanks @Rucha Bhatt – Pedo

ответ

2

Поскольку вы являетесь креатором каждый раз, когда вы запускаете новый экземпляр MediaPlayer в своей деятельности.

Используйте один экземпляр MediaPlayer.

Создайте класс singleton и используйте MediaPlayer оттуда.

Или вы можете сделать MediaPlayer публичным static в своей деятельности ListView.

public static MediaPlayer mp = new MediaPlayer(); 

И использовать этот MediaPlayer в вашей now_playing активности

+1

Большое вам спасибо, сэр. Это сработало. – Pedo

1

Я была такая же проблема и фиксируется как это. Измените требования к проекту.

Объявить свой mediaPlayer Instance глобально

static MediaPlayer mediaPlayer = new MediaPlayer(); 

Создать свой AudioManager и настройки громкости (примечание: Я использовал Max Volume для воспроизведения звука):

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

Затем поместить этот код на кнопку Play 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

 Смежные вопросы

  • Нет связанных вопросов^_^