新手写musicwidget

来源:互联网 发布:北京知行 pt 编辑:程序博客网 时间:2024/04/27 23:44

简单代码书写过程,先框架BlueMusicAppWidgetProvider.java和文件MusicService.java
接着AndroidManifest.xml其中android:resource="@xml/bluemusic_appwidget_info"
接着res下新建目录xml里面放bluemusic_appwidget_info.xml文件其中调用bluemusic_widget.xml
接着就该写bluemusic_widget.xml了
接着要写以及完善BlueMusicAppWidgetProvider.java和MusicService.java了

 

流程小结

当把小组件musicwidget拖到待机界面时,在AndroidManifest.xml中注册的receiver(BlueMusicAppWidgetProvider)
被执行,先执行其中的onReceive接着执行onEnabled,而在onEnabled中我们有通过
new Intent(context, MusicService.class);
context.startService(intent);
从而启动了MusicService(此在AndroidManifest.xml注册为service).

接着在BlueMusicAppWidgetProvider的onUpdate中把ImageButton与广播消息联系起来(例如control_play---pplay---iplay),
可以理解为当按下play键(图)时,就发广播(com.shop.bluemusicappwidget.playorpause),而在MusicService接收到该广播并进行
相关的处理.

代码中对play和pause的处理是MusicService发送广播而BlueMusicAppWidgetProvider接收到此类广播对按键图做变化显示,而此处的
广播内容均是在AndroidManifest.xml中注册的(<action android:name="com.shop.bluemusicappwidget.play"/>)

 

看图

 

 

 

BlueMusicAppWidgetProvider.java文件

 

package com.shop.bluemusicappwidget;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;public class BlueMusicAppWidgetProvider extends AppWidgetProvider {    @Override    public void onReceive(Context context, Intent intent) {        super.onReceive(context, intent);        String action = intent.getAction();        RemoteViews views = new RemoteViews(context.getPackageName(),                R.layout.bluemusic_widget);        Log.v("shopping", "onReceive");        if (action.equals("com.shop.bluemusicappwidget.play")) {            Log.v("shopping", "appwidget_music_pause");            views.setImageViewResource(R.id.control_play,                    R.drawable.appwidget_music_pause);        } else if (action.equals("com.shop.bluemusicappwidget.pause")) {            Log.v("shopping", "appwidget_music_play");            views.setImageViewResource(R.id.control_play,                    R.drawable.appwidget_music_play);        }        AppWidgetManager mgr = AppWidgetManager.getInstance(context);        mgr.updateAppWidget(new ComponentName(context,                BlueMusicAppWidgetProvider.class), views);    }    @Override    public void onUpdate(Context context, AppWidgetManager appWidgetManager,            int[] appWidgetIds) {        super.onUpdate(context, appWidgetManager, appWidgetIds);        Log.v("shopping", "onUpdate");        RemoteViews views = new RemoteViews(context.getPackageName(),                R.layout.bluemusic_widget);        Intent inext = new Intent("com.shop.bluemusicappwidget.next");        PendingIntent pnext = PendingIntent.getBroadcast(context, 0, inext, 0);        Intent iprevious = new Intent("com.shop.bluemusicappwidget.previous");        PendingIntent pprevious = PendingIntent.getBroadcast(context, 0,                iprevious, 0);        Intent iplay = new Intent("com.shop.bluemusicappwidget.playorpause");        PendingIntent pplay = PendingIntent.getBroadcast(context, 0, iplay, 0);        views.setOnClickPendingIntent(R.id.control_next, pnext);        views.setOnClickPendingIntent(R.id.control_pre, pprevious);        views.setOnClickPendingIntent(R.id.control_play, pplay);        AppWidgetManager mgr = AppWidgetManager.getInstance(context);        mgr.updateAppWidget(new ComponentName(context,                BlueMusicAppWidgetProvider.class), views);    }    @Override    public void onDisabled(Context context) {        super.onDisabled(context);        Log.v("shopping", "onDisabled");        Intent intent = new Intent(context, MusicService.class);        context.stopService(intent);    }    @Override    public void onEnabled(Context context) {        super.onEnabled(context);        Log.v("shopping", "onEnabled");        Intent intent = new Intent(context, MusicService.class);        context.startService(intent);    }}


MusicService.java

package com.shop.bluemusicappwidget;import java.io.File;import java.io.IOException;import java.util.ArrayList;import java.util.List;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.os.IBinder;import android.util.Log;public class MusicService extends Service {    private MediaPlayer player;    private List<String> data;    private int location = 0;    private BroadcastReceiver receiver;    @Override    public void onCreate() {        super.onCreate();        Log.v("shopping", "music service create");    }    @Override    public void onStart(Intent intent, int startId) {        super.onStart(intent, startId);        Log.v("shopping", "music service onStart");        player = new MediaPlayer();        data = new ArrayList<String>();        Log.v("shopping", "loading music");        File file = new File("/mnt/internal/music");        File[] files = file.listFiles();        for (File f : files) {            if (f.isFile() && f.getName().endsWith(".mp3")) {                data.add(f.getAbsolutePath());            }        }        Log.v("shopping", "music loaded !");        Log.v("shopping", "total music = !" + data.size());        try {            player.setDataSource(data.get(location));            player.prepare();        } catch (IllegalArgumentException e1) {            e1.printStackTrace();        } catch (IllegalStateException e1) {            e1.printStackTrace();        } catch (IOException e1) {            e1.printStackTrace();        }        receiver = new BroadcastReceiver() {            @Override            public void onReceive(Context context, Intent intent) {                Log.v("shopping", "music service BroadcastReceiver");                String action = intent.getAction();                if (action.equals("com.shop.bluemusicappwidget.playorpause")) {                    if (!player.isPlaying()) {                        try {                            player.start();                            sendPlay();                        } catch (IllegalStateException e) {                            e.printStackTrace();                        }                    } else {                        player.pause();                        sendPause();                    }                } else if (action                        .equals("com.shop.bluemusicappwidget.next")) {                    playNext();                } else if (action                        .equals("com.shop.bluemusicappwidget.previous")) {                    playPrevious();                }            }        };        IntentFilter filter = new IntentFilter();        filter.addAction("com.shop.bluemusicappwidget.next");        filter.addAction("com.shop.bluemusicappwidget.playorpause");        filter.addAction("com.shop.bluemusicappwidget.previous");        registerReceiver(receiver, filter);    }    public void playNext() {        if (location < data.size() - 1) {            location++;        } else if (location == data.size() - 1) {            location = 0;        }        play();    }    public void playPrevious() {        if (location == 0) {            location = data.size() - 1;        } else if (location > 0) {            location--;        }        play();    }    public void play() {        Log.v("shopping", "music " + location);        try {            player.reset();            player.setDataSource(data.get(location));            player.prepare();            player.start();            sendPlay();        } catch (IllegalArgumentException e) {            e.printStackTrace();        } catch (IllegalStateException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }    }    @Override    public void onDestroy() {        unregisterReceiver(receiver);        super.onDestroy();    }    @Override    public IBinder onBind(Intent intent) {        return null;    }    /**     * 发送播放通知,以便widget改变图标样式     */    public void sendPlay() {        Intent play = new Intent("com.shop.bluemusicappwidget.play");        sendBroadcast(play);        Log.v("shopping", "sendBroadcast---play");    }    public void sendPause() {        Intent play = new Intent("com.shop.bluemusicappwidget.pause");        sendBroadcast(play);        Log.v("shopping", "sendBroadcast---pause");    }}


源码工程下载:点击打开链接