日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Android Studio實(shí)現(xiàn)簡(jiǎn)單音樂播放功能的示例代碼

瀏覽:131日期:2022-09-21 16:42:30

項(xiàng)目要求

基于Broadcast,BroadcastReceiver等與廣播相關(guān)的知識(shí)實(shí)現(xiàn)簡(jiǎn)單的音樂播放功能,包括音樂的播放、暫停、切換、進(jìn)度選擇、音量調(diào)整。

設(shè)計(jì)效果

(進(jìn)度條時(shí)間刷新功能還沒有實(shí)現(xiàn))

Android Studio實(shí)現(xiàn)簡(jiǎn)單音樂播放功能的示例代碼

實(shí)現(xiàn)思路

音樂服務(wù)端負(fù)責(zé)播放音樂和收發(fā)廣播的功能。當(dāng)音樂服務(wù)端作為接收器時(shí),只能接收到主頁(yè)面廣播的控制消息;作為發(fā)送器時(shí),向主頁(yè)面發(fā)送歌曲信息更新的消息 主頁(yè)面負(fù)責(zé)進(jìn)度條以及音量按鈕的監(jiān)聽,同時(shí)也有收發(fā)廣播的功能。當(dāng)主頁(yè)面作為接收器時(shí),只能接收到音樂服務(wù)端廣播的歌曲信息更新的消息;作為發(fā)送器時(shí),向音樂服務(wù)端發(fā)送對(duì)歌曲播放的控制消息。

項(xiàng)目結(jié)構(gòu)圖

Android Studio實(shí)現(xiàn)簡(jiǎn)單音樂播放功能的示例代碼

主要代碼

1 主頁(yè)面

