音乐播放器实现功能之—

功能一,遍历sdcard里面的音乐文件显示到listview里面;

要遍历sdk首先要判断sdk是否能用;如果可用再进行遍历;

 * 检查外部存储是否可用
  *
  * @return
  */
 private boolean isExternalStorageWritable() {
  String state = Environment.getExternalStorageState();
  if (state.equals(Environment.MEDIA_MOUNTED)) {
   return true;
  } else {
   return false;
  }
 }

File folder = Environment.getExternalStorageDirectory();

private void toSearchFile(File rootFile) {
  File[] listFile = rootFile.listFiles();
  if (listFile != null) {
   for (File file : listFile) {
    if (file.isDirectory()) {// 目录
     File files = file.getAbsoluteFile();
     toSearchFile(files);
    } else { // 文件操作
     // 过虑文件显示路径

     if (file.getPath().endsWith(".mp3")) {

      mFileList.add(file);
      // 构造音乐播放列表资源
      MusicBean music = new MusicBean();
      music.setMusicName(file.getName());
      music.setMusicPath(file.getPath());

      String musicName = music.getMusicName(); // 音乐文件名.mp3
      musicName = musicName.substring(0,
        musicName.length() - 4); // ========字符串处理方法一=======
      // =============字符串处理方法二===========
      //
      // Logs.v("musicName >>>>> :"+musicName);
      // String[] musicArray = musicName.split(".");
      // //{音乐文件名.mp3}
      // Logs.v("musicArray size :"+musicArray.length);
      // musicName = musicArray[0];
      music.setMusicName(musicName);

      mMusicBeanList.add(music);

     }
    }
   }
  }
 }

遍历文件要使用递归调用,最后把遍历出来的文件判断以MP3结尾的就放入定义好的动态数组Arraylist里面,这个LIst就是数据源了了;

功能二:点击LIstview的单项跳转到播放页面去播放;

这儿就需要用到Intent传参了;

Intent带的参数就是你便利出来的文件的路劲,

获取路劲使用ListView的每一项点击事件OnItemClickListener;public void onItemClick(AdapterView<?> parent, View view, int position,
   long id) {

用parent.getadapter获取数据源,用adapter.geitem获取每一项的对象就是一个文件,然后就能获取到file的信息了,再使用Intent穿过去;

点击播放就能播放了;

 

功能s三:如何在播放页面点击上下首歌曲能播放;

因为遍历出来的文件放在是另一个页面的ListView;

所以这里Intent传参就是要传ArrayList对象了;

package com.example.bean;

import android.os.Parcel;
import android.os.Parcelable;

public class MusicBean implements Parcelable {
 private String musicName;
 private String musicPath;

 public String getMusicName() {
  return musicName;
 }

 public void setMusicName(String musicName) {
  this.musicName = musicName;
 }

 public String getMusicPath() {
  return musicPath;
 }

 public void setMusicPath(String musicPath) {
  this.musicPath = musicPath;
 }

 @Override
 public int describeContents() {

  return 0;
 }

 @Override
 public void writeToParcel(Parcel dest, int flags) {
  dest.writeString(musicName);
  dest.writeString(musicPath);
 }

 public static final Parcelable.Creator<MusicBean> CREATOR = new Parcelable.Creator<MusicBean>() {

  @Override
  public MusicBean createFromParcel(Parcel source) {
   MusicBean music = new MusicBean();
   music.musicName = source.readString();
   music.musicPath = source.readString();
   return music;
  }

  @Override
  public MusicBean[] newArray(int size) {
   return new MusicBean[size];
  }
 };

}

定义的实现implements Parcelable 的对象把需要穿的数据放进去,在遍历文件出来的时候就放进去

if (file.getPath().endsWith(".mp3")) {

      mFileList.add(file);
      // 构造音乐播放列表资源
      MusicBean music = new MusicBean();
      music.setMusicName(file.getName());
      music.setMusicPath(file.getPath());

      String musicName = music.getMusicName(); // 音乐文件名.mp3
      musicName = musicName.substring(0,
        musicName.length() - 4); // ========字符串处理方法一=======
      // =============字符串处理方法二===========
      //
      // Logs.v("musicName >>>>> :"+musicName);
      // String[] musicArray = musicName.split(".");
      // //{音乐文件名.mp3}
      // Logs.v("musicArray size :"+musicArray.length);
      // musicName = musicArray[0];
      music.setMusicName(musicName);

      mMusicBeanList.add(music);

最后构建Intent@Override
 public void onItemClick(AdapterView<?> parent, View view, int position,
   long id) {
  
  Intent intent = new Intent(this, PlayerPag.class);
  intent.putParcelableArrayListExtra("MUSIC_LIST", mMusicBeanList);
  intent.putExtra("CURRENT_POSTION", position);
  startActivity(intent);
  
  
 }

在播放页面接收

Intent intent = getIntent();
  mMusicList = intent.getParcelableArrayListExtra("MUSIC_LIST");
  mCurrentPostion = intent.getIntExtra("CURRENT_POSTION", 0);

因为要实现上下首切换所以要获得一个position,得到你点击的第几首

 

最后就是优化上下首切换,防止切换到最后或者最开始报错

case R.id.playerpag_control_previous_btn:
   if (--mCurrentPostion >= 0) {
    playerNewMusic(mCurrentPostion);
   } else {
    mCurrentPostion = 0;
    Toast.makeText(this, "已到第一首", Toast.LENGTH_SHORT).show();
   }

   break;
  case R.id.playerpag_control_next_btn:
   if (++mCurrentPostion < mMusicList.size()) {
    playerNewMusic(mCurrentPostion);
   } else {
    mCurrentPostion = mMusicList.size() - 1;
    Toast.makeText(this, "已到最后一首", Toast.LENGTH_SHORT).show();
   }

   break;
  }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值