功能点:

1.支持本地sd卡路径下.mp3文件播放
2.上下歌曲切换
3.暂停、播放功能
4.手动控制进度条
5.支持安卓8.1+(需要apk访问sd卡权限)

功能展示:

android 读取内存音乐 android获取本地音乐_android 读取内存音乐


android 读取内存音乐 android获取本地音乐_ide_02


android 读取内存音乐 android获取本地音乐_ide_03

代码实现

public class MainActivity extends ListActivity {

private TextView text;
private SeekBar seekbar;
private Button startplay;
private ListView songlist;
private MediaPlayer player;
private int current;
private boolean isPause;
private List<Map<String, String>> data;
private Handler handler = new Handler();
private boolean isStartTrackingTouch;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //当前歌曲名称
    text = (TextView) findViewById(R.id.song_name);
    //进度信息
    seekbar = (SeekBar) findViewById(R.id.song_seekbar);
    //开始按钮
    startplay =  (Button) findViewById(R.id.playbt);
    //List信息,需要加载的歌曲列表信息
    songlist = (ListView) findViewById(android.R.id.list);
    //创建播放器
    player = new MediaPlayer();
    //显示播放列表信息
    ShowPlayList();
    //播放器监听 实现下一首自动播放
    player.setOnCompletionListener(new FinshListner());
    //设置进度条信息
    seekbar.setOnSeekBarChangeListener(new seekbarListner());
}
@Override
public void onResume(){
    super.onResume();
    resume();
}

//进度条手动拉拽监听
private final class seekbarListner implements SeekBar.OnSeekBarChangeListener{
    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser){};
    public void onStartTrackingTouch(SeekBar seekBar){
        //触发操作时,Runnable暂停操作,有判断条件
        isStartTrackingTouch = true;
    };
    public void onStopTrackingTouch(SeekBar seekBar){
        //人手动拉动进度条,需要调整播放进度
        player.seekTo(seekBar.getProgress());
        isStartTrackingTouch = false;
    };
}
//进度条完成后,需要播放下一首歌曲
private final class FinshListner implements MediaPlayer.OnCompletionListener {
    @Override
    public void onCompletion(MediaPlayer mp) {
        //播放下一首歌曲 可扩展随机播放下一首
        NextSong();
    }
}
//列表点击的监听 点击到具体的位置开始 播放
private final class MyItemListener implements AdapterView.OnItemClickListener {
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        current = position;
        //开始播放
        play();
    }
}

//播放列表显示
public void ShowPlayList(){
    List<File> list = new ArrayList<File>();
    //获取sd卡中所有的文件
    GetSongList(Environment.getExternalStorageDirectory(),list);
    Collections.sort(list);
    data = new ArrayList<Map<String, String>>();
    for (File file:list){
        Map<String,String> Hashmap = new HashMap<String, String>();
        Hashmap.put("name",file.getName());
        Hashmap.put("path",file.getAbsolutePath());
        data.add(Hashmap);
    }
    //data添加完成,可以设置显示为ListView
    SimpleAdapter smpAdapter = new SimpleAdapter(this,data,R.layout.item,new String[]{"name"},new int[]{R.id.mName});
    songlist.setAdapter(smpAdapter);
    songlist.setOnItemClickListener(new MyItemListener());
}

//灵活处理点,支持本地或对端获取列表信息   输入为获取的目录信息
public void GetSongList(File file,List<File> filelist){
    //歌曲目录下遍历所有的歌曲信息
    File[] subfiles = file.listFiles();
    //如果为空,则列出所有信息,把file添加到列表中
    if (subfiles!=null){
        for (File subfile:subfiles){
            //判断如果类型为File,并且
            if (subfile.isFile() && subfile.getName().endsWith(".mp3")){
                filelist.add(subfile);
            }else if(subfile.isDirectory()){
                GetSongList(subfile,filelist);
            }
        }
    }
}
//暂停、播放按钮
public void PlaySong(View view){
    //默认播放第一首歌曲;如果当前为暂停,则设置为播放;如果当前为播放,则设置为暂停
    if (!player.isPlaying()&&!isPause){
        play();
        return;
        //直接结束
    }
    Button button = (Button) view;
    //判断当前的text状态
    if ( "▶" == button.getText()){
        //当前为暂停的状态,点击就是恢复了
        resume();
        button.setText("||");
    }else if ("||" == button.getText()){
        pause();
        button.setText("▶");
    }
}
//下一首监听
public void NextSong(View view){
    NextSong();
}
//上一首监听
public void PrevoisSong(View view){
    PrevoisSong();
}
//播放下一首
private void NextSong(){
    //把列表信息重新排列 取余的方法
    current = (current + 1)%data.size();
    play();
}
//播放上一首
private void PrevoisSong(){
    //把列表信息重新排列
    current = (current - 1<0)?(data .size()-1):(current-1);
    play();
}
//恢复播放
public void resume(){
    //判断是否
    if (isPause){
        player.start();
        isPause = false;
    }
}
public void pause(){
    //直接暂停
    if (player!=null && player.isPlaying()){
        player.pause();
        isPause = true;
    }
}
private void play(){
    //初始化MediaPlayer资源
    player.reset();
    try {
        //获取需要播放的路径信息
        player.setDataSource(data.get(current).get("path"));
        player.prepare();
        player.start();
    } catch (IOException e) {
        e.printStackTrace();
    }
    //设置显示歌名
    text.setText(data.get(current).get("name"));
    //设置MAX值为文件总时长
    seekbar.setMax(player.getDuration());
    //设置中间button为开始状态
    startplay.setText("||");
    //handler执行run方法刷新进度条
    handler.post(new Runnable() {
        @Override
        public void run() {
            if (!isStartTrackingTouch){
                seekbar.setProgress(player.getCurrentPosition());
                handler.postDelayed(this,2000);
            }
        }
    });
}

}

布局文件信息

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <TextView
        android:id="@+id/song_name"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />
    <SeekBar
        android:id="@+id/song_seekbar"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="20dp">
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="|◀"
            android:onClick="PrevoisSong"/>
        <Button
            android:id = "@+id/playbt"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="▶"
            android:onClick="PlaySong"/>
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="▶|"
            android:onClick="NextSong"/>
    </LinearLayout>
    <ListView
        android:id = "@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"/>
</LinearLayout>

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:padding="10dp"
    >
    <TextView
        android:id="@+id/mName"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textSize="15sp"
        />
</LinearLayout>