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

您的位置:首頁技術文章
文章詳情頁

Android Studio實現簡單音樂播放功能的示例代碼

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

項目要求

基于Broadcast,BroadcastReceiver等與廣播相關的知識實現簡單的音樂播放功能,包括音樂的播放、暫停、切換、進度選擇、音量調整。

設計效果

(進度條時間刷新功能還沒有實現)

Android Studio實現簡單音樂播放功能的示例代碼

實現思路

音樂服務端負責播放音樂和收發廣播的功能。當音樂服務端作為接收器時,只能接收到主頁面廣播的控制消息;作為發送器時,向主頁面發送歌曲信息更新的消息 主頁面負責進度條以及音量按鈕的監聽,同時也有收發廣播的功能。當主頁面作為接收器時,只能接收到音樂服務端廣播的歌曲信息更新的消息;作為發送器時,向音樂服務端發送對歌曲播放的控制消息。

項目結構圖

Android Studio實現簡單音樂播放功能的示例代碼

主要代碼

1 主頁面

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{// 獲取界面中顯示歌曲標題、作者文本框TextView title, author;// 播放/暫停、停止按鈕ImageButton play, next, last;// 聲明音量管理器public AudioManager mAudioManager = null;// 定義進度條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';// 定義音樂的播放狀態,0x11代表沒有播放;0x12代表正在播放;0x13代表暫停int status = 0x11;String[] titleStrs = new String[] { '龍卷風', '可愛女人', '星晴' };String[] authorStrs = new String[] { 'JayChou', 'JayChou', 'JayChou' };@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.layout);// 獲取程序界面界面中的兩個按鈕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);// 為兩個按鈕的單擊事件添加監聽器play.setOnClickListener(this);last.setOnClickListener(this);next.setOnClickListener(this);// 播放進度監聽audioSeekBar.setOnSeekBarChangeListener(new SeekBarChangeEvent());// 退出后再次進去程序時,進度條保持持續更新if (MusicService.mPlayer != null) {// 設置進度條的最大值MainActivity.audioSeekBar.setMax(MusicService.mPlayer.getDuration());audioSeekBar.setProgress(MusicService.mPlayer.getCurrentPosition());}// 得到當前音量對象mAudioManager = (AudioManager) getSystemService(AUDIO_SERVICE);// 把當前音量值賦給進度條audioVolume.setProgress(mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC));// 監聽音量audioVolume.setOnSeekBarChangeListener(new AudioVolumeChangeEvent());activityReceiver = new ActivityReceiver();// 創建IntentFilterIntentFilter filter = new IntentFilter();// 指定BroadcastReceiver監聽的Actionfilter.addAction(UPDATE_ACTION);// 注冊BroadcastReceiverregisterReceiver(activityReceiver, filter);Intent intent = new Intent(this, MusicService.class);// 啟動后臺ServicestartService(intent);}// 音量監聽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) {}}// 播放進度監聽,別忘了Service里面還有個進度條刷新class SeekBarChangeEvent implements SeekBar.OnSeekBarChangeListener {@Overridepublic void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {// 假設改變源于用戶拖動if (fromUser) {MusicService.mPlayer.seekTo(progress);// 當進度條的值改變時,音樂播放器從新的位置開始播放}}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {MusicService.mPlayer.pause();}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {MusicService.mPlayer.start();}}// 自定義的BroadcastReceiver,負責監聽從Service傳回來的廣播public class ActivityReceiver extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent){// 獲取Intent中的update消息,update代表播放狀態int update = intent.getIntExtra('update', -1);// 獲取Intent中的current消息,current代表當前正在播放的歌曲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;// 控制系統進入播放狀態case 0x12:// 播放狀態下設置使用暫停圖標play.setImageResource(R.drawable.pause);// 設置當前狀態status = 0x12;break;// 控制系統進入暫停狀態case 0x13:// 暫停狀態下設置使用播放圖標play.setImageResource(R.drawable.play);// 設置當前狀態status = 0x13;break;}}}@Overridepublic void onClick(View source){// 創建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;}// 發送廣播,將被Service組件中的BroadcastReceiver接收到sendBroadcast(intent);}}

2 音樂服務端

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文件管理對象AssetManager am;String[] musics = new String[] { '周杰?? - 龍卷風.mp3', '周杰?? - 星晴.mp3', '周杰?? - 可愛女人.mp3' };public static MediaPlayer mPlayer;// 當前的狀態,0x11代表沒有播放;0x12代表正在播放;0x13代表暫停int status = 0x11;// 記錄當前正在播放的音樂int current = 0;@Override//非綁定式服務public IBinder onBind(Intent intent){return null;}@Override//定義初始化函數public void onCreate(){super.onCreate();//獲取asset文件夾里的所有歌曲am = getAssets();// 創建具有篩選功能的服務端接收器serviceReceiver = new MyReceiver();// 創建IntentFilter過濾器IntentFilter filter = new IntentFilter();//使音樂服務端的接收器只能接收客戶端發來的CTL_ACTION消息filter.addAction(MainActivity.CTL_ACTION);//注冊帶有此篩選器且名字叫做serviceReceiver的接收器registerReceiver(serviceReceiver, filter);// 創建MediaPlayermPlayer = new MediaPlayer();// 為MediaPlayer播放完成事件綁定監聽器mPlayer.setOnCompletionListener(new OnCompletionListener() // ①{@Overridepublic void onCompletion(MediaPlayer mp){current++;if (current >= 3){current = 0;}//發送廣播通知Activity更改文本框Intent sendIntent = new Intent(MainActivity.UPDATE_ACTION);sendIntent.putExtra('current', current);// 發送廣播,將被Activity組件中的BroadcastReceiver接收到sendBroadcast(sendIntent);// 準備并播放音樂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:// 原來處于沒有播放狀態if (status == 0x11){// 準備并播放音樂prepareAndPlay(musics[current]);status = 0x12;}// 原來處于播放狀態else if (status == 0x12){// 暫停mPlayer.pause();// 改變為暫停狀態status = 0x13;}// 原來處于暫停狀態else if (status == 0x13){// 播放mPlayer.start();// 改變狀態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更改圖標、文本框Intent sendIntent = new Intent(MainActivity.UPDATE_ACTION);sendIntent.putExtra('update', status);sendIntent.putExtra('current', current);// 發送廣播,將被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());// 準備聲音mPlayer.prepare();// 播放mPlayer.start();// 設置進度條最大值MainActivity.audioSeekBar.setMax(MusicService.mPlayer.getDuration());new Thread(this).start();} catch (IOException e) {e.printStackTrace();}}// 刷新進度條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);}}}

倉庫鏈接

MusicBox

到此這篇關于Android Studio實現簡單音樂播放功能的示例代碼的文章就介紹到這了,更多相關Android Studio 音樂播放內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Android
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
都市激情国产精品| 欧美亚洲福利| 麻豆成人av在线| 国产精品va视频| 在线精品福利| 亚洲精品裸体| 欧美在线不卡| 国产精品久久久久久久久久齐齐 | 樱桃视频成人在线观看| 麻豆网站免费在线观看| 四虎成人av| 久久精品国产大片免费观看| 蜜臀91精品国产高清在线观看| 亚洲午夜91| 亚洲影视一区二区三区| 日韩黄色在线观看| 国产精品午夜av| 国产91欧美| 婷婷国产精品| 亚洲精品激情| 国产成人精品一区二区三区视频| 在线一区视频观看| 日韩中出av| 91亚洲国产高清| 亚洲综合五月| 中文字幕在线看片| 中文字幕成人| 在线天堂资源www在线污| 影音先锋国产精品| 国产乱人伦精品一区| 久久精品国内一区二区三区水蜜桃| 性欧美69xoxoxoxo| 国产精品一区二区美女视频免费看| 欧美亚洲精品在线| 国产免费av一区二区三区| 欧美一区二区三区激情视频| 久久国产乱子精品免费女| 国产一区亚洲| 国产精品99久久免费| 国产手机视频一区二区 | 另类综合日韩欧美亚洲| 久久亚洲欧美| 国内精品福利| 色偷偷色偷偷色偷偷在线视频| 视频一区中文| 不卡专区在线| 国产精品v亚洲精品v日韩精品| 欧美精品一卡| 免费福利视频一区二区三区| 91嫩草精品| 在线一区二区三区视频| 999精品一区| 欧美黄色精品| 蜜桃视频第一区免费观看| 天堂日韩电影| 不卡一二三区| 色爱综合网欧美| 成人在线免费观看91| 国产精品成人国产| 婷婷成人av| 日韩一区中文| 午夜一级在线看亚洲| 日韩免费福利视频| 免费看av不卡| 亚洲精品一级二级| 久久激情婷婷| 激情五月色综合国产精品| 韩国精品主播一区二区在线观看| 日本一区二区免费高清| 三上亚洲一区二区| 成人一区而且| 久久精品电影| 欧美专区一区二区三区| 亚洲另类av| 中文字幕日韩欧美精品高清在线| 亚洲制服欧美另类| 69堂精品视频在线播放| 国产欧美91| 久久青草久久| 综合在线一区| 中文字幕色婷婷在线视频| 美女亚洲一区| 欧美一级二级视频| 久久99偷拍| 免费污视频在线一区| 亚洲色诱最新| 麻豆精品国产91久久久久久| 国产99久久久国产精品成人免费| 久久不射中文字幕| 日本成人中文字幕| 日韩在线欧美| 国产乱码精品一区二区亚洲| 日韩激情一区| 日韩高清在线不卡| 日韩一区二区中文| 国产欧美一区二区色老头| 国产99久久久国产精品成人免费| 综合视频一区| 久久久久久免费视频| 日本午夜精品久久久| 久久久久久黄| 国产美女久久| 视频一区二区不卡| 日韩av福利| 亚洲精品在线国产| 欧美二区视频| 色一区二区三区四区| 日本国产欧美| 一区在线观看| av高清一区| 麻豆中文一区二区| 亚州国产精品| 亚洲欧美激情诱惑| 91精品婷婷色在线观看| 精品国产精品久久一区免费式 | 中文视频一区| 亚洲激精日韩激精欧美精品| 日韩精品专区| 欧美激情视频一区二区三区免费| 亚洲一区欧美| 久久先锋影音| 免费国产自线拍一欧美视频| 久久久久国产精品一区二区| xxxxx性欧美特大| 丰满少妇一区| 美女av一区| 丁香婷婷久久| 国产成人免费视频网站视频社区| 国产精品调教视频| 中文字幕一区二区三区四区久久 | 99成人超碰| 久久久成人网| 亚洲国内精品| 激情综合网站| 亚洲深夜福利| 久久99伊人| 日本在线视频一区二区| 中文字幕日本一区二区| 天堂成人国产精品一区| 中日韩男男gay无套| 亚洲一区二区三区久久久| 天堂精品久久久久| 日韩国产在线不卡视频| 久久xxx视频| 999久久久免费精品国产| 国产一区二区高清| 色狠狠一区二区三区| 国产欧美一级| 天堂av在线| 最新亚洲国产| 福利片在线一区二区| 黑丝美女一区二区| 日本不卡高清| 久久av偷拍| 波多野结衣一区| 日韩av一区二区三区| 精品国产a一区二区三区v免费| 久久精选视频| 日韩av中文字幕一区二区| 亚洲精品永久免费视频| 亚洲欧美网站| 精品国产不卡一区二区| 蜜臀va亚洲va欧美va天堂| 国产精品久久久一区二区| 激情黄产视频在线免费观看| 亚洲视频二区| 久久久久国产一区二区| 国产精品日本一区二区不卡视频| 91中文字幕精品永久在线| 亚洲免费一区二区| 色欧美自拍视频| 欧美日韩亚洲三区| 五月精品视频| 在线看片国产福利你懂的| 日本午夜精品一区二区三区电影| 99久久九九| 精品国产乱码久久久| 亚洲aⅴ网站| 国产午夜精品一区二区三区欧美| 国产一区二区三区视频在线| 日韩欧美高清一区二区三区| 亚洲精品1区| 久久精品电影| 日韩av二区| 久久久久伊人| 国产精品中文字幕制服诱惑| 中文字幕日韩高清在线| 免费国产亚洲视频| 伊人精品视频| 一本一道久久a久久精品蜜桃| 亚洲女同av| av免费不卡国产观看| 国产精品国码视频| 久久精品99国产精品| 一区二区国产在线观看| 日韩三区四区| 国产视频一区二| 日韩成人午夜精品| 欧美午夜三级| 欧美日韩xxxx|