Android实现网络音乐播放器

本文是一个简单的音乐播放器

布局代码

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context="com.zj.music.MainActivity"><ProgressBar
        android:id="@+id/song_progress_normal"style="@style/Widget.AppCompat.ProgressBar.Horizontal"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_gravity="top"android:maxHeight="5dp"android:progress="30"android:tag="tint_accent_color" /><LinearLayout
        android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@id/song_progress_normal"android:orientation="horizontal"android:gravity="center_horizontal"><ImageView
            android:id="@+id/previous"android:clickable="true"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/btn_playback_previous"/><ImageView
            android:layout_marginLeft="20dp"android:id="@+id/start"android:clickable="true"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/start"/><ImageView
            android:id="@+id/pause"android:clickable="true"android:layout_marginLeft="20dp"android:layout_marginRight="20dp"android:layout_width="wrap_content"android:layout_height="wrap_content"/><ImageView
            android:layout_marginRight="20dp"android:id="@+id/stop"android:clickable="true"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/stop"/><ImageView
            android:id="@+id/next"android:clickable="true"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/btn_playback_next"/></LinearLayout>
</RelativeLayout>

java代码实现

package com.zj.music;import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;public class MainActivity extends AppCompatActivity {ImageView pause;ImageView start;ImageView stop;ImageView previous;ImageView next;boolean isPlaying=false;String filepath="http://10.129.69.114:8080/music";MediaPlayer mediaPlayer;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);pause= (ImageView) findViewById(R.id.pause);start= (ImageView) findViewById(R.id.start);stop= (ImageView) findViewById(R.id.stop);pause.setBackgroundResource(R.drawable.btn_playback_pause);start.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {startMusic();}});stop.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {stopMusic();}});pause.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {isPlaying=!isPlaying;System.out.println("1243544444444");if (isPlaying){pause.setBackgroundResource(R.drawable.btn_playback_pause);rePlayMusic();}else{pause.setBackgroundResource(R.drawable.btn_playback_play);pauseMusic();}}});}private void startMusic() {String nowMusic=filepath+"1.mp3";try {mediaPlayer = new MediaPlayer();mediaPlayer.setDataSource(nowMusic);//设置播放的数据源。mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);//mediaPlayer.prepare();//同步的准备方法。mediaPlayer.prepareAsync();//异步的准备mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {@Overridepublic void onPrepared(MediaPlayer mp) {mediaPlayer.start();start.setEnabled(false);}});mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {@Overridepublic void onCompletion(MediaPlayer mp) {start.setEnabled(true);}});} catch (Exception e) {e.printStackTrace();Toast.makeText(this, "播放失败", Toast.LENGTH_SHORT).show();}}private void pauseMusic() {if(mediaPlayer!=null)mediaPlayer.pause();}private void rePlayMusic(){if(mediaPlayer!=null)mediaPlayer.start();}public void stopMusic() {if(mediaPlayer!=null&&mediaPlayer.isPlaying()){mediaPlayer.stop();mediaPlayer.release();mediaPlayer = null;}start.setEnabled(true);}
}

注意,音乐文件应该放在webapp/root文件下,而不能直接放在根目录下,否则读不到。

效果如下

这里写图片描述

更新

  1. 添加了下一首,进度条功能。
  2. 解决了使用Fragment作为Item的ViewPager不更新问题.

使用Fragment作为Item的ViewPager不更新问题.

在点击下一首时,发现viewPager里面的内容不更新,查找了不少方法,找到解决方案,应该使用FragmentStatePagerAdapter。

我首先使用的是fragmentPagerAdapter.该类内的每一个生成的 Fragment 都将保存在内存之中. 也就是FragmentManager中.所以就算我刷新adapter, 它还是使用的上次缓存的Fragment. 而FragmentStatePagerAdapter的instantiateItem()则会每次都重新创建Fragment. 这样一来就每次就更新了.

参考链接

使用Fragment作为Item的ViewPager不更新问题. - Crazy Bird - 博客频道 - CSDN.NET

Android– FragmentStatePagerAdapter分页 - dreamzml的专栏 - 博客频道 - CSDN.NET

新代码实现

package com.zj.music;import android.graphics.Color;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.design.widget.CollapsingToolbarLayout;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.Toast;import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;public class MainActivity extends AppCompatActivity {ImageView pause;ImageView start;ImageView stop;ImageView previous;ImageView next;boolean isPlaying=false;String filepath="http://192.168.1.130:8080/music";String nowMusic;int id=1;MediaPlayer mediaPlayer;SeekBar song_progress_normal;private Timer timer;private TimerTask task;ViewPager mViewPager;MyPagerAdapter adapter;TabLayout tabLayout;String autors[]=new String[]{"贝多芬","巴赫","舒伯特"};String songs[]=new String []{"命运交响曲","G弦上的咏叹调","圣母颂"};private static final int UPDATE = 0;Handler handler=new Handler(){@Overridepublic void handleMessage(Message msg) {switch (msg.what){case UPDATE:song_progress_normal.setProgress(mediaPlayer.getCurrentPosition());Log.i("mediaplayer",mediaPlayer.getCurrentPosition()+"");}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initTOP();pause= (ImageView) findViewById(R.id.pause);start= (ImageView) findViewById(R.id.start);stop= (ImageView) findViewById(R.id.stop);previous= (ImageView) findViewById(R.id.previous);next= (ImageView) findViewById(R.id.next);song_progress_normal= (SeekBar) findViewById(R.id.song_progress_normal);song_progress_normal.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {@Overridepublic void onProgressChanged(SeekBar seekBar, int i, boolean b) {int postion = seekBar.getProgress();mediaPlayer.seekTo(postion);}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {}});previous.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {if (id>1){id--;setupViewPager(mViewPager);tabLayout.setupWithViewPager(mViewPager);//adapter.notifyDataSetChanged();stopMusic();startMusic();}}});next.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {id++;//setupViewPager(mViewPager);//adapter.notifyDataSetChanged();setupViewPager(mViewPager);tabLayout.setupWithViewPager(mViewPager);stopMusic();startMusic();}});pause.setBackgroundResource(R.drawable.btn_playback_pause);start.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {startMusic();}});stop.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {stopMusic();}});pause.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {isPlaying=!isPlaying;System.out.println("1243544444444");if (isPlaying){pause.setBackgroundResource(R.drawable.btn_playback_pause);rePlayMusic();}else{pause.setBackgroundResource(R.drawable.btn_playback_play);pauseMusic();}}});}private void initTOP() {Toolbar mToolbar = (Toolbar) findViewById(R.id.toolbar);setSupportActionBar(mToolbar);getSupportActionBar().setDisplayHomeAsUpEnabled(true);setTitle("音乐鉴赏");//使用CollapsingToolbarLayout必须把title设置到CollapsingToolbarLayout上,设置到Toolbar上则不会显示CollapsingToolbarLayout mCollapsingToolbarLayout = (CollapsingToolbarLayout) findViewById(R.id.collapsing_toolbar);mCollapsingToolbarLayout.setTitle("音乐鉴赏");//通过CollapsingToolbarLayout修改字体颜色mCollapsingToolbarLayout.setExpandedTitleColor(Color.WHITE);//设置还没收缩时状态下字体颜色mCollapsingToolbarLayout.setCollapsedTitleTextColor(Color.BLACK);//设置收缩后Toolbar上字体的颜色//设置ViewPagermViewPager = (ViewPager) findViewById(R.id.viewpager);setupViewPager(mViewPager);//给TabLayout增加Tab, 并关联ViewPagertabLayout = (TabLayout) findViewById(R.id.sliding_tabs);tabLayout.addTab(tabLayout.newTab().setText("请您欣赏"));tabLayout.addTab(tabLayout.newTab().setText("作者简介"));tabLayout.addTab(tabLayout.newTab().setText("歌曲简介"));tabLayout.setupWithViewPager(mViewPager);}private void setupViewPager(ViewPager mViewPager) {adapter = new MyPagerAdapter(getSupportFragmentManager());adapter.addFragment(DetailFragment.newInstance("请欣赏古典音乐,欲知作者与曲名可右滑"), "请您欣赏");adapter.addFragment(DetailFragment.newInstance(autors[id-1]), "作者简介");adapter.addFragment(DetailFragment.newInstance(songs[id-1]), "歌曲简介");mViewPager.setAdapter(adapter);}List<Fragment> mFragments;static class MyPagerAdapter extends FragmentStatePagerAdapter {private  List<Fragment> mFragments=null;private  List<String> mFragmentTitles =null;public MyPagerAdapter(FragmentManager fm) {super(fm);mFragments=new ArrayList<>();mFragmentTitles = new ArrayList<>();}public void addFragment(Fragment fragment, String title) {mFragments.add(fragment);mFragmentTitles.add(title);}public void removeAllFra(){mFragments.clear();mFragmentTitles.clear();}@Overridepublic Fragment getItem(int position) {return mFragments.get(position);}@Overridepublic int getCount() {return mFragments.size();}@Overridepublic CharSequence getPageTitle(int position) {return mFragmentTitles.get(position);}}private void startMusic() {nowMusic=filepath+id+".mp3";try {mediaPlayer = new MediaPlayer();mediaPlayer.setDataSource(nowMusic);//设置播放的数据源。mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);//mediaPlayer.prepare();//同步的准备方法。mediaPlayer.prepareAsync();//异步的准备mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {@Overridepublic void onPrepared(MediaPlayer mp) {mediaPlayer.start();start.setEnabled(false);int max = mediaPlayer.getDuration();Log.i("mediaplayer", max + "最大");song_progress_normal.setMax(max);}});mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {@Overridepublic void onCompletion(MediaPlayer mp) {start.setEnabled(true);}});new Thread(new Runnable() {@Overridepublic void run() {timer = new Timer();task = new TimerTask() {@Overridepublic void run() {handler.sendEmptyMessage(UPDATE);}};timer.schedule(task, 0, 5000);}}).start();} catch (Exception e) {e.printStackTrace();Toast.makeText(this, "播放失败", Toast.LENGTH_SHORT).show();}}private void pauseMusic() {if(mediaPlayer!=null)mediaPlayer.pause();}private void rePlayMusic(){if(mediaPlayer!=null)mediaPlayer.start();}public void stopMusic() {if(mediaPlayer!=null&&mediaPlayer.isPlaying()){mediaPlayer.stop();mediaPlayer.release();mediaPlayer = null;timer.cancel();}start.setEnabled(true);}
}

效果如下

这里写图片描述

完成

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/494282.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【干货51页PPT】深度学习理论理解探索

来源&#xff1a;专知普林斯顿大学计算机科学系教授Sanjeev Arora做了深度学习理论理解探索的报告&#xff0c;包括三个部分&#xff1a;Why overparametrization and or overprovisioning?Optimization in deep learningTheory for Generative Models and Generative Adversa…

新星计划·第三季【博文流量密码公开课】

一、优质的内容 刚开始写博客的小伙伴&#xff0c;其不可漫无目的的写&#xff0c;到头来对自己的技术沉淀毫无帮助&#xff0c;升职加薪跳槽也不加分&#xff0c;更无法通过付费专栏等方式进行变现&#xff0c;到头来一无所获&#xff01; 强烈建议大家提前规划写什么方向的…

百度地图开发之定位

本文主要讲述利用百度地图API实现定位功能 第一步:下载SDK与申请KEY 参考链接&#xff1a;Android 百度地图 SDK v3.0.0 &#xff08;一&#xff09; - Hongyang - 博客频道 - CSDN.NET 注意 百度地图SDK与百度定位SDK已经分开了&#xff0c;如果在工程中同时导入这两个包…

Java与Http协议

Java与Http协议 引言 http&#xff08;超文本传输协议&#xff09;是一个基于请求与响应模式的、无状态的、应用层的协议&#xff0c;常基于TCP的连接方式。HTTP协议的主要特点是&#xff1a; 1.支持客户/服务器模式。 2.简…

《Python 黑科技》一键分析评论关键词,制作精美词云

本文重点&#xff1a; 学会抓取文章评论 学会文本分词、制作词云 目录 &#x1f351; 一、抓取全部评论 &#x1f35e; 1、找到评论接口 &#x1f34f; 2、Python 获取评论 &#x1f3c8; 二、文本分词、词云制作 &#x1f34b; 1、文本分析 &#x1f350; 2、生成词云…

PANS最新脑神经科学研究:激活一种新语言并不费力气

来源&#xff1a;中国生物技术网美国纽约大学的一项新研究发现&#xff0c;我们在不同语言之间切换时的大脑工作模式&#xff0c;这使我们对双语现象有了新的理解。纽约大学博士生Esti Blanco-Elorrieta是这项研究的第一作者&#xff0c;他解释说&#xff1a;“多语言能力者的一…

百度地图之添加覆盖物

本文主要讲解如何实现在百度地图上添加覆盖物 1.承载数据的实体 我们从服务器返回的数据部分&#xff0c;最终可能是个Json数组&#xff0c;我们需要转换为实体集合&#xff0c;即下面的Info.java 我直接在实体类中声明了一个静态列表集合&#xff0c;模拟从服务器返回的数据…

能力认证计划 -- 名企内推保 offer 直通车

CSDN 能力认证的目的&#xff1a;清晰定义工程师能力模型&#xff0c;面向开发者、技术爱好者、在校大学生等群体&#xff0c;通过机试&#xff08;真人露脸、全程录屏、限时提交&#xff09;测出应试者的真能力&#xff0c;筛选合格软件人才&#xff0c;建立应聘者与企业之间的…

fprintf 和 perror 的理解1

程序中的两种出错处理&#xff1a; 第一种: 用fprintf 2: #include <string.h> 3: #include <errno.h> 4: #include <stdlib.h> 5: 1: #include <stdio.h> 6: int main(void) 7: { 8: FILE *fp; 9: 10: if((fp fopen("1.c…

全文!《2018中国IoT报告》!

来源&#xff1a;5G9月15-18日&#xff0c;我国物联网领域规格最高、规模最大的国家级博览会——2018世界物联网博览会将在无锡举行。作为2018世界物联网博览会的重要活动之一&#xff0c;9月14日受大会组委会委托&#xff0c;中国经济信息社在无锡发布《2017-2018年中国物联网…

CSDN客户端实现

本文主要讲解实现了一个CSDN的安卓客户端&#xff0c;主要知识点如下 java爬虫获取网页数据 将java程序打包成jar包 FragmentviewpagerTabPageIndicator实现Tab效果 gestureImageView实现放大缩小图片imageLodar实现异步加载图上 XListView实现下拉刷新 java爬虫获取网页资源…

抓住金三银四的尾巴,解锁程序员面试《刷题神器》

点赞 ➕ 评论 ➕ 收藏 三连再看你最帅 刷题 不仅能掌握知识&#xff0c;快速学习进步。 更能轻松搞定面试&#xff0c;尤其是有的大厂 钟爱问算法题&#xff0c;你不刷就不会&#xff0c;就会被pass。同时&#xff0c;刷题能陶冶情操&#xff0c;避免老年痴呆 &#x1f60b; …

腾讯AI Lab开源世界首款自动化模型压缩框架PocketFlow:将深度学习装进口袋

来源&#xff1a;腾讯AI 实验室腾讯AI Lab机器学习中心今日宣布成功研发出世界上首款自动化深度学习模型压缩框架——PocketFlow&#xff0c;并即将在近期发布开源代码。这是一款面向移动端AI开发者的自动模型压缩框架&#xff0c;集成了当前主流&#xff08;包括腾讯AI Lab自研…

【拿走不谢】大数据高效查询神器--bitmap

背景 在hive中使用Roaring64Bitmap实现精确去重功能 主要目的&#xff1a; 提升 hive 中精确去重性能&#xff0c;代替hive 中的 count(distinct uuid)&#xff1b;节省 hive 存储 &#xff0c;使用 bitmap 对数据压缩 &#xff0c;减少了存储成本&#xff1b;提供在 hive 中…

Android之智能问答机器人

本文主要利用图灵机器人的接口&#xff0c;所做的一个简单的智能问答机器人 实现 由于发送与接收消息都是不同的listView&#xff0c;所以要用有两个listVeiw的布局文件 接收消息布局文件 <?xml version"1.0" encoding"utf-8"?> <LinearLa…

5张图告诉你:同样是职场人,差距怎么这么大?

点赞 ➕ 评论 ➕ 收藏 养成三连好习惯 在职场中&#xff0c;我们常常会听到各种各样的抱怨&#xff1a; &#x1f469;‍⚖️‍ 小A: 凭什么别人每次述职绩效都是优秀呀&#xff1f; 感觉TA也没干啥呀! &#x1f575; 小B: 凭啥这个事情&#xff0c;领导指派TA去对接呀&#…

史上最强阵容,BAT大佬携手AI顶级大咖齐聚上海话AI

来源&#xff1a;网易智能9月17日上午&#xff0c;齐聚各路大佬的2018世界人工智能大会在上海西岸艺术中心开幕。不得不说&#xff0c;这次大会的嘉宾阵容&#xff0c;为中国科技界史上最强&#xff0c;没有之一。今天主论坛亮相会议并发表演讲的大咖&#xff0c;除了聚集了BAT…

没错,列式存储非常牛。但是,Ta还可以更高效

很多数据仓库产品都采用了列式存储。如果数据表的总列数很多而计算涉及的列很少&#xff0c;采用列存就只读取需要的列即可&#xff0c;能够减少硬盘访问量&#xff0c;提高性能。 特别是数据量非常大时&#xff0c;硬盘扫描和读取的时间占比很大&#xff0c;这时候列存的优势…

Android实现电子邮箱客户端

本文主要讲述了安卓平台上利用QQ邮箱SMTP协议&#xff0c;POP3协议发送与接收消息的实现 发送邮件核心代码 import java.security.Security; import java.util.Date; import java.util.Properties; import javax.mail.Authenticator; import javax.mail.Message; …

谷歌AI涉足艺术、太空、外科手术,再强调AI七原则

来源&#xff1a;网易智能9月18日上午&#xff0c;Google在上海的2018世界AI 大会上举办了一场名为“AI触手可及”的主题论坛。在论坛上&#xff0c;Google全球副总裁、工程研究员Jay Yagnik 携Google 不同领域的研究者发表了演讲&#xff0c;重点阐述了Google AI在自家产品上的…