Android的简易音乐播放器

       这些日子都在学习Android的应用开发,于是参考了Android从入门到精通里的代码(明日科技),抄抄写写做了一个简易的音乐播放器,修修改改也看了好多网上的代码,在三星盖世3上测试可以运行(关闭时会有停止运行的提示),但是在Genymotion的模拟器上无法运行,也就是闪退,还找不到原因,但是先把代码贴出来吧。。


Main.xml文件:

  1. <?xml version="1.0" encoding="utf-8"?>
    
    <span style="font-family:Comic Sans MS;"><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                  android:orientation="vertical"
                  android:layout_width="fill_parent"
                  android:layout_height="fill_parent"
    
            >
        <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="0dp"
                android:layout_weight="6">
        <ListView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:id="@+id/list"
                android:drawSelectorOnTop="false">
        </ListView>
        </LinearLayout>
    
    
    
        <include layout="@layout/buttom"
                android:layout_weight="1"
                android:layout_height="0dp"
                android:layout_width="fill_parent"/>
        <include layout="@layout/seek"
                 android:layout_width="fill_parent"
                 android:layout_height="0dp"
                 android:layout_weight="1"/>
    
    
    </LinearLayout></span>
    


buttom.xml文件

<span style="font-family:Comic Sans MS;"><?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent">
    <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="50dp"
            android:orientation="horizontal">
        <ImageButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:id="@+id/Pre"
                android:src="@drawable/pre"/>
        <ImageButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:id="@+id/Play"
                android:src="@drawable/play"/>
        <ImageButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:id="@+id/Pause"
                android:src="@drawable/pause"/>
        <ImageButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:id="@+id/Stop"
                android:src="@drawable/stop"/>
        <ImageButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:id="@+id/Next"
                android:src="@drawable/next"/>
            </LinearLayout>

</LinearLayout></span>
seek.xml文件:
<span style="font-family:Comic Sans MS;"><?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent">

    <SeekBar
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/seekBar"
            android:layout_gravity="center_horizontal"/>
</LinearLayout>

</span>


MyActivity.java文件:


<span style="font-family:Comic Sans MS;">package com.example.Player;

import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Message;
import android.view.View;
import android.widget.*;
import android.os.Handler;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;


public class MyActivity extends Activity {
    private MediaPlayer mediaPlayer;
    private List<String>audioList=new ArrayList<String>();
    private int currentItem=0;
    private ImageButton pause;
    private SeekBar seekBar;

    @Override
    protected void onDestroy() {
        if (mediaPlayer.isPlaying()){
            mediaPlayer.stop();
        }
        mediaPlayer.release();
        super.onDestroy();
    }

