新手写musicwidget

简单代码书写过程,先框架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");
    }
}


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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值