universalMusicPlayer samples 代码学习

来源:互联网 发布:淘宝符咒 编辑:程序博客网 时间:2024/05/18 03:43

写在开始

本文希望对一个google提供的简单apk的学习,了解android app的框架,学习代码结构,以达到能写简单app的目的。

项目介绍

项目名称:universalMusicPlayer
项目描述: android 音频播放器
项目地址:https://github.com/googlesamples/android-UniversalMusicPlayer/

建立工程

File->import sample->Getting startted->universalMusicPlayer, 接着等下载完成,然后点finish即可

代码分析

代码 分为java代码和res资源文件。 java代码分为model、playback、ui、uitil、全局代码。res资源文件分为有 anim、animator、drawable、layout、menu、values、xml。

model 模块

model 主要是实现了一个 MusicProvider类,类实现的方法有:
MusicProvider : 类的构造函数
searchMusicBySongTitle :通过歌名查找歌曲
searchMusicByAlbum :通过专辑查找歌曲
searchMusicByArtist :通过艺术家查找歌曲
getMusic :通过歌曲id获取歌曲
updateMusicArt :添加歌曲
setFavorite :将歌曲设置为收藏
isFavorite :判断是否收藏的歌曲
retrieveMediaAsync :异步下载歌曲
buildListsByGenre :按照歌曲风格创建播放列表
retrieveMedia :下载歌曲
getChildren :获取歌曲列表

playback模块

playback模块定义一个接口playback播放 、 CastPlayback(网络播放?)类、LocalPlayback(本地播放)类和PlaybackManager(播放管理)类。

playback接口

开始 :void start()
停止 :void stop(boolean notifyListeners)
设置播放状态:void setState(int state);
获取播放状态: int getState();
是否连接:boolean isConnected();
是否播放: boolean isPlaying();
获取当前播放位置: int getCurrentStreamPosition();
设置当前播放位置:void setCurrentStreamPosition(int pos);
更新最后播放歌曲的位置: void updateLastKnownStreamPosition();
播放: void play(QueueItem item);
暂停: void pause();
位移: void seekTo(int position);
设置当前歌曲的ID: void setCurrentMediaId(String mediaId);
获取当前歌曲的ID: String getCurrentMediaId();
设置回调: void setCallback(Callback callback);
Callback接口:
完成时调用:void onCompletion();
播放状态改变时调用: void onPlaybackStatusChanged(int state);
错误发生时调用: void onError(String error);
设置当前歌曲ID: void setCurrentMediaId(String mediaId);

CastPlayback类

CastPlayBack 实现了 playback的接口。
构造函数: public CastPlayback(MusicProvider musicProvider)

LocalPlayback类

LocalPlayback不仅实现playback的接口,还实现了 AudioManager.OnAudioFocusChangeListener接口、 OnCompletionListener接口、
OnErrorListener接口、OnPreparedListener接口和OnSeekCompleteListener接口。

构造函数: public LocalPlayback(Context context, MusicProvider musicProvider)

AudioManager.OnAudioFocusChangeListener接口的实现:public void onAudioFocusChange(int focusChange)

OnCompletionListener接口的实现:public void onCompletion(MediaPlayer player)

OnErrorListener接口的实现:public boolean onError(MediaPlayer mp, int what, int extra)

OnPreparedListener接口的实现:public void onPrepared(MediaPlayer player)

OnSeekCompleteListener接口的实现:public void onSeekComplete(MediaPlayer mp)

PlaybackManager类

PlaybackManager类实现了 Playback中的 Callback接口 、定义私有类MediaSessionCallback、定义公有接口PlaybackServiceCallback。

构造函数: public PlaybackManager(PlaybackServiceCallback serviceCallback,
Resources resources, MusicProvider musicProvider, QueueManager queueManager, Playback playback)

处理播放请求:public void handlePlayRequest()
处理暂停请求: public void handlePauseRequest()
处理停止请求: public void handleStopRequest(String withError)
更新播放状态:public void updatePlaybackState(String error)
转换播放实例: public void switchToPlayback(Playback playback, boolean resumePlaying)

私有类MediaSessionCallback是MediaSessionCompat.Callback的子类,主要方法有:
onPlay、onSkipToQueueItem、onSeekTo、onPlayFromMediaId等。

公有接口PlaybackServiceCallback有定义了四个方法:onPlaybackStart、onNotificationRequired、onPlaybackStop、onPlaybackStateUpdated。

utils模块

utils类工具类里面包含了8个独立工具类, 分别是 图片相关的bitmapHelper,记录调试的LogHelper,网络的NetworkHelper,任务队列的QueueHelper,资源管理的ResourceHelper, 手表模式的WearHelper,车载模式的CarHelper,任务相关MediaID的MediaIDHelper。

bitmapHelper类

bitmap格式图片缩放下载的功能。
图片缩放:public static Bitmap scaleBitmap(Bitmap src, int maxWidth, int maxHeight)
流数据格式的图片缩放:public static Bitmap scaleBitmap(int scaleFactor, InputStream is)
获取流数据格式的图片大小:public static int findScaleFactor(int targetW, int targetH, InputStream is)
下载流数据格式的图片并缩放: public static Bitmap fetchAndRescaleBitmap(String uri, int width, int height)

