【开发一个简单的音乐播放器+服务端】【二】

简介: 【开发一个简单的音乐播放器+服务端】【二】

下面利用Mediaplayer获取服务器音乐文件进行音乐的播放

服务端参考上一篇博客

新建一个android项目,创建一个工具包Utils

Constants类 保存一些基本配置

HttpUtils类 进行网络访问

MediaplayerUtil类 播放器工具

Constants.class:

public class Constants {
   
   

    //服务器ip
    public static final String SERVER_IP = "http://192.168.0.110:8080/MyMusic/";

    //获得所有音乐接口
    public static final String GETALL_MUSIC = "getmusic";

    //下载音乐接口
    public static final String DOWNLOAD_MUSIC = "upload/";

}

HttpUtils.class:

public class HttpUtils {
   
   
    /** 用到OkHttp3框架,需要先导入两个jar包 */
    public static String HttpPost(String url)
    {
   
   
        FormBody.Builder formbody = new FormBody.Builder();
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder().url(Constants.SERVER_IP+url)
                .post(formbody.build()).build();

        try {
   
   
            Response response = client.newCall(request).execute();
            if(response.isSuccessful())
                return response.body().string();
        } catch (Exception e) {
   
   
            e.printStackTrace();
        }

        return null;
    }
}

MediaplayerUtil.class:

public class MediaplayerUtil{
   
   
    public static MediaPlayer mediaPlayer = new MediaPlayer();
    public void initMediaplayer(Context context,String musicname)
    {
   
   
        /** 初始化播放器时做判断,若播放器不为空,停止播放,释放资源 */
        if(mediaPlayer!=null)
        {
   
   
            mediaPlayer.stop();
             mediaPlayer.release();
            mediaPlayer=new MediaPlayer();
        }
        try {
   
   
            /** 传入音乐名称与Constants类中的常量拼接为资源地址 */
            mediaPlayer.setDataSource(context,Uri.parse(Constants.SERVER_IP+Constants.DOWNLOAD_MUSIC+musicname));
            /** 使用异步准备资源 */
            mediaPlayer.prepareAsync();
            /** 准备完成,播放音乐 */
            mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
   
   
                @Override
                public void onPrepared(MediaPlayer mediaPlayer) {
   
   
                    mediaPlayer.start();
                }
            });
        } catch (Exception e) {
   
   
            e.printStackTrace();
        }
    }


    /** 设置音乐播放状态,暂停,播放 */
    public void setMediaPlayerState(ImageView imageView)
    {
   
   
        if(mediaPlayer.isPlaying())
        {
   
   
            mediaPlayer.pause();
            imageView.setImageResource(R.drawable.play);
            //传入ImageView 暂停时改变ImageView图标为播放图标
        }
        else{
   
   
            mediaPlayer.start();
            imageView.setImageResource(R.drawable.pause);
            //重新播放时,改变图标为暂停图标
        }
    }
}

下面再写一个实体类Music.class保存歌曲信息,以及一个业务类MusicService.class处理业务

Music.class:

public class Music {
   
   
    String mid;
    String musicname;
    String author;
    public String getMid() {
   
   
        return mid;
    }

    public void setMid(String mid) {
   
   
        this.mid = mid;
    }

    public String getMusicname() {
   
   
        return musicname;
    }

    public void setMusicname(String musicname) {
   
   
        this.musicname = musicname;
    }

    public String getAuthor() {
   
   
        return author;
    }

    public void setAuthor(String author) {
   
   
        this.author = author;
    }
}

MusicService.class

public class MusicService {
   
   
    /** 获得所有音乐 */
    public static List<Music> GetAllMusic()
    {
   
   
        String result = HttpUtils.HttpPost(Constants.GETALL_MUSIC);
        //String result = "[{'mid':1,'musicname':'北京欢迎你','author':'群星'}]";
        /** 使用Gson框架解析json格式数据 */
        Gson gson = new Gson();
        /** 将数据解析为一个List集合 */
        List<Music> musics = gson.fromJson(result,new TypeToken<List<Music>>(){
   
   }.getType());
        return musics;
    }
}

