您的位置:首页 > 移动开发 > Android开发

Android Widget 简单例程(mp3播放)

2012-10-30 15:55 363 查看




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



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

关于AppWidgetProvider可参考这篇文章:

/article/1456494.html

主要代码:

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";

@Override
public void onDeleted(Context context, int[] appWidgetIds) {
Log.d("DEBUG", "onDeleted");
super.onDeleted(context, appWidgetIds);
}

@Override
public void onDisabled(Context context) {
Log.d("DEBUG", "onDisabled");
super.onDisabled(context);
}

@Override
public void onEnabled(Context context) {
Log.d("DEBUG", "onEnabled");
super.onEnabled(context);
}

@Override
public 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);
}

@Override
public 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";

@Override
public IBinder onBind(Intent intent) {
Log.d("DEBUG", "AudioService onBind");
IntentFilter filter = new IntentFilter();
filter.addAction(ACTION_PAUSE_PLAY);
registerReceiver(broadcastReceiver, filter);
return mInterface;
}

@Override
public void onDestroy() {
Log.d("DEBUG", "AudioService onDestroy");
super.onDestroy();
}

private static final String ACTION_DESTROY = "com.lau.musicplayer.DESTROY";

@Override
public 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() {
@Override
public 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() {
@Override
public 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() {
@Override
public void play() throws RemoteException {
AudioService.this.play();
}

@Override
public void pause() throws RemoteException {
AudioService.this.pause();
}

@Override
public int getTime() throws RemoteException {
if(mediaPlayer != null) {
return mediaPlayer.getCurrentPosition();
}
return 0;
}

@Override
public int getLength() throws RemoteException {
if(mediaPlayer != null) {
return mediaPlayer.getDuration();
}
return 0;
}

@Override
public boolean isPlay() throws RemoteException {
return AudioService.this.isPlay();
}

@Override
public 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() {
@Override
public 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: