Android实现网络音乐播放器

时间:2021-08-08 22:31:04

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

布局代码

<?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;
@Override
protected 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() {
@Override
public void onClick(View view) {
startMusic();
}
}); stop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
stopMusic();
}
}); pause.setOnClickListener(new View.OnClickListener() {
@Override
public 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() {
@Override
public void onPrepared(MediaPlayer mp) {
mediaPlayer.start();
start.setEnabled(false);
}
});
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public 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文件下,而不能直接放在根目录下,否则读不到。

效果如下

Android实现网络音乐播放器

更新

  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()
{
@Override
public void handleMessage(Message msg) {
switch (msg.what)
{
case UPDATE:
song_progress_normal.setProgress(mediaPlayer.getCurrentPosition());
Log.i("mediaplayer",mediaPlayer.getCurrentPosition()+"");
}
}
}; @Override
protected 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() {
@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
int postion = seekBar.getProgress();
mediaPlayer.seekTo(postion);
} @Override
public void onStartTrackingTouch(SeekBar seekBar) { } @Override
public void onStopTrackingTouch(SeekBar seekBar) { }
}); previous.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (id>1)
{
id--;
setupViewPager(mViewPager);
tabLayout.setupWithViewPager(mViewPager);
//adapter.notifyDataSetChanged();
stopMusic();
startMusic();
}
}
}); next.setOnClickListener(new View.OnClickListener() {
@Override
public 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() {
@Override
public void onClick(View view) {
startMusic();
}
}); stop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
stopMusic();
}
}); pause.setOnClickListener(new View.OnClickListener() {
@Override
public 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上字体的颜色 //设置ViewPager
mViewPager = (ViewPager) findViewById(R.id.viewpager);
setupViewPager(mViewPager); //给TabLayout增加Tab, 并关联ViewPager
tabLayout = (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();
} @Override
public Fragment getItem(int position) {
return mFragments.get(position);
} @Override
public int getCount() {
return mFragments.size();
} @Override
public 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() {
@Override
public 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() {
@Override
public void onCompletion(MediaPlayer mp) {
start.setEnabled(true);
}
}); new Thread(new Runnable() {
@Override
public void run() { timer = new Timer();
task = new TimerTask() {
@Override
public 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);
}
}

效果如下

Android实现网络音乐播放器

完成

Android实现网络音乐播放器的更多相关文章

  1. Android 实现简单音乐播放器(一)

    今天掐指一算,学习Android长达近两个月了,今天开始,对过去一段时间的学习收获以及遇到的疑难杂症做一些总结. 简单音乐播放器是我自己完成的第一个功能较为完整的APP,可以说是我的Android学习 ...

  2. Android实现简单音乐播放器&lpar;MediaPlayer&rpar;

    Android实现简单音乐播放器(MediaPlayer) 开发工具:Andorid Studio 1.3 运行环境:Android 4.4 KitKat 工程内容 实现一个简单的音乐播放器,要求功能 ...

  3. Android实现简单音乐播放器(startService和bindService后台运行程序)

    Android实现简单音乐播放器(MediaPlayer) 开发工具:Andorid Studio 1.3运行环境:Android 4.4 KitKat 工程内容 实现一个简单的音乐播放器,要求功能有 ...

  4. Android 实现简单音乐播放器(二)

    在Android 实现简单音乐播放器(一)中,我介绍了MusicPlayer的页面设计. 现在,我简单总结一些功能实现过程中的要点和有趣的细节,结合MainActivity.java代码进行说明(写出 ...

  5. 使用react native制作的一款网络音乐播放器

    使用react native制作的一款网络音乐播放器 基于第三方库 react-native-video设计"react-native-video": "^1.0.0&q ...

  6. swift3&period;0 简单直播和简单网络音乐播放器

    本项目采用swift3.0所写,适配iOS9.0+,所有界面均采用代码布局. 第一个tab写的是简单直播,传统MVC模式,第二个tab写的是简单网络音乐播放器.传说MVVM模式(至于血统是否纯正我就不 ...

  7. Android开发之音乐播放器的实现

    Android音乐播放器 使用到Android的Actiivity和Service组件 播放音频的代码应该运行在服务中,定义一个播放服务MusicService,服务里定义play.stop.paus ...

  8. Android大作业 --音乐播放器

    1.项目成员(本次作业主要对上一次的音乐播放器进行完善) 韦家城 学号:1600802026 班级:161  博客:https://www.cnblogs.com/ln9969cc/ 邓乾尧 学号:1 ...

  9. android全功能音乐播放器、基于MVP-Clean &plus; Weex &plus; RxJava2 &plus; Retrofit &plus; Dagger2 &plus; MTRVA的综合应用、图片滤镜处理等源码

    Android仿微信朋友圈查看图片下拽返回. Android图片滤镜处理,相机滤镜处理效果源码 Android自定义View源码:一个水平的进度条 基于MVP-Clean + Weex + RxJav ...

随机推荐

  1. ComboboxColumn取值——Winform中DataGridView中某一列使用下拉框

    ComboboxColumn的用法网上很多,绑定数据源都很简单,这里我遇到的是.不绑定数据源,即所有comobox的绑定都是固定的几个数据: 可以看到没有绑定任何数据源, ,在后台cs中取到下拉框的值 ...

  2. 《30天自制操作系统》17&lowbar;day&lowbar;学习笔记

    harib14a: 接着上一天的内容,我们来思考一个问题:当所有的LEVEL中都没有任务的时候怎么办?采用前面定时器链表中加入“哨兵”的思路,我们加入一个idle任务,去执行HLT.接下来我们只需要将 ...

  3. &lbrack;oracle&rsqb; listener&period;ora 、sqlnet&period;ora 、tnsnames&period;ora

    路径 $ORACLE_HOME/network/admin sqlnet.ora(客户及服务器端) 作用类似于linux或者其他unix的nsswitch.conf文件,通过这个文件来决定怎么样找一个 ...

  4. VS2010 测试 -普通单元测试

    http://www.cnblogs.com/rhythmK/archive/2012/04/20/2458832.html

  5. 黑马程序员-for和foreach

    class Program { static void Main(string[] args) { Console.WriteLine("***第一种情况****************** ...

  6. 通过java程序调用ant build&period;xml配置文件中指定的target

    一.概述 通过ant实现项目的自动化部署,jar包生成,替换,tomcat关停.启动,查看项目日志: 通过java程序调用已编辑好的ant脚本build.xml配置文件中指定的target: 文中文件 ...

  7. 多个微信小程序一个服务端架构

    由于某些特定的业务场景,当多个小程序需要一个服务端后台提供数据时,大家可能想到是HTTP路由.是的,实际上我们使用微服务的GateWay网关也是一样的,如下图微服务架构: 网关GateWay的作用在于 ...

  8. 第三百七十七节,Django&plus;Xadmin打造上线标准的在线教育平台—apps目录建立,以及数据表生成

    第三百七十七节,Django+Xadmin打造上线标准的在线教育平台—apps目录建立,以及数据表生成 apps目录建立 我们创建一个apps目录,将所有的app放到apps目录里去,这样方便管理,也 ...

  9. gdb中run出现的Missing separate debuginfos&comma; use&colon; debuginfo-install XXX

    问题: Missing separate debuginfos, use: debuginfo-install glib 解决方法: 1.将/etc/yum.repo.d/CentOS-Debugin ...

  10. Web用户的身份验证及WebApi权限验证流程的设计和实现&lpar;尾&rpar;

    5. WebApi 服务端代码示例 5.1 控制器基类ApiControllerBase [csharp] view plaincopy   /// /// Controller的基类,用于实现适合业 ...