布局文件:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.mymusic.MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="45dp"
        android:id="@+id/title"
        android:orientation="horizontal"
        android:background="@color/red">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="我的音乐"
            android:textSize="20sp"
            android:layout_marginLeft="20dp"
            android:textColor="@color/white"
            android:layout_gravity="center" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:layout_below="@+id/title">
        <ListView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/music_lv"
            android:layout_weight="1"></ListView>

        <View
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="@color/gray"
            android:layout_below="@+id/music_lv"
            android:id="@+id/line"></View>

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:layout_below="@+id/line">
            <ImageView
                android:layout_width="40dp"
                android:layout_height="40dp"
                android:background="@drawable/play"
                android:id="@+id/play_music"
                android:layout_centerVertical="true"
                android:layout_centerHorizontal="true"/>
            <ImageView
                android:layout_width="40dp"
                android:layout_height="40dp"
                android:layout_alignRight="@id/play_music"
                android:layout_marginRight="50dp"
                android:background="@drawable/last"
                android:id="@+id/last_music"
                android:layout_centerVertical="true"/>
            <ImageView
                android:layout_width="40dp"
                android:layout_height="40dp"
                android:layout_alignLeft="@id/play_music"
                android:layout_marginLeft="50dp"
                android:background="@drawable/next"
                android:id="@+id/next_music"
                android:layout_centerVertical="true"/>
        </RelativeLayout>
    </LinearLayout>

</RelativeLayout>

mainactivity_musiclv_item.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10dp">
        <TextView
            android:layout_width="260dp"
            android:layout_height="wrap_content"
            android:id="@+id/music_name"
            android:text="北京东路的日子"
            android:textSize="22sp"
            android:textColor="@color/black"
            android:layout_marginLeft="20dp"
            android:ellipsize="end"
            android:lines="1"/>
        <TextView
            android:layout_width="260dp"
            android:layout_height="wrap_content"
            android:id="@+id/music_author"
            android:text="群星"
            android:textColor="@color/gray"
            android:layout_marginLeft="20dp"
            android:layout_marginTop="5dp"
            android:layout_below="@+id/music_name"
            android:textSize="16sp"
            android:ellipsize="end"
            android:lines="1"/>
    </RelativeLayout>
</LinearLayout>

最后一个MainActivity.class

MainActivity.class:

public class MainActivity extends Activity implements View.OnClickListener{
   
   
    MediaplayerUtil mp = new MediaplayerUtil();
    LayoutInflater layoutInflater;
    ListView music_lv;
    ImageView play,last,next;
    /** 当前播放位置 */
    int CURRENT = 0;
    /** 所有歌曲 */
    public static List<Music> musics = new ArrayList<>();
    /** Handler进行异步处理 */
    Handler handler = new Handler(new Handler.Callback() {
   
   
        @Override
        public boolean handleMessage(Message message) {
   
   
            switch(message.what)
            {
   
   
                case 0x100:
                    SetAdapter();
                    SetListener();
                    break;
            }
            return false;
        }
    });
    @Override
    protected void onCreate(Bundle savedInstanceState) {
   
   
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        GetAllMusic();
    }

    /** 初始化控件 */
    public void initView()
    {
   
   
        music_lv = findViewById(R.id.music_lv);
        play = findViewById(R.id.play_music);
        next = findViewById(R.id.next_music);
        last = findViewById(R.id.last_music);
        play.setOnClickListener(this);
        next.setOnClickListener(this);
        last.setOnClickListener(this);
    }

    /** 获取所有用户信息 */
    public void GetAllMusic()
    {
   
   
        new Thread(new Runnable() {
   
   
            @Override
            public void run() {
   
   
                musics = MusicService.GetAllMusic();
                handler.sendEmptyMessage(0x100);
            }
        }).start();
    }

    /** 设置监听 */
    public void SetListener()
    {
   
   
        music_lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
   
   
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
   
   
                TextView item_music = view.findViewById(R.id.music_name);
                Toast.makeText(getApplication(), item_music.getText(), Toast.LENGTH_SHORT).show();
                mp.initMediaplayer(getApplication(),item_music.getText().toString());
                play.setImageResource(R.drawable.pause);
                CURRENT=i;
            }
        });
    }

    /** 播放音乐 */
    public void PlayMusic()
    {
   
   
        mp.initMediaplayer(getApplication(),musics.get(CURRENT).getMusicname());
        play.setImageResource(R.drawable.pause);
        Toast.makeText(this, musics.get(CURRENT).getMusicname(), Toast.LENGTH_SHORT).show();
    }

    /** 设置适配器 */
    public void SetAdapter()
    {
   
   
        class MyAdapter extends BaseAdapter{
   
   

            @Override
            public int getCount() {
   
   
                return musics.size();
            }

            @Override
            public Object getItem(int i) {
   
   
                return musics.get(i);
            }

            @Override
            public long getItemId(int i) {
   
   
                return i;
            }

            @Override
            public View getView(int i, View view, ViewGroup viewGroup) {
   
   
                layoutInflater = LayoutInflater.from(getApplication());
                Holder holder = null;
                /** view为空则从模板中获得View */
                if(view==null)
                {
   
   
                    holder = new Holder();
                    view = layoutInflater.inflate(R.layout.mainactivity_musiclv_item,null);
                    holder.musicname = view.findViewById(R.id.music_name);
                    holder.musicauthor = view.findViewById(R.id.music_author);
                    view.setTag(holder);
                }
                else
                {
   
   
                    holder = (Holder)view.getTag();
                }
                holder.musicname.setText(musics.get(i).getMusicname());
                holder.musicauthor.setText(musics.get(i).getAuthor());
                return view;
            }
        }
        MyAdapter adapter = new MyAdapter();
        music_lv.setAdapter(adapter);
    }

    /** 实现监听器接口的onClick方法 */
    @Override
    public void onClick(View view) {
   
   
        switch (view.getId())
        {
   
   
            case R.id.play_music:
                mp.setMediaPlayerState(play);
                break;
            case R.id.last_music:
                if(CURRENT==0)
                {
   
   
                    CURRENT= musics.size()-1;
                    PlayMusic();
                }
                else
                {
   
   
                    CURRENT--;
                    PlayMusic();
                }
                break;
            case R.id.next_music:
                if(CURRENT==musics.size()-1)
                {
   
   
                    CURRENT=0;
                    PlayMusic();
                }
                else
                {
   
   
                    CURRENT++;
                    PlayMusic();
                }
                break;
        }
    }
}

/** Holder类,避免重复获取view */
class Holder{
   
   
    TextView musicname;
    TextView musicauthor;
}

在进行网络访问操作时,记得还要配置网络权限:

<uses-permission android:name="android.permission.INTERNET" />

到此,一个音乐播放器就完成啦!

除了一些基本功能外,还可以为播放器引入服务,让它在后台播放,或者使用io加入下载音乐,音乐缓存功能

下面贴一下运行结果图,layout比较简单(并不好看)。。。

image.png

相关文章
|
3月前
使用uniapp实现websocket聊天功能
使用uniapp实现websocket聊天功能
|
6月前
|
C++
C++实战-仿QQ项目终端版通信
C++实战-仿QQ项目终端版通信
37 0
|
10月前
UE DTMqtt 虚幻引擎 Mqtt 客户端插件说明
UE DTMqtt 虚幻引擎 Mqtt 客户端插件说明
354 0
|
Web App开发 安全 网络协议
Qt开发技术:QWebSocket客户端、服务端介绍与开发
Qt开发技术:QWebSocket客户端、服务端介绍与开发
Qt开发技术:QWebSocket客户端、服务端介绍与开发
|
5月前
|
XML JSON Java
Android App开发即时通信中通过SocketIO在客户端与服务端间传输文本和图片的讲解及实战(超详细 附源码)
Android App开发即时通信中通过SocketIO在客户端与服务端间传输文本和图片的讲解及实战(超详细 附源码)
86 0
|
3月前
|
存储 移动开发 JavaScript
uniApp页面通讯
uniApp页面通讯
16 0
|
10月前
|
JSON Java 数据库连接
【开发一个简单的音乐播放器+服务端】【一】
【开发一个简单的音乐播放器+服务端】【一】
102 0
|
Web App开发 API
|
Web App开发 监控 前端开发
如果监控摄像头不支持Web Socket,猿大师播放器还能在网页中播放RTSP流吗?
猿大师播放器在前端用web socket是浏览器和中间件及播放程序之间的通讯协议,和实际播放无关,只要浏览器支持web socket就可以播放,现在大部分浏览器都支持web socket,所以就算监控设备不支持Websocket,用猿大师播放器播放RTSP也是是没问题的。
182 0
如果监控摄像头不支持Web Socket,猿大师播放器还能在网页中播放RTSP流吗?
|
Web App开发 JavaScript 应用服务中间件
Case 5 一键安装JS SDK 网页版WebRTC 网页 SIP客户端 语音通话,可以做web坐席
一键安装JS SDK 网页版WebRTC 网页 SIP客户端 语音通话,可以做web坐席
584 0
Case 5 一键安装JS SDK 网页版WebRTC 网页 SIP客户端 语音通话,可以做web坐席