    /**
     * Called when the activity is first created.
     */
    Handler handler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what){
                case 0:
                    int position=mediaPlayer.getCurrentPosition();
                    int time=mediaPlayer.getDuration();
                    int max=seekBar.getMax();
                    seekBar.setProgress(position*max/time);
                    break;
                default:
                    break;
            }

        }
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mediaPlayer=new MediaPlayer();
        ImageButton play=(ImageButton)findViewById(R.id.Play);
        ImageButton pre=(ImageButton)findViewById(R.id.Pre);
        ImageButton stop=(ImageButton)findViewById(R.id.Stop);
        ImageButton next=(ImageButton)findViewById(R.id.Next);
        pause= (ImageButton) findViewById(R.id.Pause);
        audioList();
        seekBar= (SeekBar) findViewById(R.id.seekBar);
        seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
                int dest=seekBar.getProgress();
                int time=mediaPlayer.getDuration();
                int max=seekBar.getMax();
                mediaPlayer.seekTo(time*dest/max);
            }
        });
        pre.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                preMusic();
            }
        });
        play.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                playMusic(audioList.get(currentItem));

            }
        });

        pause.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mediaPlayer.isPlaying()){
                    mediaPlayer.pause();
                    ((ImageButton) v).setImageResource(R.drawable.pause1);
                }else{
                    mediaPlayer.start();
                    ((ImageButton) v).setImageResource(R.drawable.pause);
                }
            }
        });
        stop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mediaPlayer.isPlaying()){
                    mediaPlayer.stop();
                  
                }
                pause.setEnabled(false);
            }
        });
        next.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                nextMusic();
            }
        });
        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                nextMusic();
            }
        });
    }

    private void audioList() {
        getFiles("/sdcard/kgmusic/download/");
        ArrayAdapter<String>adapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,audioList);
        ListView listView=(ListView)findViewById(R.id.list);
        listView.setAdapter(adapter);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                currentItem = position;//将当前列表的索引值赋给currentItem


                playMusic(audioList.get(currentItem));
            }
        });
        final int milliseconds=100;
        new Thread(){
            @Override
            public void run() {
                while(true){
                    try{
                        sleep(milliseconds);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    handler.sendEmptyMessage(0);
                }
            }
        }.start();
    }
    private static String[] imageFormateSet=new String[]{"mp3","wav","3gp"};
    private static boolean isAudioFile(String path){
        for (String format:imageFormateSet){        //遍历数组
            if (path.contains(format)){         //判断是否为合法的音频文件
                return true;
            }
        }
        return false;
    }

    private void playMusic(String path) {
        try{
            if (mediaPlayer.isPlaying()){
                mediaPlayer.stop();             //停止当前音频的播放
            }
            mediaPlayer.reset();
            mediaPlayer.setDataSource(path);
            mediaPlayer.prepare();
            mediaPlayer.start();

            pause.setEnabled(true);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    void nextMusic(){
        if (++currentItem>=audioList.size()){
            currentItem=0;
        }
        playMusic(audioList.get(currentItem));
    }
    void preMusic(){


        if (--currentItem>=0) {
            if (currentItem >= audioList.size()) {
                currentItem = 0;
                }
            } else {
                currentItem = audioList.size() - 1;
            }

        playMusic(audioList.get(currentItem));

    }



    private void getFiles(String url) {
        File files=new File(url);//创建文件对象
        File[] file=files.listFiles();
        try{
            for (File f:file){                  //通过for循环遍历获取到的文件数组
                if (f.isDirectory()){
                    getFiles(f.getAbsolutePath());
                }else {
                    if (isAudioFile(f.getPath())){      //如果是音频文件
                        audioList.add(f.getPath());         //将文件路径添加到List集合中
                    }
                }
            }
        }catch (Exception e){
            e.printStackTrace();            //输出异常信息
        }
    }
}</span>

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在播放界面点击除唱片外的任意一处区域可实现收藏按钮和模式选择按钮的显示,这俩个按钮是默认被隐藏的,再次点击界面上除唱片外的任意一处,这俩个按钮又会被隐藏起来。点击唱片会跳转到歌词显示的界面,如果在本机中有与歌词匹配的歌词文件,那么歌词会显示在此界面上,歌词以滚动的形式显示,而且会与歌曲的演唱匹配在歌词显示的界面有调节音量的拖动条,在歌词显示的界面点击红色的话筒按钮会退出此界面回到正在播放的界面,在正在播放的界面向右滑动会进入到信息显示的界面,在信息显示的界面点击歌手列表会显示出所有歌手的名字和头像,点击专辑列表显示出歌曲专辑的名称以及封面照片和发行时间,点击我的收藏会显示自己收藏的歌曲的名称,歌唱者以及歌曲的大小。此播放器的主要三个界面歌曲列表界面、正在播放界面、主要信息界面是以滑动的形式切换,在滑动切换界面后,每个界面的图标会相应的变色,当然也可以点击各界面的图标实现界面的切换。以上基本就是此播放器的所有功能了。 以上一大堆废话还是有些BUg的,而且做得也不太好,大家轻喷,马马虎虎看吧,做了3天,第一次上传,歌词文件一定要与歌曲文件同名,放在SD卡下,如果在genymotion中导入了歌曲和歌词,但运行程序不显示歌曲,那就需要重启genymotion了。总之欢迎下载吧。
以下是一个简单的 Android 音乐播放器的示例代码。这个示例应用程序使用 Media Player 来播放本地存储的音频文件。 首先,在你的 Android 项目中添加以下权限: ```xml <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> ``` 然后,在你的布局文件中添加以下代码: ```xml <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <ListView android:id="@+id/listview" android:layout_width="match_parent" android:layout_height="wrap_content" /> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="20dp"> <TextView android:id="@+id/song_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:text="Song Name" android:textSize="20sp" /> <ImageButton android:id="@+id/play_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/song_name" android:layout_centerHorizontal="true" android:layout_marginTop="20dp" android:background="@null" android:src="@drawable/play_button" /> </RelativeLayout> </LinearLayout> ``` 接下来,在你的 MainActivity.java 文件中添加以下代码: ```java public class MainActivity extends AppCompatActivity { private ListView mListView; private TextView mSongName; private ImageButton mPlayButton; private MediaPlayer mMediaPlayer; private int mCurrentPosition = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化 UI 元素 mListView = findViewById(R.id.listview); mSongName = findViewById(R.id.song_name); mPlayButton = findViewById(R.id.play_button); // 获取本地存储的音频文件列表 final List<String> songs = new ArrayList<>(); String path = Environment.getExternalStorageDirectory().getPath() + "/Music/"; File directory = new File(path); File[] files = directory.listFiles(); if (files != null) { for (int i = 0; i < files.length; i++) { if (files[i].getName().endsWith(".mp3")) { songs.add(files[i].getName()); } } } // 设置音频文件列表 ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, songs); mListView.setAdapter(adapter); // 设置列表项点击事件 mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if (mMediaPlayer != null) { mMediaPlayer.release(); mMediaPlayer = null; } // 获取所选音频文件的路径 String songPath = Environment.getExternalStorageDirectory().getPath() + "/Music/" + songs.get(position); // 初始化 MediaPlayer mMediaPlayer = new MediaPlayer(); mMediaPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK); mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); try { mMediaPlayer.setDataSource(songPath); mMediaPlayer.prepare(); mMediaPlayer.start(); // 更新 UI 元素 mSongName.setText(songs.get(position)); mPlayButton.setImageResource(R.drawable.pause_button); } catch (IOException e) { e.printStackTrace(); } } }); // 设置播放按钮点击事件 mPlayButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mMediaPlayer != null) { if (mMediaPlayer.isPlaying()) { mMediaPlayer.pause(); mCurrentPosition = mMediaPlayer.getCurrentPosition(); mPlayButton.setImageResource(R.drawable.play_button); } else { mMediaPlayer.seekTo(mCurrentPosition); mMediaPlayer.start(); mPlayButton.setImageResource(R.drawable.pause_button); } } } }); } @Override protected void onDestroy() { super.onDestroy(); // 释放 MediaPlayer if (mMediaPlayer != null) { mMediaPlayer.release(); mMediaPlayer = null; } } } ``` 这个示例应用程序只是一个基本的音乐播放器,没有添加更多高级功能。但是,它为初学者提供了一个好的起点,并展示了如何使用 Media Player 播放本地音频文件。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值