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);// 歌曲路径
BlueMusicAppWidgetProvider.java
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;
}
}
效果图
源码下载:点击打开链接