Android Widget 简单例程(mp3播放)

来源:互联网 发布:小米净化器2 重置网络 编辑:程序博客网 时间:2024/06/04 19:19

 

如图所示:完成一个音乐播放器的小窗口Widget,可用AppWidgetProvider实现。

 

点击左边的icon跳转进入上面的播放界面,同时可以通过点击widget来控制播放/暂停。下面显示当前播放进度。

关于AppWidgetProvider可参考这篇文章:

http://blog.csdn.net/coolszy/article/details/7028531

主要代码:

MusicPlayerWidgetProvider.java

package com.lau.musicplayer.widget;import android.app.PendingIntent;import android.appwidget.AppWidgetManager;import android.appwidget.AppWidgetProvider;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.util.Log;import android.widget.RemoteViews;import com.lau.musicplayer.MusicPlayerActivity;import com.lau.musicplayer.R;import com.lau.musicplayer.util.Util;public class MusicPlayerWidgetProvider extends AppWidgetProvider {private static final String ACTION_UPDATE_WIDGET = "com.lau.musicplayer.UPDATE_WIDGET";private static final String ACTION_PAUSE_PLAY = "com.lau.musicplayer.PAUSE_PLAY";private static final String ACTION_DESTROY = "com.lau.musicplayer.DESTROY";@Overridepublic void onDeleted(Context context, int[] appWidgetIds) {Log.d("DEBUG", "onDeleted");super.onDeleted(context, appWidgetIds);}@Overridepublic void onDisabled(Context context) {Log.d("DEBUG", "onDisabled");super.onDisabled(context);}@Overridepublic void onEnabled(Context context) {Log.d("DEBUG", "onEnabled");super.onEnabled(context);}@Overridepublic void onReceive(Context context, Intent intent) {super.onReceive(context, intent);Log.d("DEBUG", "widget.onReceive(" + intent.getAction() + ")");RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.music_player_widget_provider);Intent iMusicPlayer = new Intent();iMusicPlayer.setClass(context, MusicPlayerActivity.class);//    iMusicPlayer.setClassName(context.getPackageName(), "com.lau.musicplayer.MusicPlayerActivity");PendingIntent piMusicPlayer = PendingIntent.getActivity(context, 0, iMusicPlayer, PendingIntent.FLAG_UPDATE_CURRENT);views.setOnClickPendingIntent(R.id.music_player_widget_icon, piMusicPlayer);if(ACTION_DESTROY.equals(intent.getAction())) {        views.setTextViewText(R.id.music_player_widget_time, context.getResources().getString(R.string.music_player));    views.setImageViewResource(R.id.music_player_widget_playpause, R.drawable.media_player_play_button);} else if(ACTION_UPDATE_WIDGET.equals(intent.getAction())) {        int time = intent.getIntExtra("time", 0);        int length = intent.getIntExtra("length", 0);        boolean isPlaying = intent.getBooleanExtra("isPlaying", false);        views.setTextViewText(R.id.music_player_widget_time, Util.millisToString(time) + " / " + Util.millisToString(length));        if(isPlaying) {        views.setImageViewResource(R.id.music_player_widget_playpause, R.drawable.media_player_pause_button);        } else {        views.setImageViewResource(R.id.music_player_widget_playpause, R.drawable.media_player_play_button);        }        Intent iPlayPause = new Intent(ACTION_PAUSE_PLAY);        PendingIntent piPlayPause = PendingIntent.getBroadcast(context, 0, iPlayPause, PendingIntent.FLAG_UPDATE_CURRENT);        views.setOnClickPendingIntent(R.id.music_player_widget_playpause, piPlayPause);        }ComponentName widget = new ComponentName(context, MusicPlayerWidgetProvider.class);AppWidgetManager widgetManager = AppWidgetManager.getInstance(context);widgetManager.updateAppWidget(widget, views);}@Overridepublic void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {Log.d("DEBUG", "onUpdate");super.onUpdate(context, appWidgetManager, appWidgetIds);}}

 

AudioService.java

package com.lau.musicplayer;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.media.MediaPlayer;import android.media.MediaPlayer.OnCompletionListener;import android.os.Handler;import android.os.IBinder;import android.os.Message;import android.os.RemoteException;import android.util.Log;import com.lau.musicplayer.interfaces.IAudioService;import com.lau.musicplayer.widget.MusicPlayerWidgetProvider;public class AudioService extends Service {private static final String PATH = "/mnt/sdcard/test.mp3";private static final int MSG_UPDATE_WIDGET = 1;private MediaPlayer mediaPlayer;private static final String ACTION_UPDATE_WIDGET = "com.lau.musicplayer.UPDATE_WIDGET";private static final String ACTION_PAUSE_PLAY = "com.lau.musicplayer.PAUSE_PLAY";@Overridepublic IBinder onBind(Intent intent) {Log.d("DEBUG", "AudioService onBind");IntentFilter filter = new IntentFilter();filter.addAction(ACTION_PAUSE_PLAY);registerReceiver(broadcastReceiver, filter);return mInterface;}@Overridepublic void onDestroy() {Log.d("DEBUG", "AudioService onDestroy");super.onDestroy();}private static final String ACTION_DESTROY = "com.lau.musicplayer.DESTROY";@Overridepublic boolean onUnbind(Intent intent) {Log.d("DEBUG", "AudioService onUnbind");if(mediaPlayer != null) {mediaPlayer.release();}mHandler.removeMessages(MSG_UPDATE_WIDGET);unregisterReceiver(broadcastReceiver);Intent i = new Intent();i.setClass(this, MusicPlayerWidgetProvider.class);i.setAction(ACTION_DESTROY);sendBroadcast(i);return super.onUnbind(intent);}private Handler mHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);if(msg.what == MSG_UPDATE_WIDGET) {updateWidget(AudioService.this);mHandler.sendEmptyMessageDelayed(MSG_UPDATE_WIDGET, 1000);}}};private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {Log.d("DEBUG", "ACTION_PAUSE_PLAY: " + intent.getAction());if(ACTION_PAUSE_PLAY.equals(intent.getAction())) {if(isPlay()) {AudioService.this.pause();} else {AudioService.this.play();}}}};private void updateWidget(Context context) {Intent intent = new Intent();intent.setClass(this, MusicPlayerWidgetProvider.class);intent.setAction(ACTION_UPDATE_WIDGET);intent.putExtra("time", mediaPlayer.getCurrentPosition());intent.putExtra("length", mediaPlayer.getDuration());intent.putExtra("isPlaying", isPlay());sendBroadcast(intent);}IAudioService.Stub mInterface = new IAudioService.Stub() {@Overridepublic void play() throws RemoteException {AudioService.this.play();}@Overridepublic void pause() throws RemoteException {AudioService.this.pause();}@Overridepublic int getTime() throws RemoteException {if(mediaPlayer != null) {return mediaPlayer.getCurrentPosition();}return 0;}@Overridepublic int getLength() throws RemoteException {if(mediaPlayer != null) {return mediaPlayer.getDuration();}return 0;}@Overridepublic boolean isPlay() throws RemoteException {return AudioService.this.isPlay();}@Overridepublic void seekTo(int progress) throws RemoteException {if(mediaPlayer != null) {mediaPlayer.seekTo(progress);}}};private boolean isPlay() {if(mediaPlayer != null && mediaPlayer.isPlaying()) {return true;}return false;}private void play() {if(mediaPlayer == null) {try {mediaPlayer = new MediaPlayer();mediaPlayer.reset();mediaPlayer.setDataSource(PATH);mediaPlayer.prepare();mediaPlayer.start();mediaPlayer.setOnCompletionListener(new OnCompletionListener() {@Overridepublic void onCompletion(MediaPlayer mp) {try {mediaPlayer.reset();mediaPlayer.setDataSource(PATH);mediaPlayer.prepare();mediaPlayer.start();} catch (IllegalArgumentException e) {e.printStackTrace();} catch (SecurityException e) {e.printStackTrace();} catch (IllegalStateException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}});} catch (IllegalArgumentException e) {e.printStackTrace();} catch (SecurityException e) {e.printStackTrace();} catch (IllegalStateException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}} else {mediaPlayer.start();}mHandler.sendEmptyMessageDelayed(MSG_UPDATE_WIDGET, 1000);updateWidget(this);}private void pause() {if(mediaPlayer != null && mediaPlayer.isPlaying()) {mediaPlayer.pause();}mHandler.removeMessages(MSG_UPDATE_WIDGET);updateWidget(this);}}


 源码下载

http://download.csdn.net/detail/laukaka/4702752

 

原创粉丝点击