接上篇 新手学写music widget(可以显示歌曲名称以及专辑图片) 源码附最后

来源:互联网 发布:手机代驾软件 编辑:程序博客网 时间:2024/06/05 09:07
Cursor mAudioCursor = this.getContentResolver().query(
                MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null,
                MediaStore.Audio.AudioColumns.TITLE);

通过上述方法后 我们可以得到歌曲的相关信息 例如
int indexTitle = mAudioCursor
                    .getColumnIndex(MediaStore.Audio.AudioColumns.TITLE);// 歌名
int indexARTIST = mAudioCursor
                    .getColumnIndex(MediaStore.Audio.AudioColumns.ARTIST);// 艺术家

我们播放歌曲最重要的是要取得歌曲路径 可以用下方法
int indexPATH = mAudioCursor
                    .getColumnIndex(MediaStore.Audio.AudioColumns.DATA);// 歌曲路径


因为我们取得专辑图片后 要在指定的区域显示 所以涉及图片的叠加合成处理 具体处理见代码吧


MusicService.java

package com.shop.bluemusicappwidget;import java.io.File;import java.io.IOException;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import com.shop.bluemusicappwidget.R;import android.R.string;import android.app.Service;import android.content.BroadcastReceiver;import android.content.ContentResolver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.database.Cursor;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.media.MediaPlayer;import android.os.IBinder;import android.provider.MediaStore;import android.util.Log;public class MusicService extends Service {    private MediaPlayer player;    private int currindex = 0;    private BroadcastReceiver receiver;    List<Map<String, Object>> mListData;    static Bitmap bitmapxx;    // private static Bitmap bitmap;    @Override    public void onCreate() {        super.onCreate();        Log.v("shopping", "music service create");    }    @Override    public void onStart(Intent intent, int startId) {        super.onStart(intent, startId);        player = new MediaPlayer();        Log.v("shopping", "loading music");        getAllMusicInfo();        Log.v("shopping", "music loaded !");        try {            player.setDataSource(getCurindPath(currindex));            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) {                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 getAllMusicInfo() {        Cursor mAudioCursor = this.getContentResolver().query(                MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null,                MediaStore.Audio.AudioColumns.TITLE);        mListData = new ArrayList<Map<String, Object>>();        for (int i = 0; i < mAudioCursor.getCount(); i++) {            mAudioCursor.moveToNext();            // 找到歌曲标题和总时间对应的列索引            int indexTitle = mAudioCursor                    .getColumnIndex(MediaStore.Audio.AudioColumns.TITLE);// 歌名            int indexARTIST = mAudioCursor                    .getColumnIndex(MediaStore.Audio.AudioColumns.ARTIST);// 艺术家            int indexALBUM = mAudioCursor                    .getColumnIndex(MediaStore.Audio.AudioColumns.ALBUM);// 专辑            int indexPATH = mAudioCursor                    .getColumnIndex(MediaStore.Audio.AudioColumns.DATA);// 歌曲路径            int indexALBUMKEY = mAudioCursor                    .getColumnIndex(MediaStore.Audio.AudioColumns.ALBUM_KEY);// 歌曲专辑            String strTitle = mAudioCursor.getString(indexTitle);            String strARTIST = mAudioCursor.getString(indexARTIST);            String strALBUM = mAudioCursor.getString(indexALBUM);            String strPATH = mAudioCursor.getString(indexPATH);            String strALBUMPATH = mAudioCursor.getString(indexALBUMKEY);            String[] argArr = { strALBUMPATH };            ContentResolver albumResolver = this.getContentResolver();            Cursor albumCursor = albumResolver.query(                    MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, null,                    MediaStore.Audio.AudioColumns.ALBUM_KEY + " = ?", argArr,                    null);            HashMap<String, Object> nowMap = new HashMap<String, Object>();            nowMap.put("SongTitle", strTitle);            nowMap.put("SongArtist", strARTIST);            nowMap.put("SongAlbum", strALBUM);            nowMap.put("SongPath", strPATH);            Log.v("shopping", "SongTitle = " + strTitle);            if (null != albumCursor && albumCursor.getCount() > 0) {                albumCursor.moveToFirst();                int albumArtIndex = albumCursor                        .getColumnIndex(MediaStore.Audio.AlbumColumns.ALBUM_ART);                String musicAlbumArtPath = albumCursor.getString(albumArtIndex);                if (null != musicAlbumArtPath && !"".equals(musicAlbumArtPath)) {                    Bitmap bitmap = BitmapFactory.decodeFile(musicAlbumArtPath);                    Log.v("shopping", "musicAlbumArtPath = "                            + musicAlbumArtPath);                    //这个地方还做判断 是因为在2.3机子上实验有问题 4.0上是可以的                    if (bitmap != null) {                        nowMap.put("SongAlbumImage", bitmap);                    } else {                        nowMap.put("SongAlbumImage", BitmapFactory                                .decodeResource(getResources(),                                        R.drawable.albumart_mp_unknown));                    }                } else {                    Log.v("shopping", "SongAlbumImage11111111");                    nowMap.put("SongAlbumImage", BitmapFactory.decodeResource(                            getResources(), R.drawable.albumart_mp_unknown));                }            } else {                // 没有专辑定义,给默认图片                Log.v("shopping", "SongAlbumImage22222222222");                nowMap.put("SongAlbumImage", BitmapFactory.decodeResource(                        getResources(), R.drawable.albumart_mp_unknown));            }            mListData.add(nowMap);        }        Log.v("shopping", "mListDataSize = " + mListData.size());        Log.v("shopping", "mListData = " + mListData);    }    public String getCurindName(int currindex) {        String songName = (String) mListData.get(currindex).get("SongTitle");        return songName;    }    public String getCurindArtist(int currindex) {        String songArtist = (String) mListData.get(currindex).get("SongArtist");        return songArtist;    }    public String getCurindPath(int currindex) {        String songPath = (String) mListData.get(currindex).get("SongPath");        return songPath;    }    public Bitmap getCurindAlbumImageBm(int currindex) {        Bitmap SongAlbumBitmap = (Bitmap) mListData.get(currindex).get(                "SongAlbumImage");        Log.v("shopping2", "SongAlbumBitmap = " + SongAlbumBitmap);        return SongAlbumBitmap;    }    public void playNext() {        if (currindex < mListData.size() - 1) {            currindex++;        } else if (currindex == mListData.size() - 1) {            currindex = 0;        }        play();    }    public void playPrevious() {        if (currindex == 0) {            currindex = mListData.size() - 1;        } else if (currindex > 0) {            currindex--;        }        play();    }    public void play() {        Log.v("shopping", "music " + currindex);        try {            player.reset();            player.setDataSource(getCurindPath(currindex));            player.prepare();            player.start();            sendPlay();        } catch (IllegalArgumentException e) {            e.printStackTrace();        } catch (IllegalStateException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }    }    @Override    public void onDestroy() {        player.stop();        player.release();        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");        try {            sendTitle();        } catch (Exception e) {        }        try {            sendBitmap();        } catch (Exception e) {        }    }    public void sendPause() {        Intent play = new Intent("com.shop.bluemusicappwidget.pause");        sendBroadcast(play);        Log.v("shopping", "sendBroadcast---pause");    }    /**     * 发送歌曲标题到widget     */    public void sendTitle() {        Log.v("shopping", "sendTitle");        String title = "";        title = getCurindName(currindex) + " - " + getCurindArtist(currindex);        Log.v("shopping", "title = " + title);        Intent i = new Intent("com.shop.bluemusicappwidget.title");        i.putExtra(Intent.EXTRA_TEXT, title);        sendBroadcast(i);    }    public void sendBitmap() {        Log.v("shopping", "sendBitmap");        bitmapxx = getCurindAlbumImageBm(currindex);        Intent i = new Intent("com.shop.bluemusicappwidget.bitmap");        sendBroadcast(i);    }}

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.graphics.Bitmap;import android.graphics.Bitmap.Config;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.util.Log;import android.widget.RemoteViews;import com.shop.bluemusicappwidget.R;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);        } else if (action.equals("com.shop.bluemusicappwidget.title")) {            Log.v("shopping", "appwidget_music_title");            views.setTextViewText(R.id.artist,                    intent.getStringExtra(Intent.EXTRA_TEXT));        } else if (action.equals("com.shop.bluemusicappwidget.bitmap")) {            Log.v("shopping", "appwidget_music_bitmap");            if (MusicService.bitmapxx != null) {                Log.v("shopping3", "bitmapxx != null");                Bitmap bitmap = getBlueCornerBitmap(context,                        MusicService.bitmapxx);                views.setImageViewBitmap(R.id.album_border, bitmap);            }        }        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);    }    public Bitmap getBlueCornerBitmap(Context context, Bitmap bitmap) {        // bitmap = bitmapZoomByScale(bitmap, 0.5, 0.5);        // bitmap = rotate(bitmap, -45);        final Bitmap maskBitmap;        maskBitmap = BitmapFactory.decodeResource(context.getResources(),                R.drawable.pip_3_frame);        int w = maskBitmap.getWidth();        int h = maskBitmap.getHeight();        bitmap = Bitmap.createScaledBitmap(bitmap, w, h, false);        // if(frameBitmap == null || frameBitmap.isRecycled() && resIds[0] !=        // -1){        // frameBitmap = BitmapFactory.decodeResource(context.getResources(),        // resIds[0]);        // }        Bitmap output = Bitmap.createBitmap(w, h, Config.ARGB_8888);        Canvas canvas = new Canvas(output);        int[] picPixels = new int[w * h];        int[] maskPixels = new int[w * h];        bitmap.getPixels(picPixels, 0, w, 0, 0, w, h);        maskBitmap.getPixels(maskPixels, 0, w, 0, 0, w, h);        for (int i = 0; i < maskPixels.length; i++) {            if (maskPixels[i] == 0xff000000) {                picPixels[i] = 0;            } else if (maskPixels[i] == 0) {                // donothing            } else {                // 把mask的a通道应用与picBitmap                maskPixels[i] &= 0xff000000;                maskPixels[i] = 0xff000000 - maskPixels[i];                picPixels[i] &= 0x00ffffff;                picPixels[i] |= maskPixels[i];            }        }        // 生成前置图片添加蒙板后的bitmap:resultBitmap        output.setPixels(picPixels, 0, w, 0, 0, w, h);        canvas.drawBitmap(output, w, h, null);        return output;    }}


效果图



源码下载:点击打开链接


原创粉丝点击