【Android apk】本地音乐播放简易功能Demo

功能点:

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

功能展示:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码实现

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>
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个Android音乐播放demo,支持本地sd卡路径下.mp3文件播放,上下歌曲切换,暂停、播放功能,手动控制进度条,支持安卓8.1+(需要apk访问sd卡权限)。具体实现可以参考以下步骤: 1.在AndroidManifest.xml文件中添加读写SD卡权限: ```xml <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> ``` 2.在布局文件中添加音乐播放相关的控件: ```xml <Button android:id="@+id/btn_previous" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="上一首" /> <Button android:id="@+id/btn_play_pause" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="播放" /> <Button android:id="@+id/btn_next" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="下一首" /> <SeekBar android:id="@+id/seek_bar" android:layout_width="match_parent" android:layout_height="wrap_content" /> ``` 3.在Activity中实现音乐播放相关的逻辑: ```java public class MainActivity extends AppCompatActivity implements View.OnClickListener { private MediaPlayer mediaPlayer; private Button btnPrevious; private Button btnPlayPause; private Button btnNext; private SeekBar seekBar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnPrevious = findViewById(R.id.btn_previous); btnPlayPause = findViewById(R.id.btn_play_pause); btnNext = findViewById(R.id.btn_next); seekBar = findViewById(R.id.seek_bar); btnPrevious.setOnClickListener(this); btnPlayPause.setOnClickListener(this); btnNext.setOnClickListener(this); mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { seekBar.setMax(mediaPlayer.getDuration()); mediaPlayer.start(); } }); mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { btnPlayPause.setText("播放"); } }); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_previous: // 上一首 break; case R.id.btn_play_pause: // 播放/暂停 if (mediaPlayer.isPlaying()) { mediaPlayer.pause(); btnPlayPause.setText("播放"); } else { mediaPlayer.start(); btnPlayPause.setText("暂停"); } break; case R.id.btn_next: // 下一首 break; } } @Override protected void onDestroy() { super.onDestroy(); mediaPlayer.release(); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值