CarHelper类

判断是否车载包:public static boolean isValidCarPackage(String packageName)
判断是否车载UI模式:public static boolean isCarUiMode(Context c)
设置slot保存标识: public static void setSlotReservationFlags(Bundle extras, boolean reservePlayingQueueSlot,
boolean reserveSkipToNextSlot, boolean reserveSkipToPrevSlot)

WearHelper类

与CarHelper类似,app安装在android手表设备上用到的一些接口:
判断是否是手表包: public static boolean isValidWearCompanionPackage(String packageName)
设置手表模式通用行为:public static void setShowCustomActionOnWear(Bundle customActionExtras, boolean showOnWear)
设置主题背景:public static void setUseBackgroundFromTheme(Bundle extras, boolean useBgFromTheme)
设置slot保存标识:public static void setSlotReservationFlags(Bundle extras, boolean reserveSkipToNextSlot,
boolean reserveSkipToPrevSlot)

LogHelper

输出调试信息的接口
生成log的TAG:public static String makeLogTag(Class cls)
verbose:public static void v(String tag, Object… messages)
debug : public static void d(String tag, Object… messages)
info :public static void i(String tag, Object… messages)
warn :public static void w(String tag, Object… messages)
warn :public static void w(String tag, Throwable t, Object… messages)
error :public static void e(String tag, Object… messages)
error :public static void e(String tag, Throwable t, Object… messages)
输出调试信息的实现:public static void log(String tag, int level, Throwable t, Object… messages)

MediaIDHelper类

工具类,用于相关任务的MediaID队列的操作
生成MediaID: public static String createMediaID(String musicID, String… categories)
从MedialD获取MusicID: public static String extractMusicIDFromMediaID(@NonNull String mediaID)
从MediaID获取分类: public static @NonNull String[] getHierarchy(@NonNull String mediaID)
从MedialD获取分类的值:public static String extractBrowseCategoryValueFromMediaID(@NonNull String mediaID)
MedialD是否可浏览:public static boolean isBrowseable(@NonNull String mediaID)
获取上级MediaID:public static String getParentMediaID(@NonNull String mediaID)

NetworkHelper类

只提供了一个检查网络是否连接的方法:public static boolean isOnline(Context context)

QueueHelper类

队列操作,playback模块中的QueueManager类有调用
获取播放队列:public static List

ResourceHelper类

提供了一个通用可重复用接口, 获取主题颜色public static int getThemeColor(Context context, int attribute, int defaultColor)。

其他模块

全局的代码有 AlbumArtCache类(AlbumArt缓存)、MediaNotificationManager(系统通知管理?)、MusicService类、PackageValidator类、UAMPApplication类、VoiceSearchParams类。

AlbumArtCache类

AlbumArt缓存类,提供网络下载的功能。调用本类接口的类有CardPresenter类、MediaNotificationManager类、PlaybackControlsFragment类、FullScreenPlayerActivity类等
构造函数: private AlbumArtCache()
下载图片:public Bitmap getBigImage(String artUrl)
下载图标:public Bitmap getIconImage(String artUrl)
下载请求:public void fetch(final String artUrl, final FetchListener listener)

内部抽象类public static abstract class FetchListener包含以下两个接口:
下载图片和图标:public abstract void onFetched(String artUrl, Bitmap bigImage, Bitmap iconImage);
错误处理:public void onError(String artUrl, Exception e)

PackageValidator类

读取有效证书: private Map

UAMPApplication类

UAMPApplication类 继承于adroid的 Application类,只重定义了 public void onCreate()接口。

VoiceSearchParams类

public final class VoiceSearchParams 表明该类是 常量类?无法被继承。该类功能是构造查找Voice的标准,
只被 QueueHelper类的getPlayingQueueFromSearch方法调用。
构造函数: public VoiceSearchParams(String query, Bundle extras)
类toString: public String toString()

MediaNotificationManager类

Media通知管理,继承于BroadcastReceiver类。引用本类接口的类:MusicService类
构造函数:public MediaNotificationManager(MusicService service) throws RemoteException
发送通知:public void startNotification()
停止通知:public void stopNotification()

重定义BroadcastReceiver类的onReceive接口:public void onReceive(Context context, Intent intent)

MusicService类

继承了MediaBrowserServiceCompat类,并实现PlaybackManager类的内部接口PlaybackServiceCallback。
MusicService类的接口多 被 PlaybackManager类所调用。

重定义的MediaBrowserServiceCompat的接口:
public void onCreate()
public int onStartCommand(Intent startIntent, int flags, int startId)
public void onDestroy()
public BrowserRoot onGetRoot(@NonNull String clientPackageName, int clientUid,Bundle rootHints)
public void onLoadChildren(@NonNull final String parentMediaId, @NonNull final Result

UI模块

模块包括两个抽象类ActionBarCastActivity和BaseActivity(ActionBarCastActivity的子类),
FullScreenPlayerActivity(ActionBarCastActivity的子类)、MusicPlayerActivity(BaseActivity的子类)、

0 0
原创粉丝点击