2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > Android初步学习BroadCast与Service实现简单的音乐播放器

Android初步学习BroadCast与Service实现简单的音乐播放器

时间:2021-08-23 04:20:04

相关推荐

Android初步学习BroadCast与Service实现简单的音乐播放器

ctivity代码

view sourceprint?001.packagecom.siyehuazhilian.musicplay;002.003.importjava.util.ArrayList;004.importjava.util.HashMap;005.006.importandroid.app.Activity;007.importandroid.app.AlertDialog;008.importandroid.app.Notification;009.importandroid.app.NotificationManager;010.importandroid.app.PendingIntent;011.importandroid.content.BroadcastReceiver;012.importandroid.content.Context;013.importandroid.content.DialogInterface;014.importandroid.content.Intent;015.importandroid.content.IntentFilter;016.importandroid.database.Cursor;017.importandroid.graphics.Color;018.importandroid.os.Bundle;019.importandroid.provider.MediaStore;020.importandroid.view.KeyEvent;021.importandroid.view.View;022.importandroid.view.View.OnClickListener;023.importandroid.widget.AdapterView;024.importandroid.widget.AdapterView.OnItemClickListener;025.importandroid.widget.ImageButton;026.importandroid.widget.ListView;027.importandroid.widget.SeekBar;028.importandroid.widget.SeekBar.OnSeekBarChangeListener;029.importandroid.widget.SimpleAdapter;030.importandroid.widget.TextView;031.032.publicclassMainActivityextendsActivityimplementsOnClickListener {033.// ListView034.privateListView listView;035.// 适配器036.privateSimpleAdapter adapter;037.// 数据源038.privateArrayList<hashmap<string, string="">> list;039.// 当前播放的曲目040.privateintcurrentPositionMusic = -1;041.042.// 上一首043.privateImageButton lastImageButton;044.// 播放045.privateImageButton playImageButton;046.// 下一首047.privateImageButton nextImageButton;048.// 循环049.privateImageButton loopImageButton;050.// 播放进度051.privateSeekBar playSeekBar;052.// 当前播放曲目053.privateTextView currentPlayingSong;054.// 是否是第一次进来055.privatebooleanifFirstIn =true;056.057.privateIntent intent;058.059.@Override060.protectedvoidonCreate(Bundle savedInstanceState) {061.super.onCreate(savedInstanceState);062.setContentView(R.layout.activity_main);063.listView = (ListView) findViewById(R.id.listview);064.lastImageButton = (ImageButton) findViewById(R.id.imagebutton_previous);065.playImageButton = (ImageButton) findViewById(R.id.imagebutton_play);066.nextImageButton = (ImageButton) findViewById(R.id.imagebutton_next);067.loopImageButton = (ImageButton) findViewById(R.id.imagebutton_loops);068.playSeekBar = (SeekBar) findViewById(R.id.seekbar_play);069.currentPlayingSong = (TextView) findViewById(R.id.textview_songinformation);070.list =newArrayList<hashmap<string, string="">>();071.072.adapter =newSimpleAdapter(this, list, R.layout.list_item,073.newString[] {"title"},newint[] { R.id.textview_item });074.listView.setAdapter(adapter);075.076.// 为listView设置监听器077.listView.setOnItemClickListener(newOnItemClickListener() {078.079.@Override080.publicvoidonItemClick(AdapterView<!--?--> arg0, View arg1,081.intposition,longarg3) {082.try{083.currentPositionMusic = position;084.playMusic();085.}catch(Exception e) {086.e.printStackTrace();087.}088.}089.});090.091.lastImageButton.setOnClickListener(this);092.playImageButton.setOnClickListener(this);093.nextImageButton.setOnClickListener(this);094.loopImageButton.setOnClickListener(this);095.playSeekBar.setOnSeekBarChangeListener(newOnSeekBarChangeListener() {096.097.@Override098.publicvoidonStopTrackingTouch(SeekBar seekBar) {099.100.}101.102.@Override103.publicvoidonStartTrackingTouch(SeekBar seekBar) {104.105.}106.107.@Override108.publicvoidonProgressChanged(SeekBar seekBar,intprogress,109.booleanfromUser) {110.if(fromUser) {111.// 改变进度条112.intent =newIntent("changed");113.intent.putExtra("seekbarprogress", progress);114.startService(intent);115.}116.}117.});118.}119.120.privatevoidplayMusic() {121.// 启动播放音乐的服务122.intent =newIntent("play");123.intent.putExtra("uri", ((HashMap<string, string="">) list124..get(currentPositionMusic)).get("path"));125.intent.putExtra("title", ((HashMap<string, string="">) list126..get(currentPositionMusic)).get("title"));127.startService(intent);128.// 把图片改为播放的图片129.playImageButton.setImageResource(R.drawable.play);130.// 同时更改SeekBar的进度,因为进度是不断变化的,所以需要一个子线程来刷新下131.// playSeekBar.setMax(mp.getDuration());132.// 设置当前播放曲目信息133.currentPlayingSong.setTextColor(Color.GREEN);134.currentPlayingSong.setText(list.get(currentPositionMusic).get("title"));135.}136.137.@Override138.protectedvoidonResume() {139.super.onResume();140.// 得到所有音频141.if(ifFirstIn) {142.ifFirstIn =false;143.scanMusic();144.}145.// 动态注册广播146.IntentFilter filter =newIntentFilter();147.filter.addAction("seekbarmaxprogress");148.filter.addAction("seekbarprogress");149.filter.addAction("playNextSong");150.filter.addAction("pause");151.filter.addAction("setplay");152.filter.addAction("stoploop");153.filter.addAction("startloop");154.registerReceiver(broadcastReceiver, filter);155.}156.157.@Override158.protectedvoidonDestroy() {159.super.onDestroy();160.// 关闭通知161.intent =newIntent("stopnotification");162.startService(intent);163.164.// 停止服务165.stopService(intent);166.// 取消广播的注册167.unregisterReceiver(broadcastReceiver);168.}169.170.@Override171.publicbooleanonKeyDown(intkeyCode, KeyEvent event) {172.if(keyCode == KeyEvent.KEYCODE_BACK) {173.AlertDialog.Builder builder =newAlertDialog.Builder(this);174.builder.setTitle("你确定要退出吗?");175.builder.setPositiveButton("确定",176.newDialogInterface.OnClickListener() {177.@Override178.publicvoidonClick(DialogInterface dialog,intwhich) {179.finish();180.}181.});182.builder.setNegativeButton("取消",183.newDialogInterface.OnClickListener() {184.@Override185.publicvoidonClick(DialogInterface dialog,intwhich) {186.}187.});188.builder.show();189.returntrue;190.}else{191.returnsuper.onKeyDown(keyCode, event);192.}193.}194.195./**196.* 得多所有的音频197.*/198.privatevoidscanMusic() {199.// 置空list集合中的所有元素,放置反复启动导致的数据重复,其实这个部分是因为每次进来都会重新获得焦点,执行onResume造成的200.// 这个修改虽然可以,但是每次进来都有重新加载,增加了手机的符合,所以可以设置一个标志,只有在第一进来的时候才会加载数据201.// list.clear();202.newThread() {203.publicvoidrun() {204.Cursor cursor = getContentResolver().query(205.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,null,206.null,null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER);207.208.while(cursor.moveToNext()) {209.String title = cursor210..getString(cursor211..getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));212.String path = cursor213..getString(cursor214..getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));215.String size = cursor216..getString(cursor217..getColumnIndexOrThrow(MediaStore.Audio.Media.SIZE));218.if(Long.parseLong(size) >1024*1024) {219.HashMap<string, string=""> hashMap1 =newHashMap<string, string="">();220.hashMap1.put("title", title);221.hashMap1.put("path", path);222.list.add(hashMap1);223.}224.}225.cursor.close();226.};227.}.start();228.229.}230.231./**232.* 监听233.*/234.@Override235.publicvoidonClick(View v) {236.switch(v.getId()) {237.caseR.id.imagebutton_previous:238.playLastSong();239.break;240.caseR.id.imagebutton_play:241.intent =newIntent("clickplay");242.startService(intent);243.break;244.caseR.id.imagebutton_next:245.playNextSong();246.break;247.caseR.id.imagebutton_loops:248.intent =newIntent("loops");249.startService(intent);250.break;251.default:252.break;253.}254.}255.256./**257.* 播放下一曲258.*/259.privatevoidplayNextSong() {260.// 只有当有音乐在播放的时候才可以点击下一首261.if(currentPositionMusic != -1) {262.// 如果当前歌曲为最后一首,就播放第一首歌曲263.if(currentPositionMusic == list.size() -1) {264.// 设置当前歌曲为第一首265.currentPositionMusic =0;266.try{267.// 播放第一首歌曲268.playMusic();269.}catch(Exception e) {270.e.printStackTrace();271.}272.}// 否则就播放下一首歌曲273.else{274.// 设置当前歌曲为下一首275.currentPositionMusic++;276.try{277.// 播放下一首歌曲278.playMusic();279.}catch(Exception e) {280.e.printStackTrace();281.}282.}283.284.}285.}286.287./**288.* 播放上一曲289.*/290.privatevoidplayLastSong() {291.// 只有当有音乐在播放的时候才可以点击上一首292.if(currentPositionMusic != -1) {293.// 如果当前歌曲为第一首,就播放最后一首歌曲294.if(currentPositionMusic ==0) {295.// 设置当前歌曲为最后一首296.currentPositionMusic = list.size() -1;297.try{298.// 播放最后一首歌曲299.playMusic();300.}catch(Exception e) {301.e.printStackTrace();302.}303.}// 否则就播放上一首歌曲304.else{305.// 设置当前歌曲为前一首306.currentPositionMusic--;307.try{308.// 播放前一首歌曲309.playMusic();310.}catch(Exception e) {311.e.printStackTrace();312.}313.}314.315.}316.}317.318./**319.* 广播对象,动态注册,用来接收从Service传过来的消息,根据不同的消息做不同的事情320.*/321.privateBroadcastReceiver broadcastReceiver =newBroadcastReceiver() {322.323.@Override324.publicvoidonReceive(Context context, Intent intent) {325.if(intent.getAction().equals("seekbarmaxprogress")) {326.playSeekBar.setMax(intent327..getIntExtra("seekbarmaxprogress",100));328.}elseif(intent.getAction().equals("seekbarprogress")) {329.playSeekBar.setProgress(intent330..getIntExtra("seekbarprogress",0));331.}elseif(intent.getAction().equals("playNextSong")) {332.playNextSong();333.}elseif(intent.getAction().equals("pause")) {334.// 还要把图片改为暂停的图片335.playImageButton.setImageResource(R.drawable.pause);336.}elseif(intent.getAction().equals("setplay")) {337.// 把图片设置成播放的图片338.playImageButton.setImageResource(R.drawable.play);339.}elseif(intent.getAction().equals("stoploop")) {340.// 还要把图片改为不循环的图片341.loopImageButton.setImageResource(R.drawable.loop_false);342.}elseif(intent.getAction().equals("startloop")) {343.// 把图片设置成循环播放的图片344.loopImageButton.setImageResource(R.drawable.loop_true);345.}346.347.}348.};349.350.}351.</string,></string,></string,></string,></hashmap<string,></hashmap<string,>

Service代码

view sourceprint?001.packagecom.siyehuazhilian.service;002.003.importjava.util.HashMap;004.005.importcom.siyehuazhilian.musicplay.MainActivity;006.importcom.siyehuazhilian.musicplay.R;007.008.importandroid.annotation.SuppressLint;009.importandroid.app.Notification;010.importandroid.app.NotificationManager;011.importandroid.app.PendingIntent;012.importandroid.app.Service;013.importandroid.content.Intent;014.importandroid.media.MediaPlayer;015.importandroid.media.MediaPlayer.OnCompletionListener;016.importandroid.media.MediaPlayer.OnPreparedListener;017.importandroid.os.Handler;018.importandroid.os.IBinder;019.importandroid.os.Message;020.importandroid.widget.Toast;021.022.publicclassPlayMusicServiceextendsService {023.privateMediaPlayer mediaPlayer;024.// 设置Seebar最大进度025.privatestaticfinalintSET_SEEKBAR_MAX =3;026.// 刷新SeekBar进度027.privatestaticfinalintUPDATE_PROGRESS =1;028.// 加载数据029.privatestaticfinalintLOADING_DATA =2;030.031.// 通知管理032.privateNotificationManager notificationManager;033.// 通知034.privateNotification notification;035.036.privateIntent intent;037.038.@Override039.publicIBinder onBind(Intent intent) {040.returnnull;041.}042.043.@SuppressLint("ShowToast")044.@Override045.publicintonStartCommand(Intent intent,intflags,intstartId) {046.notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);047.048.if(intent.getAction().equals("play")) {// 如果是播放Action,就播放音乐049.try{050.Toast.makeText(getApplicationContext(),"开始播放",1000).show();051.playMusic(intent.getStringExtra("uri"));052.showNotification(intent.getStringExtra("title"));053.}catch(Exception e) {054.e.printStackTrace();055.}056.}elseif(intent.getAction().equals("changed")) {// 如果是拖动的Action,就跳至拖动的进度057.if(mediaPlayer !=null) {058.mediaPlayer.seekTo(intent.getIntExtra("seekbarprogress",0));059.}060.}elseif(intent.getAction().equals("clickplay")) {// 如果是播放/暂停Action,就执行相应的播放或者暂停061.Toast.makeText(getApplicationContext(),"播放被点击了",1000).show();062.if(mediaPlayer !=null) {063.// 如果音乐播放器正在播放064.if(mediaPlayer.isPlaying()) {065.// 那就暂停它066.mediaPlayer.pause();067.// 发送暂停广播给程序068.this.intent =newIntent("pause");069.sendBroadcast(this.intent);070.}else{071.// 否则就播放它072.mediaPlayer.start();073.// 发送播放广播074.this.intent =newIntent("setplay");075.sendBroadcast(this.intent);076.}077.}078.}elseif(intent.getAction().equals("loops")) {// 如果是loop循环Action,就把歌曲设置为循环播放079.Toast.makeText(getApplicationContext(),"循环被点击了",1000).show();080.if(mediaPlayer !=null) {081.// 如果音乐播放器正在循环082.if(mediaPlayer.isLooping()) {083.// 那就终止循环它084.mediaPlayer.setLooping(false);085.// 发送终止循环广播086.this.intent =newIntent("stoploop");087.sendBroadcast(this.intent);088.}else{089.// 否则就循环播放它090.mediaPlayer.setLooping(true);091.// 发送开始循环广播092.this.intent =newIntent("startloop");093.sendBroadcast(this.intent);094.}095.}096.}elseif(intent.getAction().equals("stopnotification")) {097.notificationManager.cancelAll();098.}099.100.returnsuper.onStartCommand(intent, flags, startId);101.}102.103.@Override104.publicvoidonDestroy() {105.super.onDestroy();106.handler.removeMessages(UPDATE_PROGRESS);107.mediaPlayer.stop();108.mediaPlayer.release();109.mediaPlayer =null;110.}111.112./**113.* 播放音乐114.*115.* @param path116.* @throws Exception117.*/118.privatevoidplayMusic(String path)throwsException {119.if(mediaPlayer ==null) {120.// 新建一个mediaPalyer对象121.mediaPlayer =newMediaPlayer();122.}123.// 使mediaPalyer进入Idle状态124.mediaPlayer.reset();125.// 设置数据源,使mediaPlayer进入Intialized状态126.mediaPlayer.setDataSource(path);127.// 准备播放128.mediaPlayer.prepareAsync();129.mediaPlayer.setOnPreparedListener(newOnPreparedListener() {130.131.@Override132.publicvoidonPrepared(MediaPlayer mp) {133.// 开始播放音乐134.mp.start();135.handler.sendEmptyMessage(SET_SEEKBAR_MAX);136.handler.sendEmptyMessage(UPDATE_PROGRESS);137.138.}139.});140.mediaPlayer.setOnCompletionListener(newOnCompletionListener() {141.142.@Override143.publicvoidonCompletion(MediaPlayer mp) {144.if(mp.isLooping()) {145.mp.start();146.}else{147.intent =newIntent("playNextSong");148.sendBroadcast(intent);149.}150.}151.});152.}153.154.privateHandler handler =newHandler() {155.@SuppressLint("HandlerLeak")156.publicvoidhandleMessage(Message msg) {157.switch(msg.what) {158.caseUPDATE_PROGRESS:159.// 设置最大当前播放进度160.intent =newIntent("seekbarprogress");161.intent.putExtra("seekbarprogress",162.mediaPlayer.getCurrentPosition());163.sendBroadcast(intent);164.// 需要随着播放设置165.handler.sendEmptyMessageDelayed(UPDATE_PROGRESS,1000);166.break;167.caseLOADING_DATA:168.// adapter.notifyDataSetInvalidated();169.break;170.caseSET_SEEKBAR_MAX:171.intent =newIntent("seekbarmaxprogress");172.intent.putExtra("seekbarmaxprogress", mediaPlayer.getDuration());173.sendBroadcast(intent);174.// 因为进度条只需要设置一次就够了,所以不需要反复发送Message;175.break;176.default:177.break;178.}179.};180.};181.182./**183.* 显示通知184.*185.*/186.privatevoidshowNotification(String title) {187.notification =newNotification(R.drawable.app_icon,"百度音乐",188.System.currentTimeMillis());189.190.notification.flags |= Notification.FLAG_NO_CLEAR;191.notification.flags |= Notification.FLAG_ONGOING_EVENT;192.193.Intent intent =newIntent(this, MainActivity.class);194.intent.setAction(Intent.ACTION_MAIN);195.intent.addCategory(Intent.CATEGORY_LAUNCHER);196.PendingIntent pendingIntent = PendingIntent.getActivity(this,0,197.intent,0);198.199.notification.setLatestEventInfo(this,"正在播放", title, pendingIntent);200.201.notificationManager.notify(1, notification);202.}203.}

AndroidManifest.xml代码

view sourceprint?01.<!--?xml version="1.0" encoding="utf-8"?-->02.<manifestandroid:versioncode="1"android:versionname="1.0"package="com.siyehuazhilian.musicplay"xmlns:android="/apk/res/android">03.04.<uses-sdkandroid:minsdkversion="8"android:targetsdkversion="18">05.06.<uses-permissionandroid:name="android.permission.VIBRATE">07.08.<applicationandroid:allowbackup="true"android:icon="@drawable/app_icon"android:label="@string/app_name"android:theme="@android:style/Theme.Light.NoTitleBar">09.<activityandroid:label="@string/app_name"android:name="com.siyehuazhilian.musicplay.MainActivity">10.<intent-filter>11.<actionandroid:name="android.intent.action.MAIN">12.13.<categoryandroid:name="android.intent.category.LAUNCHER">14.</category></action></intent-filter>15.<intent-filter>16.<actionandroid:name="android.intent.action.VIEW">17.18.<categoryandroid:name="android.intent.category.DEFAULT">19.20.<dataandroid:mimetype="audio/*">21.</data></category></action></intent-filter>22.</activity>23.24.<serviceandroid:name="com.siyehuazhilian.service.PlayMusicService">25.<intent-filter>26.<actionandroid:name="play">27.<actionandroid:name="changed">28.<actionandroid:name="clickplay">29.<actionandroid:name="loops">30.<actionandroid:name="stopnotification">31.</action></action></action></action></action></intent-filter>32.</service>33.</application>34.35.</uses-permission></uses-sdk></manifest>

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。