轻松学Android开发之Android程序开发——音乐播放器
Android应用开发--MP3简单音乐播放器

Android应用开发--MP3简单音乐播放器点击列表会进入播放的Activity,在这个Activity会接收到从前面的Activity传来的数据,在通过这些数据来启动服务来播放音乐,整个过程很简单,需要注意的是我们要接收的数据是哪些内容,还有我们向Service要传什么样的数据,这是根据自己的开发思路和需求来决定的,等一下你们会看到小鬼到底往Service传了些什么东西,然而这些数据到底起什么作用,需要慢慢去体会,因为这是需要一点一点去调试的。
好了,下面贴一下整个Activity的实现代码,主要是播放的各种状态的实现,因为这个音乐播放器并没有完全开发完,所以朋友们需要弄清楚这一点。
如果对代码的实现有不清楚的,可以给小鬼留言,小鬼有空一定给大家解答。
效果如下:代码如下:package com.anjovo.as.chapter10.exam01;import java.io.IOException;import android.media.AudioManager;import android.media.MediaPlayer;import .Uri;import android.os.Bundle;import android.app.Activity;import android.content.Intent;import android.view.ContextMenu;import android.view.ContextMenu.ContextMenuInfo; import android.view.Menu;import android.view.MenuItem;import android.view.SubMenu;import android.view.View;import android.widget.Button;import android.widget.ImageView;import android.widget.TextView;import android.widget.Toast;public class MusicPlayerActivity extends Activity {protected static final int REQUEST_CODE = 1;private Button btnPlay,btnPause,baStop,back;private ImageView image;private TextView text;private MediaPlayer player;int position = 0;//声明一个变量判断是否为播放,默认为falseprivate boolean isPaused = false,Media=false;@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);setContentView(yout.activity_music_player);btnPlay = (Button) findViewById(R.id.bt_play);btnPause = (Button) findViewById(R.id.bt_pause);baStop = (Button) findViewById(R.id.bt_stop);back = (Button) findViewById(R.id.bt_back);image = (ImageView)findViewById(R.drawable.ic_launcher);text = (TextView) findViewById(R.id.text);image = (ImageView) findViewById(R.drawable.fengcun);registerForContextMenu(baStop);//注册,让这个bastop将会启用上下文菜单text.setText("歌词下载错误!");final Intent serintent = newIntent(this,newActivity.class);btnPause.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubstartActivityForResult(serintent,REQUEST_CODE);}});back.setOnClickListener(new Button.OnClickListener() {@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubfinish();if(Media==true){player.stop();player.release();}}});}public void BlooeanMedia(){if(Media==true){player.release();}}public void Player(MediaPlayer player){ try {if(player!=null){player.stop();}player.prepare();player.start();isPaused = true;Media=true;Toast.makeText(this, "音乐播放中...", Toast.LENGTH_LONG).show();} catch (IllegalStateException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}@Overridepublic boolean onContextItemSelected(MenuItem item) { // TODO Auto-generated method stubswitch(item.getItemId()){case 1:/** 用户点击了Id为“1”的子项,在这里编写处理代码*/BlooeanMedia();player = MediaPlayer.create(this,R.raw.wintersecret);MediaPlayer(player);Player(player);text.setText("周传雄-冬天的秘密...");break;case 2:/** 用户点击了Id为“2”的子项,在这里编写处理代码*/BlooeanMedia();player = MediaPlayer.create(this, R.raw.after);MediaPlayer(player);Player(player);text.setText("庄心研-以后的以后...");break;case 3:/** 用户点击了Id为“2”的子项,在这里编写处理代码*/BlooeanMedia();player = MediaPlayer.create(this, R.raw.baby);MediaPlayer(player);Player(player);text.setText("张悬-宝贝...");break;case 4:/** 用户点击了Id为“2”的子项,在这里编写处理代码*/BlooeanMedia();player = MediaPlayer.create(this, R.raw.lovegirl);MediaPlayer(player);Player(player);text.setText("张赫宣-你是我心爱的姑娘...");break;case 5:/** 用户点击了Id为“2”的子项,在这里编写处理代码*/Toast.makeText(this, "Item 5被选择",Toast.LENGTH_LONG).show();break;case 6:/** 用户点击了Id为“2”的子项,在这里编写处理代码*/Toast.makeText(this, "Item 6被选择",Toast.LENGTH_LONG).show();break;case 7:/** 用户点击了Id为“2”的子项,在这里编写处理代码*/Toast.makeText(this, "Item 7被选择",Toast.LENGTH_LONG).show();break;case 8:/** 用户点击了Id为“2”的子项,在这里编写处理代码*/Toast.makeText(this, "Item 8被选择",Toast.LENGTH_LONG).show();break;case 9:/** 用户点击了Id为“2”的子项,在这里编写处理代码*/Toast.makeText(this, "Item 9被选择",Toast.LENGTH_LONG).show();break;case 10:/** 用户点击了Id为“2”的子项,在这里编写处理代码*/Toast.makeText(this, "Item 10被选择",Toast.LENGTH_LONG).show();break;}return super.onOptionsItemSelected(item);}private void MediaPlayer(final MediaPlayer player) { // TODO Auto-generated method stub//增加播放音乐按钮的事件btnPlay.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubtry {if(player!=null){if(isPaused==false){player.start();isPaused=true;Toast.makeText(getApplicationContext(), "音乐播放中...", Toast.LENGTH_LONG).show();}else if(isPaused==true){player.pause();//暂停isPaused=false;Toast.makeText(getApplicationContext(), "音乐暂停中...", Toast.LENGTH_LONG).show();}}player.prepare();//同步地准备播放或回放player.start();//开始播放} catch (IllegalStateException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}});//播放完毕player.setOnCompletionListener(newMediaPlayer.OnCompletionListener() {@Overridepublic void onCompletion(MediaPlayer arg0) {// TODO Auto-generated method stubtry{//释放dtmimi.mp3这个资源,让它可被其它播放器使用player.release();//释放MediaPlayerToast.makeText(getApplicationContext(), "音乐播放结束!", Toast.LENGTH_LONG).show();text.setText("");}catch(Exception e){Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_LONG).show();e.printStackTrace();}}});//播放出错的处理player.setOnErrorListener(newMediaPlayer.OnErrorListener() {@Overridepublic boolean onError(MediaPlayer arg0, int arg1, int arg2) {// TODO Auto-generated method stubtry{//发生错误时也释放资源player.release();Toast.makeText(getApplicationContext(), "播放发生异常!", Toast.LENGTH_LONG).show();}catch(Exception e){Toast.makeText(getApplicationContext(),e.toString(), Toast.LENGTH_LONG).show();e.printStackTrace();}return false;}});}@Overridepublic void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {// TODO Auto-generated method stubsuper.onCreateContextMenu(menu, v, menuInfo);menu.add(Menu.NONE, 1, Menu.NONE, "周传雄-冬天的秘密");menu.add(Menu.NONE, 2, Menu.NONE, "庄心研-以后的以后");menu.add(Menu.NONE, 3, Menu.NONE, "张悬-宝贝");menu.add(Menu.NONE, 4, Menu.NONE, "张赫宣-你是我心爱的姑娘");menu.add(Menu.NONE, 5, Menu.NONE, R.string.menu_item5);//将Item6设置为子菜单SubMenu subMenu = menu.addSubMenu(Menu.NONE, 6, Menu.NONE, R.string.menu_item6);subMenu.setHeaderIcon(R.drawable.ic_launcher);subMenu.setIcon(R.drawable.ic_launcher);subMenu.setHeaderTitle("子菜单");subMenu.add(Menu.NONE, 7, Menu.NONE,R.string.menu_item7);subMenu.add(Menu.NONE, 8, Menu.NONE,R.string.menu_item8);subMenu.add(Menu.NONE, 9, Menu.NONE,R.string.menu_item9);subMenu.add(Menu.NONE, 10, Menu.NONE,R.string.menu_item10);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {// TODO Auto-generated method stubsuper.onActivityResult(requestCode, resultCode, data);if(requestCode==REQUEST_CODE&&resultCode==RESULT_OK){ if(data!=null){//通过data参数处理返回信息String info = data.getData().toString();Uri myUri = Uri.parse(info);//将传回来的路径放在myUri中BlooeanMedia();player = new MediaPlayer();MediaPlayer(player);player.setAudioStreamType(AudioManager.STREAM_MUSIC);try {player.setDataSource(getApplicationContext(),myUri);//按地址播放player.prepare();player.start();isPaused = true;Media=true;Toast.makeText(this, "音乐播放中...", Toast.LENGTH_LONG).show();} catch (IllegalArgumentException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (SecurityException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalStateException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}else{Toast.makeText(this, "无返回信息",Toast.LENGTH_SHORT).show();}}}}package com.anjovo.as.chapter10.exam01;import java.io.File;import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.content.Intent;import .Uri;import android.os.Bundle;import android.view.View;import android.widget.AdapterView;import android.widget.ArrayAdapter;import android.widget.Button;import android.widget.EditText;import android.widget.ListView;import android.widget.Toast;/*** 使用一个包含String的List作为ListView的数据源,由于要在匿名内部类的方法中* 使用它,故将其定义为类的属性*/public class newActivity extends Activity{private List<String> dataList;private List<String> datauri;private String m_path;@Overrideprotected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(yout.array_adapter_acyivity);ListView list = (ListView) findViewById(R.id.list);dataList = new ArrayList<String>();datauri = new ArrayList<String>();m_path = new String("mnt/sdcard/");search(m_path, ".mp3", dataList,datauri);//定义一个ArrayAdapter,将数据源——dataList中的内容添加到这个ArrayAdapter//中,第二个参数指每一项将使用的界面布局final ArrayAdapter<String> adapter = newArrayAdapter<String>(this, yout.array_adapter_item, dataList);list.setAdapter(adapter);//将ArrayAdapter填充到ListView//处理用户单击选择的事件list.setOnItemClickListener(newAdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position,long id) {// TODO Auto-generated method stubIntent intent = new Intent();String url = datauri.get(position);intent.setData(Uri.parse(url));setResult(RESULT_OK, intent);finish();}});//处理用户长按事件list.setOnItemLongClickListener(newAdapterView.OnItemLongClickListener() {@Overridepublic boolean onItemLongClick(AdapterView<?> parent, View view,int position, long id) {// TODO Auto-generated method stubToast.makeText(getApplicationContext(),dataList.get(posit ion)+"删除成功!", Toast.LENGTH_LONG).show();//用户长按一项时,删除这一项内容dataList.remove(position);//通知Adapter的观察者数据源改变了,界面内容也得发生改变adapter.notifyDataSetChanged();return true; //返回true表示长按}});}}布局文件如下:<RelativeLayoutxmlns:android="/apk/res/and roid"xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margi n"android:paddingLeft="@dimen/activity_horizontal_margi n"android:paddingRight="@dimen/activity_horizontal_marg in"android:paddingTop="@dimen/activity_vertical_margin"tools:context=".MusicPlayerActivity"><Buttonandroid:id="@+id/bt_pause"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:layout_alignParentLeft="true"android:layout_marginBottom="14dp"android:text="列表"/><Buttonandroid:id="@+id/bt_play"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignBaseline="@+id/bt_pause"android:layout_alignBottom="@+id/bt_pause"android:layout_centerHorizontal="true"android:text="播放"/><Buttonandroid:id="@+id/bt_back"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignLeft="@+id/bt_stop"android:layout_alignParentTop="true"android:text="返回"/><Buttonandroid:id="@+id/bt_stop"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignBaseline="@+id/bt_play"android:layout_alignBottom="@+id/bt_play"android:layout_toRightOf="@+id/image"android:text="选择"/><ImageViewandroid:id="@+id/image"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_above="@+id/text"android:layout_marginBottom="16dp"android:layout_toRightOf="@+id/bt_pause"android:src="@drawable/fengcun"/><TextViewandroid:id="@+id/text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_above="@+id/bt_play"android:layout_centerHorizontal="true"android:layout_marginBottom="48dp"android:text="."/> </RelativeLayout>。
Android开发音乐播放器毕业论文

A n d r o i d开发音乐播放器毕业论文SANY GROUP system office room 【SANYUA16H-郑州大学毕业设计(论文)题目:基于Android平台的音乐播放器指导教师:李妍职称:讲师学生姓名:陈小雨学号:专业:计算机科学与技术(软件开发)院(系):软件学院完成时间: 2014年05月05日2014年05月05日目录摘要 (1)ABSTRACT (2)前言 (3)1 Android平台及开发工具介绍 (4)1.1Android平台简介 (4)1.1.1A ndroid平台架构 (4)1.1.2Android的四大组件 (6)1.2 Android的开发环境 (8)1.2.1 Eclipse (8)1.2.2A ndroid SDK (8)1.3本章小结 (9)2 需求分析 (10)2.1 播放器的设计目标 (10)2.2 软件的可行性研究 (10)2.2.1经济上的可行性 (10)2.2.2技术上的可行性 (11)2.2.3操作上的可行性 (11)2.3 播放器的功能需求分析 (11)2.3.1播放器的基本功能 (11)2.3.2歌曲列表的功能 (14)2.3.3菜单的设置功能 (16)2.4 本章小结 (18)3 总体设计.................................................3.1设计原则 (19)3.1.1总体设计路线 (19)3.1.2 系统功能结构图 (20)3.1.3系统流程图 (21)3.2 主要功能设计 (21)3.2.1歌曲列表模块 (21)3.2.2 音乐播放模块 (22)3.2.3 专辑列表模块 (23)3.2.4 菜单设置模块 (24)3.3系统的安全设计............................................................ .. (24)3.4 本章小结 (25)4 详细设计与实现 (26)4.1 欢迎界面............................................4.2 歌曲播放界面 (27)4.2.1 播放音轨SeekBar (28)4.2.2 播放调节功能 (28)4.3 歌词显示界面 (29)4.4 列表显示界面 (30)4.5 菜单设置 (31)4.6 本章总结 (33)5 音乐播放器的测试 (34)5.1 测试模型 (35)5.1.1 V模型 (35)5.1.2 W模型 (35)5.2 测试模型的选择 (37)5.3 测试方法 (37)5.3.1 白盒测试 (37)5.3.2 黑盒测试 (38)5.3.3 测试方法的选择 (38)5.4 功能的测试与实现 (38)4.2.1 播放器整体功能的实现 (39)4.2.2 播放器主要模块功能测试 (40)5.5 测试结论 (40)5.6 测试过程与总结 (40)5.7 本章小结 (41)结论 (42)致谢 (43)参考文献 (44)摘要Android平台是Google公司最新推出的一个手机平台,该平台对移动设备的程序集中包括一个操作系统,一个中间件和一些关键性应用。
基于Android系统的音乐播放器设计与实现

01 一、需求分析
目录
02 二、设计思路
03 三、实现步骤
04 四、注意事项
05 参考内容
内容摘要
随着移动设备的普及和Android操作系统的不断发展,基于Android系统的应 用程序开发也越来越受到。其中,音乐播放器作为手机用户的常用应用之一,其 设计和实现具有重要意义。本次演示将介绍一种基于Android系统的音乐播放器 设计和实现的方法。
三、具体实现
三、具体实现
1、登录功能:用户可以通过或第三方社交账号登录,并设置密码。登录后, 用户可以浏览自己的音乐库,以及搜索歌曲、歌手、专辑等;
三、具体实现
2、搜索功能:用户可以通过关键字搜索歌曲、歌手、专辑等,也可以通过分 类筛选;
3、播放功能:用户可以播放、暂停、调节音量、添加歌曲到播放列表、从播 放列表中删除歌曲等操作;
4、其他功能实现
4、其他功能实现
除了音乐播放和音频处理,音乐播放器还需要实现其他功能,如歌词显示、 播放控制、定时关机等。这些功能可以通过Android SDK提供的API和Java编程 语言来实现。例如,可以使用Java的线程和定时器技术来实现定时关机功能。
四、总结
四、总结
本次演示介绍了基于Android的音乐播放器设计与实现的基本内容和实现方法。 主要包括了音乐播放器的功能概述、设计思路和实现方法等方面的内容。通过这 些内容的介绍,希望能对大家有所帮助,让我们一起努力,为美好的音乐事业贡 献自己的力量!
三、实现步骤
2、界面设计:使用XML布局文件设计界面,包括主界面、播放列表界面、歌 曲详情界面等。
三、实现步骤
3、数据库设计:创建SQLite数据库,定义表结构并实现增删改查操作。 4、音频解码和播放:使用MediaPlayer类进行音频解码和播放,实现播放、 暂停、停止等功能。
Androidstudio简单的音乐播放器实现

Androidstudio简单的音乐播放器实现JAVA文件:MainActivity.java,menuActivity.java,Music.java,PreActivity.javaXML文件:activity_main.xml,activity_pre.xml,activity_menu.xml在PreActivity.java文件中,程序主要执行开启线程,实现开启软件进入欢迎界面,并在1秒后自动跳转到音乐播放器主界面,界面在activity_pre.xml文件中实现。
PreActivity.javapublic class PreActivity extends Activity {Handler handler=new Handler(){public void handleMessage(Message msg){if(msg.what==250){Intent intent=new Intent(PreActivity.this,MainActivity.class);startActivity(intent);finish();}};};@Overrideprotected void onCreate(Bundle savedInstanceState){//TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(yout.activity_pre); //加载布局WaitThread thread=new WaitThread(); //开启线程thread.start();}public class WaitThread extends Thread{ //创建线程@Overridepublic void run(){//TODO Auto-generated method stubtry{Thread.sleep(1000);}catch (InterruptedException e){//TODO Auto-generated catch blocke.printStackTrace();}Message message=new Message();message.what=250;message.arg1=1;handler.sendMessage(message);}}}activity_pre.xml<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=""android:layout_width="400dp"android:layout_height="800dp"android:background="#ffffff"android:orientation="vertical"android:weightSum="1"><ImageViewandroid:src="@drawable/welcome"android:layout_width="408dp"android:layout_height="451dp"android:layout_weight="0.77" /></LinearLayout>主要功能实现MainActivity.java,音乐播放器主界面activity_main.xml。
Android Studio Service编程 音乐播放器

广州xx 学院Android 程序设计 实验报告专业班级 计算机181 实验日期__ 2021.5.18_ _ 姓 名 xx 学 号201xx 实验名称 Service 编程 指导老师__ xx _(报告内容包括:实验目的、实验设备及器材、实验步骤、实验数据、图表及曲线处理、实验小结等)。
1. 实验目的(1) 了解如何创建服务;(2) 掌握服务的两种启动方式;(3) 掌握如何使用本地服务通信。
2. 实验要求(1) 使用服务通信,实现音乐播放器功能,实现音乐的播放、暂停、继续播放、退出。
3. 实验步骤(1)导入音乐文件和界面图片之后,开始创建布局,代码如下,效果图如图1-1所示。
<ImageViewandroid :id ="@+id/iv_music"android :layout_width ="240dp"android :layout_height ="240dp"android :layout_gravity ="center_horizontal" android :layout_margin ="15dp"android :src ="@drawable/music"/><SeekBarandroid :id ="@+id/sb"android :layout_width ="match_parent"android :layout_height ="wrap_content" /><RelativeLayoutandroid :layout_width ="match_parent"android :layout_height ="wrap_content"android:paddingLeft="8dp"android:paddingRight="8dp"><TextViewandroid:id="@+id/tv_progress"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="00:00" /><TextViewandroid:id="@+id/tv_total"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:text="00:00" /></RelativeLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><Buttonandroid:id="@+id/btn_play"android:layout_width="0dp"android:layout_height="40dp"android:layout_margin="8dp"android:layout_weight="1"android:background="@drawable/btn_bg_selector"android:text="播放音乐" /><Buttonandroid:id="@+id/btn_pause"android:layout_width="0dp"android:layout_height="40dp"android:layout_margin="8dp"android:layout_weight="1"android:background="@drawable/btn_bg_selector"android:text="暂停播放" /><Buttonandroid:id="@+id/btn_continue_play"android:layout_width="0dp"android:layout_height="40dp"android:layout_margin="8dp"android:layout_weight="1"android:background="@drawable/btn_bg_selector"android:text="继续播放" /><Buttonandroid:id="@+id/btn_exit"android:layout_width="0dp"android:layout_height="40dp"android:layout_margin="8dp"android:layout_weight="1"android:background="@drawable/btn_bg_selector"android:text="退出" /></LinearLayout>图1-1 界面布局效果图(2)创建背景选择器btn_bg_selector.xml关键代码如下:<selector xmlns:android="/apk/res/android"><item android:state_pressed="true" ><shape android:shape="rectangle"><corners android:radius="3dp"/><solid android:color="#d4d4d4"/></shape></item><item android:state_pressed="false" ><shape android:shape="rectangle"><corners android:radius="3dp"/><solid android:color="#ffffff" /></shape></item></selector>(3)创建MusicService服务关键代码如下所示:public class MusicService extends Service {private MediaPlayer player;private Timer timer;public MusicService() {}@Overridepublic IBinder onBind(Intent intent) {return new MusicControl();}@Overridepublic void onCreate() {super.onCreate();player = new MediaPlayer();//创建音乐播放器对象}public void addTimer() { //添加计时器用于设置音乐播放器中的播放进度条if (timer == null) {timer = new Timer(); //创建计时器对象TimerTask task = new TimerTask() {@Overridepublic void run() {if (player == null) return;int duration = player.getDuration(); //获取歌曲总时长int currentPosition = player.getCurrentPosition();//获取播放进度Message msg = MainActivity.handler.obtainMessage();//创建消息对象//将音乐的总时长和播放进度封装至消息对象中Bundle bundle = new Bundle();bundle.putInt("duration", duration);bundle.putInt("currentPosition", currentPosition);msg.setData(bundle);//将消息发送到主线程的消息队列MainActivity.handler.sendMessage(msg);}};//开始计时任务后的5毫秒,第一次执行task任务,以后每500毫秒执行一次timer.schedule(task, 5, 500);}}class MusicControl extends Binder {public void play() {try {player.reset();//重置音乐播放器//加载多媒体文件player = MediaPlayer.create(getApplicationContext(),R.raw.music);player.start();//播放音乐addTimer(); //添加计时器} catch (Exception e) {e.printStackTrace();}}public void pausePlay() {player.pause(); //暂停播放音乐}public void continuePlay() {player.start(); //继续播放音乐}public void seekTo(int progress) {player.seekTo(progress);//设置音乐的播放位置}}@Overridepublic void onDestroy() {super.onDestroy();if (player == null) return;if (player.isPlaying()) player.stop();//停止播放音乐player.release(); //释放占用的资源player = null; //将player置为空}}(4)编写界面交互代码关键代码如下:public class MainActivity extends AppCompatActivity implementsView.OnClickListener{private static SeekBar sb;private static TextView tv_progress, tv_total;private ObjectAnimator animator;private MusicService.MusicControl musicControl;MyServiceConn conn;Intent intent;private boolean isUnbind = false;//记录服务是否被解绑@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);init();}private void init() {tv_progress = (TextView) findViewById(_progress);tv_total = (TextView) findViewById(_total);sb = (SeekBar) findViewById(R.id.sb);findViewById(R.id.btn_play).setOnClickListener(this);findViewById(R.id.btn_pause).setOnClickListener(this);findViewById(R.id.btn_continue_play).setOnClickListener(this);findViewById(R.id.btn_exit).setOnClickListener(this);intent = new Intent(this, MusicService.class);//创建意图对象conn = new MyServiceConn();//创建服务连接对象bindService(intent, conn, BIND_AUTO_CREATE); //绑定服务//为滑动条添加事件监听sb.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {@Overridepublic void onProgressChanged(SeekBar seekBar, int progress, booleanfromUser) { //滑动条进度改变时,会调用此方法if (progress == seekBar.getMax()) { //当滑动条滑到末端时,结束动画animator.pause(); //停止播放动画}}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {//滑动条开始滑动时调用}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) { //滑动条停止滑动时调用//根据拖动的进度改变音乐播放进度int progress = seekBar.getProgress();//获取seekBar的进度musicControl.seekTo(progress); //改变播放进度}});ImageView iv_music = (ImageView) findViewById(R.id.iv_music);animator = ObjectAnimator.ofFloat(iv_music, "rotation", 0f, 360.0f);animator.setDuration(10000); //动画旋转一周的时间为10秒animator.setInterpolator(new LinearInterpolator());animator.setRepeatCount(-1); //-1表示设置动画无限循环}4.运行结果开始播放如图4-1所示图4-15.实验小结通过此次实验,让我了解到了Android中的服务创建,比如下载文件、播放音乐等功能,其中让我学到了一个背景选择器,可以通过这个选择器动态呈现按钮的背景颜色。
Android_音乐播放器_功能实现和分析

基于Android开发音乐播放器的设计本文主要是在Android系统上对音乐播放器应用程序的设计与实现进行讨论,通过这一过程来进一步学习Android平台,这样对个人未来发展有很大的意义。
本文的音乐播放器采用了Android开源系统技术,利用Java语言和Eclipse开发工具对播放器代码进行编写。
同时给出了详细的系统设计过程、部分界面截图及主要的功能流程图,本文还对开发过程中遇到的问题和解决方法进行了详细的讨论,该音乐播放器集播放、暂停、停止、上一首、下一首、歌词显示等功能于一体,性能良好,在Android系统中能独立运行。
对于播放歌曲的文件,本播放器只限于应用层程序的探讨,所以对具体的文件不做深入研究。
实验证明,基于android平台的软件开发简单,使用方便简洁,必将成为未来几年的发展方向,具有普遍意义。
关键词: Android,Java,Eclipse,音乐播放器目录1.前言 (1)2系统需求分析 (2)2.1功能需求 (2)2.1.1播放器的基本控制需求 (2)2.1.2功能需求(时序图)分析 (3)2.2 系统结构图和流程图 (4)2.3系统界面需求 (4)2.4系统性能需求 (5)2.5运行环境需求 (5)3 Android项目介绍 (6)3.1什么是Android (6)3.1.1Android的介绍 (6)3.1.2 Android Features 特性: (6)3.1.3 Android 基本框架(Android Architecture) (7)3.2 Android应用软件开发的核心技术 (10)3.2.1 Android 应用开发语言 (10)3.2.2 Android 应用程序组件 (10)3.3 Android开发环境的搭配 (13)3.4 Android模拟器中sd卡的创建和文件的上传 (15)3.4.1 SD卡的创建 (15)3.4.2向sd卡里面上传文件及异常解决 (16)4音乐播放器的详细设计 (17)4.1 播放器的欢迎界面和主界面的设计和说明 (17)4.2 Android媒体播放原理 (20)4.3 播放功能实现细节 (21)5软件测试 (22)5.1 软件的测试 (22)5.1.1软件测试的环境 (22)5.1.2测试阶段 (22)6 代码附录 251.前言当今社会的生活节奏越来越快,人们对手机的要求也越来越高,由于手机市场发展迅速,是的手机操作系统也出现了不同各类,现在的市场主要有三个手机操作系统,Windows mobile,symbian,以及谷歌的Android操作系统,其中占有开发源代码优势的Android系统有最大的发展前景。
Android简易音乐播放器实现代码

Android简易⾳乐播放器实现代码本⽂实例为⼤家分享了Android⾳乐播放器的具体代码,供⼤家参考,具体内容如下1.播放项⽬内的⾳乐package com.thm.g150820_android26_playmusic;import Android.media.MediaPlayer;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.ImageButton;import android.widget.SeekBar;public class MainActivity extends AppCompatActivity {private MediaPlayer mediaPlayer;private SeekBar seekBar;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);seekBar = (SeekBar) findViewById(R.id.seekBar);seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {@Overridepublic void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {//获取拖动结束之后的位置int progress = seekBar.getProgress();//跳转到某个位置播放mediaPlayer.seekTo(progress);}});}public void isPlayOrPause(View view){//把View强转为ImageButtonImageButton imageButton = (ImageButton) view;if(mediaPlayer==null) {//实例化MediaPlayermediaPlayer = MediaPlayer.create(this, R.raw.yao);//开始播放mediaPlayer.start();//图标修改为暂停的图标imageButton.setImageResource(android.R.drawable.ic_media_pause);//获取⾳乐的总时长int duration = mediaPlayer.getDuration();//设置进度条的最⼤值为⾳乐的总时长seekBar.setMax(duration);new MyThre().start();}//判断如果⾳乐在播放else if(mediaPlayer.isPlaying()){//就暂停⾳乐mediaPlayer.pause();//图标修改为播放的图标imageButton.setImageResource(android.R.drawable.ic_media_play);}else{mediaPlayer.start();//图标修改为暂停的图标imageButton.setImageResource(android.R.drawable.ic_media_pause);}}//写内部类class MyThre extends Thread{@Overridepublic void run() {super.run();while(seekBar.getProgress()<=seekBar.getMax()){//获取当前⾳乐播放的位置int currentPosition = mediaPlayer.getCurrentPosition();//让进度条动起来seekBar.setProgress(currentPosition);}}}}2.播放内存卡中的⾳乐package com.thm.g150820_android26_playmusic;import android.media.AudioManager;import android.media.MediaPlayer;import .Uri;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.ImageButton;import android.widget.SeekBar;import java.io.IOException;public class MainActivity extends AppCompatActivity {private MediaPlayer mediaPlayer;private SeekBar seekBar;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);seekBar = (SeekBar) findViewById(R.id.seekBar);seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Overridepublic void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { }@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {//获取拖动结束之后的位置int progress = seekBar.getProgress();//跳转到某个位置播放mediaPlayer.seekTo(progress);}});}public void isPlayOrPause(View view){//把View强转为ImageButtonImageButton imageButton = (ImageButton) view;if(mediaPlayer==null) {//实例化MediaPlayer//播放应⽤内的⾳乐//mediaPlayer = MediaPlayer.create(this, R.raw.yao);//播放内存卡中的⾳乐mediaPlayer = new MediaPlayer();//设置类型mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);//设置⾳乐路径try {mediaPlayer.setDataSource(this, Uri.parse("storage/sdcard0/Music/a.mp3"));//播放之前准备⼀下mediaPlayer.prepare();} catch (IOException e) {e.printStackTrace();}//开始播放mediaPlayer.start();//图标修改为暂停的图标imageButton.setImageResource(android.R.drawable.ic_media_pause);//获取⾳乐的总时长int duration = mediaPlayer.getDuration();//设置进度条的最⼤值为⾳乐的总时长seekBar.setMax(duration);new MyThre().start();}//判断如果⾳乐在播放else if(mediaPlayer.isPlaying()){//就暂停⾳乐mediaPlayer.pause();//图标修改为播放的图标imageButton.setImageResource(android.R.drawable.ic_media_play);}else{mediaPlayer.start();//图标修改为暂停的图标imageButton.setImageResource(android.R.drawable.ic_media_pause);}}//写线程内部类class MyThre extends Thread{@Overridepublic void run() {super.run();while(seekBar.getProgress()<=seekBar.getMax()){//获取当前⾳乐播放的位置int currentPosition = mediaPlayer.getCurrentPosition();//让进度条动起来seekBar.setProgress(currentPosition);}}}}3.添加读取内存的权限更多关于播放器的内容请点击进⾏学习。
AndroidStudio实现音乐播放器

AndroidStudio实现⾳乐播放器Androidstudio⾳乐播放器,供⼤家参考,具体内容如下实现⽬的:利⽤⼴播在myapplication中原本button点我暂停按钮是灰⾊⽆法点击的,此时发送⼀条短信给⾃⼰的安卓⼿机,按钮变成⿊⾊,⾳乐开始播放,此时点击点我暂停按钮,⾳乐停⽌。
结果截图:发送短信给⾃⼰后:,点我暂停按钮变成⿊⾊,并开始播放⾳乐:此时点击点我暂停按钮,⾳乐暂停⼴播Android 应⽤与 Android 系统和其他 Android 应⽤之间可以相互收发⼴播消息,这与发布-订阅设计模式相似。
这些⼴播会在所关注的事件发⽣时发送。
举例来说,Android 系统会在发⽣各种系统事件时发送⼴播,例如系统启动或设备开始充电时。
再⽐如,应⽤可以发送⾃定义⼴播来通知其他应⽤它们可能感兴趣的事件(例如,⼀些新数据已下载)。
⼴播消息本⾝会被封装在⼀个Intent对象中,该对象的操作字符串会标识所发⽣的事件(例如android.intent.action.AIRPLANE_MODE )。
该 Intent 可能还包含绑定到其 extra 字段中的附加信息。
例如,飞⾏模式 intent 包含布尔值 extra 来指⽰是否已开启飞⾏模式。
xml⽂件<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/loading"><Buttonandroid:text="BUTTON"android:layout_marginTop="@android:dimen/app_icon_size"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:onClick="send"/></LinearLayout>mainactivity.java⽂件package com.example.myapplication;import androidx.annotation.NonNull;import androidx.appcompat.app.AppCompatActivity;import androidx.core.app.ActivityCompat;import androidx.core.content.ContextCompat;import android.Manifest;import android.content.Intent;import android.content.pm.PackageManager;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.Toast;public class MainActivity extends AppCompatActivity {private Button btnStop;private boolean isCast; //是否为⼴播激活@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECEIVE_SMS) != PackageManager.PERMISSION_GRANTED){ ActivityCompat.requestPermissions(this,new String[]{"android.permission.RECEIVE_SMS"},1);}btnStop=findViewById(R.id.btnStop);Intent intent = getIntent(); //获取⼴播意图对象isCast = intent.getBooleanExtra("iscast", false); //默认值为falsebtnStop.setEnabled(isCast); //设置停⽌按钮可⽤和单击监听if(isCast) Toast.makeText(this, "正在播放⾳乐...", Toast.LENGTH_SHORT).show();btnStop.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v){//显式服务调⽤意图(⾮绑定式)Intent intent=new Intent(MainActivity.this, MyAudioService.class);//在Activity组件⾥,停⽌⾳乐播放服务stopService(intent);isCast=false;btnStop.setEnabled(isCast);// finish(); //销毁本活动}});}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);switch (requestCode){case 1:if(grantResults[0]!=PackageManager.PERMISSION_GRANTED){Toast.makeText(this, "未授权,⽆法实现预定的功能!", Toast.LENGTH_SHORT).show();finish();}else{Toast.makeText(this, "请发⼀条短信验证...", Toast.LENGTH_SHORT).show();}}}}SmsReceiver.java⽂件编写⼴播接收者程序package com.example.myapplication;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;/*本⼴播接收者程序分别调⽤了应⽤的主Activity程序和播放⾳乐的服务程序*/public class SmsReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {Intent serviceIntent = new Intent(context, MyAudioService.class);//在⼴播组件⾥,通过上下⽂对象启动⾳乐播放服务组件context.startService(serviceIntent);//新建调⽤Activity组件的意图Intent activityIntent = new Intent(context, MainActivity.class);activityIntent.putExtra("iscast", true); //携带数据//新建栈⽤来存放被启动的Activity(当已经存在时,只做移动处理)activityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//在⼴播组件⾥,通过上下⽂对象启动Activity组件context.startActivity(activityIntent);}}MyAudioService.java⽂件package com.example.myapplication;import android.app.Service;import android.content.Intent;import android.media.MediaPlayer;import android.os.IBinder;public class MyAudioService extends Service {MediaPlayer mediaPlayer;@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic void onCreate() {mediaPlayer = MediaPlayer.create(this, R.raw.liyue);//创建⾳乐服务。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
15.4.6 主界面菜单
在主界面中添加了OptionsMenu,提供了对应的菜单功能,如图15.9所示。 1.返回主界面 在菜单中,单击“返回”菜单项,返回主界面,如图15.10所示。 2.设置 在菜单中,单击“设置”菜单项,设置随机播放音乐,如图15.11所示。 实现随机播放音乐代码: 3.关于 在菜单中,单击“关于”菜单项,显示播放器版本,如图15.12所示。
图15.5 第一首歌曲
图15.6 最后一首歌曲
15.4.4 音乐音量的调节
在主界面中可以调节音乐音量,如图15.7所示,功能实现 代码如下。
图15.7 调节音量
15.4.5 音乐播放进度控制
在主界面可以通过SeekBar控制音乐播放进度,如图15.8所示,功 能实现代码如下。
图15.8 控制播放进度
图15.22 设置通知铃声
15.7 小结
本章内容以音乐播放器的开发为例,涉猎到Android 中的诸多开发技巧。希望读者可以参考本章中的核 心代码,基于本案例,开发出具有更完善功能的应 用播放器。更深一步的掌握Android项目的开发,达 到学以致用的目的。
图15.20 设置来电铃声
15.6.2 设置闹铃铃声
在设置界面中,单击设置闹铃铃声的ImageView,弹 出设置对话框,选择响铃方式,如图15.21所示,功 能实现代码如下。
图15.21 设置闹铃铃声
15.6.3 设置通知铃声
在设置界面中,单击设置通知铃声的ImageView,弹 出设置对话框,选择响铃方式,如图15.22所示,功 能实现代码如下。
本节在整体上介绍该应用程序的功能以及开发环境, 使读者在进入正式的程序开发之前对系统有一定了 解。
15.1.1 功能概述
该应用程序主要功能包括以下几部分: 播放用户存储在SD卡中的mp3格式的音乐; 将音乐设置成为来电铃声、闹铃铃声或者通知铃声; 录音,并可将录制的音乐文件添加到播放器列表中 进行播放。15.5.3 播放录音文件
选中录音文件,单击播放,如图15.18所示,功能实现代码如下。
图15.18 播放录音文件
15.6 设置界面的设计与实现
在播放列表界面单击第二个ImageButton,跳转到设置界面,如 图15.19所示。
15.6.1 设置来电铃声
在设置界面中,单击设置手机铃声的ImageView,弹 出设置对话框,选择响铃方式,如图15.20所示,功 能实现代码如下。
15.4.6 主界面菜单
4.更新 在菜单中,单击“更新”菜单项,更新播放器,如图15.13所示。 5.退出 在菜单中,单击“退出”菜单项,然后单击“确定”按钮,退出系统,如图 15.14所示。 6.更多 在菜单中,单击“更多”菜单项,弹出对话框,如图15.15所示。
15.5 录音界面的设计与实现
图15.1 系统架构图
15.3 登陆界面的设计与实现
从本节开始,我们正式进入程序的代码开发。登陆界面就是在 我们启动程序打开主界面之前,显示的欢迎界面。本案例的登 陆界面显示了一张图片,如图15.3所示。
图15.3 登陆界面 登陆界面使用ImageView控件加载图片。在代码中设置全屏显 示,由线程控制两秒钟后跳转到音乐播放主界面。
图15.4 ViewFlipper界面切换
15.4.2 音乐播放列表
使用ListView建立音乐播放列表,将SD卡中的mp3格 式的音乐添加到列表中,功能实现代码如下。 单击音乐列表中的Item,开始播放被选中的音乐, 功能实现代码如下。
15.4.3 音乐播放控制
在主界面中单击按钮,调用playMusic()方法播放音乐,功能实现代码如下。 单击“暂停”按钮,暂停正在播放的音乐,功能实现代码如下。 单击按钮播放上一首歌曲,如果到第一首,则使用Toast提示,如图15.5所示, 功能实现代码如下。 单击按钮播放下一首歌曲,如果到最后一首,则使用Toast提示,如图15.6所 示,功能实现代码如下。
第15章Android程序开发——音乐 播放器
本章将介绍一个Android应用程序——音乐播放器的 开发。该程序除了实现音乐播放之外,还有录音、 设置铃声等功能。该案例的开发,将综合运用 Android中的多种控件以及手势、菜单、系统服务等, 帮助读者掌握实用的开发技巧。
15.1 系统简介
15.1.2 开发环境及目标平台
开发该系统需要用到的开发环境,以及其目标平台,如 图15.2所示。
图15.2 开发环境与目标平台
15.2 系统架构
本节对系统的框架进行简要的介绍,以帮助读者更好的理解系 统的开发过程。该系统可以分为四大模块:登录模块、音乐播 放模块、录音模块和设置模块,如图15.1所示。
15.4 主界面的设计与实现
主界面的主要作用就是播放用户存储在SD卡中的 mp3格式的音乐。该模块由音乐列表、音乐播放、音 量调节、音乐进度控制和主界面菜单等构成,下面 依次讲解。
15.4.1 主界面布局
在主界面的布局文件中,使用了ViewFlipper控件,实现在同一个Activity 内屏幕间的切换,由播放界面切换到播放列表界面,如图15.4所示。
在列表界面的底部,有两个ImageButton。第一个用 于实现录音功能,第二个用于实现设置功能。下买 我们来看录音功能的设计与实现。
15.5.1 录音界面
在播放列表界面单击第一个ImageButton,跳转到录音界面,如 图15.16所示。
15.5.2 录音功能实现
调用MediaRecorder类实现录音功能,将录音文件添加到录音文 件list中,如图15.17所示,功能实现代码如下。