轻松学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);//创建⾳乐服务。
#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。
Android音乐播放器开发文档
Android音乐播放器撰写人:张XX2011-3-15一、问题定义本软件是为了用户智能手机Android而开发的一套智能软件,提供在线下载音乐,在线播放音乐,读取SD卡音乐文件等功能。
二、可行性研究社会可行性分析:3G技术飞速发展,为满足人们对音乐的追求,音乐播放器层出不从,然而市面上大多音乐播发器软件都太难操作,或者音质不好,不能给用户以更好体验,故提出开放一套更加人性化的手机播放器。
技术可行性分析:以现阶段android技术发展水平,技术人员的技术配备,以及现有资源文档的配备来说,实现本软件是可能的。
经济可行性分析:有本人个人时间以及经费支持,使得开发此软件有了资金保障,可以充分利用这一优势,尽快开发。
其他可行性分析:三、需求分析随着3G时代的到来,手机应用越来越普遍,加之国民手机持有量更是爆炸式增长。
移动音乐服务正是为这一形势而发展起来,本人提出一种多功能手机音乐播放器的应用,主要为了满足不同人群的音乐需要,并且提高优质的音乐服务,于是提出本音乐播放器的主要功能。
需求功能如下:在线下载音乐功能。
在线播放音乐显示声音波段表示提供读取SD卡音乐用户可以定制音乐均衡器,以满足不同音质需求音量调节提供歌词跟随音乐滚动更能提供重力感应选择上、下首歌曲功能四、概要设计(总体设计):软件程序流程图五:详细设计那么接下来就开始我们的每一个模块的详细设计了:在线下载音乐:提供一个文本框供用户输入网络音乐文件地址,然后确定下载,并提供进度条显示,下载完毕后关闭对话框,注意进程之间的问题。
在线播放音乐提供音乐播放的基本功能,快进,暂停,播放,快退,同时进度滑块条需跟随滑动,用户也可以滑动滑动条进行调整播放位置。
提供读取SD卡音乐检测用户SD卡,如果没有,则弹出信息提示,并提示用户下载网络音乐,如果检测有SD卡,则再遍历是否有可播放文件,如果没有,则返回。
如果有,则显示出全部音乐文件,并提供点击播放功能。
用户可以定制音乐均衡器,以满足不同音质需求以一个对话框形式表现出,并提供多项滑动条供用户调节音频,同时更新音乐播放的质量。
Android实现简单音乐播放器(MediaPlayer)
Android实现简单⾳乐播放器(MediaPlayer)Android实现简单⾳乐播放器(MediaPlayer),供⼤家参考,具体内容如下开发⼯具:Andorid Studio 1.3运⾏环境:Android 4.4 KitKat⼯程内容实现⼀个简单的⾳乐播放器,要求功能有:播放、暂停功能;进度条显⽰播放进度功能拖动进度条改变进度功能;后台播放功能;停⽌功能;退出功能;代码实现导⼊歌曲到⼿机SD卡的Music⽬录中,这⾥我导⼊了4⾸歌曲:仙剑六⾥⾯的《誓⾔成晖》、《剑客不能说》、《镜中⼈》和《浪花》,也推荐⼤家听喔(捂脸然后新建⼀个类MusicService继承Service,在类中定义⼀个MyBinder,有⼀个⽅法⽤于返回MusicService本⾝,在重载onBind()⽅法的时候返回public class MusicService extends Service {public final IBinder binder = new MyBinder();public class MyBinder extends Binder{MusicService getService() {return MusicService.this;}}@Overridepublic IBinder onBind(Intent intent) {return binder;}}在MusicService中,声明⼀个MediaPlayer变量,进⾏设置歌曲路径,这⾥我选择歌曲1作为初始化时候的歌曲private String[] musicDir = new String[]{Environment.getExternalStorageDirectory().getAbsolutePath() + "/Music/仙剑奇侠传六-主题曲-《誓⾔成晖》.mp3",Environment.getExternalStorageDirectory().getAbsolutePath() + "/Music/仙剑奇侠传六-主题曲-《剑客不能说》.mp3",Environment.getExternalStorageDirectory().getAbsolutePath() + "/Music/仙剑奇侠传六-主题曲-《镜中⼈》.mp3",Environment.getExternalStorageDirectory().getAbsolutePath() + "/Music/仙剑奇侠传六-主题曲-《浪花》.mp3"};private int musicIndex = 1;public static MediaPlayer mp = new MediaPlayer();public MusicService() {try {musicIndex = 1;mp.setDataSource(musicDir[musicIndex]);mp.prepare();} catch (Exception e) {Log.d("hint","can't get to the song");e.printStackTrace();}}设计⼀些歌曲播放、暂停、停⽌、退出相应的逻辑,此外我还设计了上⼀⾸和下⼀⾸的逻辑public void playOrPause() {if(mp.isPlaying()){mp.pause();} else {mp.start();}}public void stop() {if(mp != null) {mp.stop();try {mp.prepare();mp.seekTo(0);} catch (Exception e) {e.printStackTrace();}}}public void nextMusic() {if(mp != null && musicIndex < 3) {mp.stop();try {mp.reset();mp.setDataSource(musicDir[musicIndex+1]);musicIndex++;mp.prepare();mp.seekTo(0);mp.start();} catch (Exception e) {Log.d("hint", "can't jump next music");e.printStackTrace();}}}public void preMusic() {if(mp != null && musicIndex > 0) {mp.stop();try {mp.reset();mp.setDataSource(musicDir[musicIndex-1]);musicIndex--;mp.prepare();mp.seekTo(0);mp.start();} catch (Exception e) {Log.d("hint", "can't jump pre music");e.printStackTrace();}}}注册MusicService并赋予权限,允许读取外部存储空间<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/><service android:name="com.wsine.west.exp5_AfterClass.MusicService" android:exported="true"></service>在MainAcitvity中声明ServiceConnection,调⽤bindService保持与MusicService通信,通过intent的事件进⾏通信,在onCreate()函数中绑定Serviceprivate ServiceConnection sc = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName componentName, IBinder iBinder) {musicService = ((MusicService.MyBinder)iBinder).getService();}@Overridepublic void onServiceDisconnected(ComponentName componentName) {musicService = null;}};private void bindServiceConnection() {Intent intent = new Intent(MainActivity.this, MusicService.class);startService(intent);bindService(intent, sc, this.BIND_AUTO_CREATE);}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);Log.d("hint", "ready to new MusicService");musicService = new MusicService();Log.d("hint", "finish to new MusicService");bindServiceConnection();seekBar = (SeekBar)this.findViewById(R.id.MusicSeekBar);seekBar.setProgress(musicService.mp.getCurrentPosition());seekBar.setMax(musicService.mp.getDuration());musicStatus = (TextView)this.findViewById(R.id.MusicStatus);musicTime = (TextView)this.findViewById(R.id.MusicTime);btnPlayOrPause = (Button)this.findViewById(R.id.BtnPlayorPause);Log.d("hint", Environment.getExternalStorageDirectory().getAbsolutePath()+"/You.mp3");}bindService函数回调onSerciceConnented函数,通过MusiceService函数下的onBind()⽅法获得binder对象并实现绑定通过Handle实时更新UI,这⾥主要使⽤了post⽅法并在Runnable中调⽤postDelay⽅法实现实时更新UI,Handle.post⽅法在onResume()中调⽤,使得程序刚开始时和重新进⼊应⽤时能够更新UI在Runnable中更新SeekBar的状态,并设置SeekBar滑动条的响应函数,使歌曲跳动到指定位置public android.os.Handler handler = new android.os.Handler();public Runnable runnable = new Runnable() {@Overridepublic void run() {if(musicService.mp.isPlaying()) {musicStatus.setText(getResources().getString(R.string.playing));btnPlayOrPause.setText(getResources().getString(R.string.pause).toUpperCase());} else {musicStatus.setText(getResources().getString(R.string.pause));btnPlayOrPause.setText(getResources().getString(R.string.play).toUpperCase());}musicTime.setText(time.format(musicService.mp.getCurrentPosition()) + "/"+ time.format(musicService.mp.getDuration()));seekBar.setProgress(musicService.mp.getCurrentPosition());seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {@Overridepublic void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {if (fromUser) {musicService.mp.seekTo(seekBar.getProgress());}}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {}});handler.postDelayed(runnable, 100);}};@Overrideprotected void onResume() {if(musicService.mp.isPlaying()) {musicStatus.setText(getResources().getString(R.string.playing));} else {musicStatus.setText(getResources().getString(R.string.pause));}seekBar.setProgress(musicService.mp.getCurrentPosition());seekBar.setMax(musicService.mp.getDuration());handler.post(runnable);super.onResume();Log.d("hint", "handler post runnable");}给每个按钮设置响应函数,在onDestroy()中添加解除绑定,避免内存泄漏public void onClick(View view) {switch (view.getId()) {case R.id.BtnPlayorPause:musicService.playOrPause();break;case R.id.BtnStop:musicService.stop();seekBar.setProgress(0);break;case R.id.BtnQuit:handler.removeCallbacks(runnable);unbindService(sc);try {System.exit(0);} catch (Exception e) {e.printStackTrace();}break;case R.id.btnPre:musicService.preMusic();break;case R.id.btnNext:musicService.nextMusic();break;default:break;}}@Overridepublic void onDestroy() {unbindService(sc);super.onDestroy();}在Button中赋予onClick属性指向接⼝函数<Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/BtnPlayorPause"android:text="@string/btnPlayorPause"android:onClick="onClick"/>效果图打开界⾯->播放⼀会⼉进度条实时变化->拖动进度条->点击暂停->点击Stop->点击下⼀⾸(歌曲时间变化)->点击上⼀⾸->点击退出⼀些总结读取SD卡内存的时候,应该使⽤android.os.Environment库中的getExternalStorageDirectory()⽅法,然⽽并不能⽣效。
Android实现简易的音乐播放器
Android实现简易的⾳乐播放器本⽂实例为⼤家分享了Android实现简易的⾳乐播放器,供⼤家参考,具体内容如下功能介绍本次实验实现的是使⽤Andriod Studio开发⼀个简易的⾳乐播放器,所包含的功能有⾳乐的播放、暂停、上⼀曲、下⼀曲、⾳乐播放的进度以及⼿动拖动来控制⾳乐的播放进度。
实现过程导⼊项⽬所需的⾳乐⽂件、图标、背景等1.创建⼀个raw⽂件夹,将⾳乐⽂件导⼊到这个⽂件夹中,⽅便我们在项⽬中使⽤2.在drawable中导⼊所需的图⽚、图标设计UI界⾯1.设计5个button控件,分别对应上⼀曲,下⼀曲,暂停,播放,退出2.设计3个TextView,分别对应歌曲的介绍信息、歌曲的进度(歌曲的总时间和歌曲当前播放的时间)、歌曲的名字service服务的编写创建⼀个MusicService对象继承ServiceMusicService所需要的成员变量MyReceiver serviceReceiver;Thread processThread;AssetManager am;//是附件管理器,⽤于根据⽂件名找到⽂件所在并打开⽂件String[] musics = new String[]{"legendsneverdie.mp3", "promise.mp3","beautiful.mp3"};//默认显⽰的歌曲信息MediaPlayer mPlayer;// 当前的状态,0x11代表没有播放;0x12代表正在播放;0x13代表暂停int status = 0x11;// 记录当前正在播放的⾳乐int current = 0;实现循环播放public void onCreate() {super.onCreate();am = getAssets();// 创建BroadcastReceiverserviceReceiver = new MyReceiver();// 创建IntentFilterIntentFilter filter = new IntentFilter();filter.addAction(MainActivity.CTL_ACTION);registerReceiver(serviceReceiver, filter);// 创建MediaPlayermPlayer = new MediaPlayer();// 为MediaPlayer播放完成事件绑定监听器mPlayer.setOnCompletionListener(new OnCompletionListener(){@Overridepublic void onCompletion(MediaPlayer mp) {Log.d("musicService", "播放完成");current++;if (current >= 3) {current = 0;}// 准备并播放⾳乐prepareAndPlay(musics[current]);//发送⼴播通知Activity更改⽂本框Intent sendIntent = new Intent(MainActivity.UPDATE_ACTION);sendIntent.putExtra("current", current);sendIntent.putExtra("currentTime", mPlayer.getCurrentPosition());sendIntent.putExtra("totalTime", mPlayer.getDuration());// 发送⼴播,将被Activity组件中的BroadcastReceiver接收到sendBroadcast(sendIntent);}});private void prepareAndPlay(String music) {try {// 打开指定⾳乐⽂件AssetFileDescriptor afd = am.openFd(music);mPlayer.reset();// 使⽤MediaPlayer加载指定的声⾳⽂件。
Android小项目之“音乐播放器”
3 播放
播放
这是播放工作最基层的操作逻辑,当播放器第一次播放音乐、切歌,前期需要完成例如选歌等操作,最后的播放就交由该函数负责。
小技巧:如何让整个播放列表循环播放
mMediaPlayer.setDataSource(MusicService.this, mMusicUriList.get(currentIndex % mMusicUriList.size()));
MediaPlayer.create(context,R.raw.test);
////////////////////////////////////
res/raw里面的文件也可以使用setDataSource()方法加载哟
文章后面会讲解
手机内存SDCARD上的文件,如:/sdcard/test.mp3
Android小项目之“音乐播放器”
最近学习了Android的Activity、基本布局控件、自定义view、ListView、service、BroadcastReceiver等基础知识,就用它们来做个音乐播放器的小项目吧。
注意,该小项目还没添加扫描SDCARD音乐文件的功能,用这raw里面的资源。
本播放器需要用到的MediaPlayer方法已经介绍完毕,对上述MediaPlayer想要了解更多,请自行使用搜索引擎。
至此,我们应该学会了MediaPlayer的基本使用了。接下来,我们在Service中使用它来构建写功能函数,进行播放音乐的工作吧。
MusicService类
相信阅读此文的有些Service基础了,这里不会完整介绍Service编程,主要是讲解如何使用上述MediaPlayer类的方法来完成我们需要的业务。
所以,我们这里需要给Service封装许多函数以满足Activity的需要。
Android音乐播放器开发文档
多媒体综合课程设计报告课题名称:ANDROID音乐播放器姓名:***学号:**********2011年10月31日目录1需求分析..................................... 错误!未定义书签。
1.1问题定义........................................................................................................ 错误!未定义书签。
1.2 可行性研究.............................................................................................. 错误!未定义书签。
1.3 需求分析.................................................................................................. 错误!未定义书签。
1.4总体设计 ....................................................................................................... 错误!未定义书签。
2. 概要设计................................... 错误!未定义书签。
2.1引言 (6)2.1.1................................................................................................................................ 编写目的62.1.2....................................................................................................................................... 背景62.1.3................................................................................................................................ 术语定义62.1.4................................................................................................................................ 参考资料62.2总体设计 (6)2.2.1 ....................................................................................................................... 总体技术框架62.2.2 ................................................................................................................ 需求与设计对应表62.3功能设计................................... 错误!未定义书签。
黑马程序员安卓教程:音乐播放器
音乐播放器1.5.1 准备工作Android 官方提供了MediaPlayer 核心类,用于播放音乐,其状态流程如图1-12 所示。
MediaPlayer 必须严格按照状态图操作,否则就会出现错误,这些错误都是底层抛出,严格按照状态图操作的话一般就不会出问题。
使用MediaPlayer播放音乐的核心方法如下所示:1. M ediaPlayer player = new MediaPlayer(); 创建对象2. p layer.reset(); 重置为初始状态3.player.setAudioStreamType(AudioManager.STREAM_MUSIC);声音流类型4.player.setDataSource(“/mnt/sdcard/test.mp3”); 设置音频源5. player.prepare(); 准备6. player.start(); 开始或恢复播放7. player.pause(); 暂停播放8. player.start(); 恢复播放9. player.stop(); 停止播放10. player.release(); 释放资源为了演示MediaPlayer的使用,我们需要提前准备一个mp3文件放到sdcard中。
需求:制作一个播放器,能够播放/暂停/停止音乐文件,并且添加一个SeekBar(可以拖拽的ProgressBar),当音乐播放时SeekBar 也会不断的跟新当前的进度,当用户拖动SeekBar 时可以更改播放的进度。
23图 1-12 MediaPlayer 状态流程图1.5.2 编写布局【文件 1-7】 activity_main.xml1.<LinearLayout xmlns:android="/apk/res/android"2. android:layout_width="match_parent"3. android:layout_height="match_parent"4. android:orientation="vertical">5.6. <LinearLayout7.android:layout_width="match_parent"248.android:layout_height="wrap_content"9.android:orientation="horizontal"10.>11.<Button12. android:onClick="play"13. android:layout_width="0dp"14. android:layout_weight="1"15. android:layout_height="wrap_content"16. android:text="播放"17. />18.<Button19. android:onClick="pause"20. android:layout_width="0dp"21. android:layout_weight="1"22. android:layout_height="wrap_content"23. android:text="暂停"24. />25.<Button26. android:onClick="stop"27. android:layout_width="0dp"28. android:layout_weight="1"29. android:layout_height="wrap_content"30. android:text="停止"31. />32.33.</LinearLayout>34.35.<SeekBar36.android:layout_width="match_parent"37.android:layout_height="wrap_content"38.android:id="@+id/sb"39./>40.</LinearLayout>1.5.3代码实现【文件1-8】MainActivity.java1. package com.example.musicplayer;2.3.import java.util.Timer;4.import java.util.TimerTask;5.import android.media.AudioManager;6.import android.media.MediaPlayer;257.import android.os.Bundle;8.import android.view.View;9.import android.widget.SeekBar;10.import android.widget.SeekBar.OnSeekBarChangeListener;11.import android.widget.Toast;12.import android.app.Activity;13./**14.* 实现音乐播放器15.*16.* @author wzy2016-1-2817.*18.*/19.public class MainActivity extends Activity implements OnSeekBarChangeListener {20.21.private SeekBar sb;22.private MediaPlayer player;23.private int duration;24.// 播放器的几个状态25.private static final int PLAYING =1;// 播放状态26.private static final int PAUSING =2;// 暂停状态27.private static final int STOPPING =3;// 停止状态28.private volatile int CURRENT =0;// 当前状态29.private Timer timer;30.31.@Override32.protected void onCreate(Bundle savedInstanceState){33.super.onCreate(savedInstanceState);34.setContentView(yout.activity_main);35.sb = (SeekBar) findViewById(R.id.sb);36.//设置拖动监听37.sb.setOnSeekBarChangeListener(this);38.}39./**40.* 播放41.*/42.public void play(View view){43.if (player!=null) {44.if (CURRENT==PLAYING){45.Toast.makeText(this,"音乐已经在播放了",Toast.LENGTH_SHORT).show();46.return;47.}else if(CURRENT==PAUSING) {48.player.start();49.CURRENT = PLAYING;50.return;2651.}52.}53.try{54.//创建一个播放器对象55.player=new MediaPlayer();56.//给播放器设置音乐路径57.player.setDataSource("/mnt/sdcard/test.mp3");58.//设置音乐格式59.player.setAudioStreamType(AudioManager.STREAM_MUSIC);60.//准备61.player.prepare();62.//获取音乐最大长度(毫秒单位)63.duration= player.getDuration();64.//给SeekBar设置最大值65.sb.setMax(duration);66.//音乐开始播放67.player.start();68.//设置当前的状态为播放69.CURRENT = PLAYING;70.if (timer==null){71.//创建定时器72.timer = new Timer();73.}74./**75.* 参数1:匿名内部类,相当于Runnable类76.* 参数2:第一次延时多长时间(毫秒)后执行,0则代表立即执行77.* 参数3:每隔多长时间(毫秒)执行一次78.*/79.timer.schedule(new TimerTask(){80.81.@Override82.public void run() {//该方法每 1 秒被调用一次83. if (CURRENT==PLAYING) {84. runOnUiThread(new Runnable() {85.86. @Override87. public void run() {88. // 双重判断,尽可能避免线程问题,因为该段代码时在主线程中的,89. // 第一次判断是在子线程中进行的90. if (player!=null&&CURRENT==PLAYING) {91. // 获取当前的播放进度92. int currentPosition = player.getCurrentPosition();93. // 设置给SeekBar94. sb.setProgress(currentPosition);95. }2796. }97.});98.}99.100.}101. }, 0, 1000);102.103.}catch (Exception e){104. e.printStackTrace();105.Toast.makeText(this,"音乐播放失败"+e, 0).show(); 106.}107.}108./**109.* 暂停110.*/111.public void pause(View view){112.if (player !=null &&CURRENT==PLAYING){113.player.pause();114.CURRENT = PAUSING;115.}116.}117./**118.* 停止119.*/120.public void stop(View view){121.if (player !=null) {122.if (CURRENT== PLAYING ||CURRENT == PAUSING){ 123. CURRENT = STOPPING;124. // 取消定时器125. timer.cancel();126. timer = null;127. player.stop();128. player.reset();129. player.release();130. player = n ull;131. sb.setProgress(0);132.}133.}134.}135./*136.* 拖动过程中回调多次137.*/138.@Override139.public void onProgressChanged(SeekBar seekBar, int progress,28140.boolean fromUser){141.if (player ==null) {142.sb.setProgress(0);143.}else{144.player.seekTo(progress);145.}146.}147./*148.* 开始拖动前回调一次149.*/150.@Override151.public void onStartTrackingTouch(SeekBar seekBar){152.if (player==null) {153.Toast.makeText(this,"音乐播放器还未开始",Toast.LENGTH_SHORT).show(); 154.}155.}156./*157.* 结束拖动后回调一次158.*/159.@Override160.public void onStopTrackingTouch(SeekBar seekBar) {161.}162.163.@Override164.protected void onDestroy() {165.super.onDestroy();166.stop(null);167.}168.169. }170.运行上面的代码效果如图1-13所示。
- 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所示,功能实现代码如下。