package com.example.dell.musicbox3;import android.app.Activity;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.media.AudioManager;import android.os.Bundle;import android.view.View;import android.view.Window;import android.widget.ImageButton;import android.widget.SeekBar;import android.widget.TextView;public class MainActivity extends Activity implements View.OnClickListener{// 獲取界面中顯示歌曲標(biāo)題、作者文本框TextView title, author;// 播放/暫停、停止按鈕ImageButton play, next, last;// 聲明音量管理器public AudioManager mAudioManager = null;// 定義進(jìn)度條public static SeekBar audioSeekBar = null;// 定義音量大小public SeekBar audioVolume = null;ActivityReceiver activityReceiver;public static final String CTL_ACTION = 'org.crazyit.action.CTL_ACTION';public static final String UPDATE_ACTION = 'org.crazyit.action.UPDATE_ACTION';// 定義音樂的播放狀態(tài),0x11代表沒有播放;0x12代表正在播放;0x13代表暫停int status = 0x11;String[] titleStrs = new String[] { '龍卷風(fēng)', '可愛女人', '星晴' };String[] authorStrs = new String[] { 'JayChou', 'JayChou', 'JayChou' };@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.layout);// 獲取程序界面界面中的兩個(gè)按鈕play = (ImageButton) this.findViewById(R.id.play);last = (ImageButton) this.findViewById(R.id.last);next = (ImageButton) this.findViewById(R.id.next);audioVolume = (SeekBar) findViewById(R.id.seekBar2);audioSeekBar = (SeekBar) findViewById(R.id.seekBar1);title = (TextView) findViewById(R.id.title);author = (TextView) findViewById(R.id.author);// 為兩個(gè)按鈕的單擊事件添加監(jiān)聽器play.setOnClickListener(this);last.setOnClickListener(this);next.setOnClickListener(this);// 播放進(jìn)度監(jiān)聽audioSeekBar.setOnSeekBarChangeListener(new SeekBarChangeEvent());// 退出后再次進(jìn)去程序時(shí),進(jìn)度條保持持續(xù)更新if (MusicService.mPlayer != null) {// 設(shè)置進(jìn)度條的最大值MainActivity.audioSeekBar.setMax(MusicService.mPlayer.getDuration());audioSeekBar.setProgress(MusicService.mPlayer.getCurrentPosition());}// 得到當(dāng)前音量對(duì)象mAudioManager = (AudioManager) getSystemService(AUDIO_SERVICE);// 把當(dāng)前音量值賦給進(jìn)度條audioVolume.setProgress(mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC));// 監(jiān)聽音量audioVolume.setOnSeekBarChangeListener(new AudioVolumeChangeEvent());activityReceiver = new ActivityReceiver();// 創(chuàng)建IntentFilterIntentFilter filter = new IntentFilter();// 指定BroadcastReceiver監(jiān)聽的Actionfilter.addAction(UPDATE_ACTION);// 注冊(cè)BroadcastReceiverregisterReceiver(activityReceiver, filter);Intent intent = new Intent(this, MusicService.class);// 啟動(dòng)后臺(tái)ServicestartService(intent);}// 音量監(jiān)聽class AudioVolumeChangeEvent implements SeekBar.OnSeekBarChangeListener {@Overridepublic void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, progress,0);}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {}}// 播放進(jìn)度監(jiān)聽,別忘了Service里面還有個(gè)進(jìn)度條刷新class SeekBarChangeEvent implements SeekBar.OnSeekBarChangeListener {@Overridepublic void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {// 假設(shè)改變?cè)从谟脩敉蟿?dòng)if (fromUser) {MusicService.mPlayer.seekTo(progress);// 當(dāng)進(jìn)度條的值改變時(shí),音樂播放器從新的位置開始播放}}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {MusicService.mPlayer.pause();}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {MusicService.mPlayer.start();}}// 自定義的BroadcastReceiver,負(fù)責(zé)監(jiān)聽從Service傳回來(lái)的廣播public class ActivityReceiver extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent){// 獲取Intent中的update消息,update代表播放狀態(tài)int update = intent.getIntExtra('update', -1);// 獲取Intent中的current消息,current代表當(dāng)前正在播放的歌曲int current = intent.getIntExtra('current', -1);if (current >= 0){title.setText(titleStrs[current]);author.setText(authorStrs[current]);}switch (update){case 0x11:play.setImageResource(R.drawable.play);status = 0x11;break;// 控制系統(tǒng)進(jìn)入播放狀態(tài)case 0x12:// 播放狀態(tài)下設(shè)置使用暫停圖標(biāo)play.setImageResource(R.drawable.pause);// 設(shè)置當(dāng)前狀態(tài)status = 0x12;break;// 控制系統(tǒng)進(jìn)入暫停狀態(tài)case 0x13:// 暫停狀態(tài)下設(shè)置使用播放圖標(biāo)play.setImageResource(R.drawable.play);// 設(shè)置當(dāng)前狀態(tài)status = 0x13;break;}}}@Overridepublic void onClick(View source){// 創(chuàng)建IntentIntent intent = new Intent('org.crazyit.action.CTL_ACTION');switch (source.getId()){// 按下播放/暫停按鈕case R.id.play:intent.putExtra('control', 1);break;case R.id.last:intent.putExtra('control', 2);break;//按下上一首按鈕case R.id.next:intent.putExtra('control', 3);break;}// 發(fā)送廣播,將被Service組件中的BroadcastReceiver接收到sendBroadcast(intent);}}

2 音樂服務(wù)端

package com.example.dell.musicbox3;import java.io.IOException;import android.app.Service;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.content.res.AssetFileDescriptor;import android.content.res.AssetManager;import android.media.MediaPlayer;import android.media.MediaPlayer.OnCompletionListener;import android.os.IBinder;public class MusicService extends Service implements Runnable{MyReceiver serviceReceiver;//asset文件管理對(duì)象AssetManager am;String[] musics = new String[] { '周杰?? - 龍卷風(fēng).mp3', '周杰?? - 星晴.mp3', '周杰?? - 可愛女人.mp3' };public static MediaPlayer mPlayer;// 當(dāng)前的狀態(tài),0x11代表沒有播放;0x12代表正在播放;0x13代表暫停int status = 0x11;// 記錄當(dāng)前正在播放的音樂int current = 0;@Override//非綁定式服務(wù)public IBinder onBind(Intent intent){return null;}@Override//定義初始化函數(shù)public void onCreate(){super.onCreate();//獲取asset文件夾里的所有歌曲am = getAssets();// 創(chuàng)建具有篩選功能的服務(wù)端接收器serviceReceiver = new MyReceiver();// 創(chuàng)建IntentFilter過濾器IntentFilter filter = new IntentFilter();//使音樂服務(wù)端的接收器只能接收客戶端發(fā)來(lái)的CTL_ACTION消息filter.addAction(MainActivity.CTL_ACTION);//注冊(cè)帶有此篩選器且名字叫做serviceReceiver的接收器registerReceiver(serviceReceiver, filter);// 創(chuàng)建MediaPlayermPlayer = new MediaPlayer();// 為MediaPlayer播放完成事件綁定監(jiān)聽器mPlayer.setOnCompletionListener(new OnCompletionListener() // ①{@Overridepublic void onCompletion(MediaPlayer mp){current++;if (current >= 3){current = 0;}//發(fā)送廣播通知Activity更改文本框Intent sendIntent = new Intent(MainActivity.UPDATE_ACTION);sendIntent.putExtra('current', current);// 發(fā)送廣播,將被Activity組件中的BroadcastReceiver接收到sendBroadcast(sendIntent);// 準(zhǔn)備并播放音樂prepareAndPlay(musics[current]);}});}public class MyReceiver extends BroadcastReceiver{@Overridepublic void onReceive(final Context context, Intent intent){int control = intent.getIntExtra('control', -1);switch (control){// 播放或暫停case 1:// 原來(lái)處于沒有播放狀態(tài)if (status == 0x11){// 準(zhǔn)備并播放音樂prepareAndPlay(musics[current]);status = 0x12;}// 原來(lái)處于播放狀態(tài)else if (status == 0x12){// 暫停mPlayer.pause();// 改變?yōu)闀和顟B(tài)status = 0x13;}// 原來(lái)處于暫停狀態(tài)else if (status == 0x13){// 播放mPlayer.start();// 改變狀態(tài)status = 0x12;}break;// 停止聲音case 2://上一首切換if (current <= 0) {//停止播放mPlayer.stop();//修改currentcurrent = musics.length-1;//播放prepareAndPlay(musics[current]);status = 0x12;}else{mPlayer.stop();current--;prepareAndPlay(musics[current]);status = 0x12;}break;//下一首切換case 3:if (current >= 2) {mPlayer.stop();current = 0;prepareAndPlay(musics[current]);status = 0x12;}else{mPlayer.stop();current++;prepareAndPlay(musics[current]);status = 0x12;}break;}// 廣播通知Activity更改圖標(biāo)、文本框Intent sendIntent = new Intent(MainActivity.UPDATE_ACTION);sendIntent.putExtra('update', status);sendIntent.putExtra('current', current);// 發(fā)送廣播,將被Activity組件中的BroadcastReceiver接收到sendBroadcast(sendIntent);}}private void prepareAndPlay(String music) {try {// 打開指定音樂文件AssetFileDescriptor afd = am.openFd(music);mPlayer.reset();// 使用MediaPlayer加載指定的聲音文件。mPlayer.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(), afd.getLength());// 準(zhǔn)備聲音mPlayer.prepare();// 播放mPlayer.start();// 設(shè)置進(jìn)度條最大值MainActivity.audioSeekBar.setMax(MusicService.mPlayer.getDuration());new Thread(this).start();} catch (IOException e) {e.printStackTrace();}}// 刷新進(jìn)度條public void run() {int CurrentPosition = 0;int total = mPlayer.getDuration();while (mPlayer != null && CurrentPosition < total) {try {Thread.sleep(1000);if (mPlayer != null) {CurrentPosition = mPlayer.getCurrentPosition();}} catch (InterruptedException e) {e.printStackTrace();}MainActivity.audioSeekBar.setProgress(CurrentPosition);}}}

倉(cāng)庫(kù)鏈接

MusicBox

到此這篇關(guān)于Android Studio實(shí)現(xiàn)簡(jiǎn)單音樂播放功能的示例代碼的文章就介紹到這了,更多相關(guān)Android Studio 音樂播放內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Android
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
五月亚洲婷婷 | 亚洲精品黄色| 99久久久久| 免费一二一二在线视频| 国产精品亚洲综合在线观看| 模特精品在线| 丝袜美腿亚洲一区| 在线亚洲成人| 日韩一区电影| 丝袜美腿诱惑一区二区三区| 国产成人免费av一区二区午夜| 日本91福利区| 日韩va亚洲va欧美va久久| 中文精品电影| 婷婷综合福利| 另类亚洲自拍| 亚洲三级观看| 亚洲综合激情在线| 日韩精品免费观看视频| 日本在线不卡视频一二三区| 亚洲精品美女| 日韩高清在线一区| 中文字幕免费一区二区| 99久久夜色精品国产亚洲狼| 久久国产电影| 日韩精品免费一区二区三区| 色88888久久久久久影院| 亚洲天堂一区二区| 少妇久久久久| 欧美专区一区二区三区| 麻豆成人在线| 日韩精品亚洲专区在线观看| 国产美女撒尿一区二区| 欧美交a欧美精品喷水| 色爱av综合网| 日韩精品免费视频人成| 神马久久午夜| 91精品国产自产观看在线| 粉嫩av一区二区三区四区五区| 黄色国产精品| 精品久久电影| 亚洲日韩中文字幕一区| 高潮一区二区| 91精品日本| 婷婷丁香综合| 美日韩一区二区三区| 鲁大师影院一区二区三区| 精品成av人一区二区三区| 中文字幕日韩欧美精品高清在线| 国产一区丝袜| 日本aⅴ亚洲精品中文乱码| 天堂日韩电影| 国产福利资源一区| 婷婷成人在线| 麻豆久久久久久| 日韩黄色免费网站| 欧美日韩国产高清| 国产精品精品| 国产精品国码视频| 蜜臀va亚洲va欧美va天堂 | 极品裸体白嫩激情啪啪国产精品| 青草综合视频| 午夜亚洲一区| 久久国产影院| 韩国久久久久久| 日本精品国产| 亚洲97av| 国产亚洲精品v| 伊人久久高清| 国产精品13p| 久久精品一本| 国产毛片一区二区三区| 亚洲精品一区二区在线播放∴| 久久中文字幕av| 日本美女一区| 久久久久久婷| 精品99在线| 精品国产网站| 久草精品视频| 久久精品网址| 国产免费久久| 国产伦精品一区二区三区视频| 亚洲v天堂v手机在线| 日韩视频二区| 亚洲香蕉网站| 亚洲高清激情| 国产一区久久| 狠狠爱www人成狠狠爱综合网| 99久久夜色精品国产亚洲狼| 日韩高清中文字幕一区二区| 一区二区精品伦理...| 97国产成人高清在线观看| 精品国产精品久久一区免费式 | 免费成人网www| 久久亚洲专区| 日韩视频一区| 中文字幕日本一区二区| 亚洲人亚洲人色久| 亚洲乱码视频| 日韩1区2区3区| 国产欧美91| 国内自拍视频一区二区三区| 美女视频一区在线观看| 国产aa精品| 欧美高清一区| 在线看片日韩| 日韩精品乱码av一区二区| 日韩不卡一区二区三区| 日韩毛片一区| 国产精品欧美日韩一区| 国产欧美日韩精品一区二区免费 | 欧美日韩一区二区三区在线电影| 国产精品日韩精品在线播放| 国产福利亚洲| 日本美女一区| 性欧美精品高清| 欧美久久一区二区三区| 美女在线视频一区| 国产欧美一区二区三区精品酒店| 日本久久成人网| 久久高清国产| 国产毛片一区二区三区| 麻豆mv在线观看| 激情综合网五月| 一区二区国产在线观看| 免费在线日韩av| 亚洲精品国产嫩草在线观看| 久久人人99| 少妇精品在线| 色婷婷亚洲mv天堂mv在影片| 国产一区日韩一区| 亚洲人成在线影院| 国内不卡的一区二区三区中文字幕| 日韩综合一区| 中文无码久久精品| 精品理论电影在线| 伊人久久婷婷| 国产精东传媒成人av电影| 亚洲a一区二区三区| 日韩av一区二| 久久中文字幕av一区二区不卡| 亚洲综合色婷婷在线观看| 久久一区视频| 亚洲欧美日韩视频二区| 国产精品v日韩精品v欧美精品网站 | 美女高潮久久久| 精品一区在线| 国产欧美88| 亚州av乱码久久精品蜜桃| 国产日韩一区二区三区在线| 91精品亚洲| 国产免费播放一区二区| 在线一区电影| 麻豆中文一区二区| 亚洲在线网站| 成人小电影网站| 日韩中文字幕无砖| 欧美日韩精品一区二区视频| 久久国产精品免费一区二区三区 | 日本视频中文字幕一区二区三区| 日韩在线观看一区| 国产亚洲高清一区| 欧美在线资源| 国产91在线精品| 婷婷综合一区| 欧美日韩国产一区二区三区不卡| 国产精品久久久久av蜜臀| 国产精品日本| 婷婷综合六月| 精品久久99| 欧美视频一区| 在线视频日韩| 欧美精品高清| 久久久久黄色| 日韩黄色av| 国产精品呻吟| 激情综合网址| 蜜桃精品在线| 精品欠久久久中文字幕加勒比| 色综合视频一区二区三区日韩 | 影音先锋久久| av资源中文在线| 国产精品一区二区99| 亚洲精品一级| 日韩中文字幕1| 99在线|亚洲一区二区| 日韩不卡在线| 日韩一区三区| 亚洲风情在线资源| 大香伊人久久精品一区二区| 久久国产三级| 国产免费av一区二区三区| 日韩激情啪啪| 日本午夜精品| 97久久超碰| 欧美一区成人| 日韩欧美中文字幕一区二区三区| 在线观看视频免费一区二区三区| 中文日韩欧美| 男人的天堂久久精品|