轻松学Android开发之Android程序开发——音乐播放器
- 格式:ppt
- 大小:1.57 MB
- 文档页数:23
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>。
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公司最新推出的一个手机平台,该平台对移动设备的程序集中包括一个操作系统,一个中间件和一些关键性应用。
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。
广州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开源系统技术,利用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⾳乐播放器的具体代码,供⼤家参考,具体内容如下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⾳乐播放器,供⼤家参考,具体内容如下实现⽬的:利⽤⼴播在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简单音乐播放器点击列表会进入播放的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音乐播放器撰写人:张XX2011-3-15一、问题定义本软件是为了用户智能手机Android而开发的一套智能软件,提供在线下载音乐,在线播放音乐,读取SD卡音乐文件等功能。
二、可行性研究社会可行性分析:3G技术飞速发展,为满足人们对音乐的追求,音乐播放器层出不从,然而市面上大多音乐播发器软件都太难操作,或者音质不好,不能给用户以更好体验,故提出开放一套更加人性化的手机播放器。
技术可行性分析:以现阶段android技术发展水平,技术人员的技术配备,以及现有资源文档的配备来说,实现本软件是可能的。
经济可行性分析:有本人个人时间以及经费支持,使得开发此软件有了资金保障,可以充分利用这一优势,尽快开发。
其他可行性分析:三、需求分析随着3G时代的到来,手机应用越来越普遍,加之国民手机持有量更是爆炸式增长。
移动音乐服务正是为这一形势而发展起来,本人提出一种多功能手机音乐播放器的应用,主要为了满足不同人群的音乐需要,并且提高优质的音乐服务,于是提出本音乐播放器的主要功能。
需求功能如下:在线下载音乐功能。
在线播放音乐显示声音波段表示提供读取SD卡音乐用户可以定制音乐均衡器,以满足不同音质需求音量调节提供歌词跟随音乐滚动更能提供重力感应选择上、下首歌曲功能四、概要设计(总体设计):软件程序流程图五:详细设计那么接下来就开始我们的每一个模块的详细设计了:在线下载音乐:提供一个文本框供用户输入网络音乐文件地址,然后确定下载,并提供进度条显示,下载完毕后关闭对话框,注意进程之间的问题。
在线播放音乐提供音乐播放的基本功能,快进,暂停,播放,快退,同时进度滑块条需跟随滑动,用户也可以滑动滑动条进行调整播放位置。
提供读取SD卡音乐检测用户SD卡,如果没有,则弹出信息提示,并提示用户下载网络音乐,如果检测有SD卡,则再遍历是否有可播放文件,如果没有,则返回。
如果有,则显示出全部音乐文件,并提供点击播放功能。
用户可以定制音乐均衡器,以满足不同音质需求以一个对话框形式表现出,并提供多项滑动条供用户调节音频,同时更新音乐播放的质量。