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

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> 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>();
        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 nowMap = new HashMap();
            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;
    }
}


效果图

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


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


源码下载:点击打开链接


你可能感兴趣的:(Android)