-
-
Notifications
You must be signed in to change notification settings - Fork 45
[ZH] 1.快速上手
jrfeng edited this page Oct 18, 2023
·
53 revisions
- 将以下代码添加到项目根目录中的
build.gradle
文件中:
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
dependencies {
implementation 'com.github.jrfeng.snow:player:1.2'
}
- 申请权限:
<!-- 用于启动前台 Service -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<!-- Android 14(API Level 34) -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" />
<!-- 用于后台播放 -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<!-- 可选:用于播放本地音乐 -->
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="32" />
<!-- 可选:用于播放网络音乐 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
注意!从 Android 6.0(API Level 23)
开始,需要在运行时动态申请存储器访问权限:"android.permission.READ_EXTERNAL_STORAGE"
。
- 创建 PlayerService
创建一个类并让其继承 snow.player.PlayerService
类,并且使用 @PersistenceId
注解对其进行标注。你不需要重写这个类的任何方法。
例:
@PersistenceId("MyPlayerService")
public MyPlayerService extends PlayerService {
}
@PersistenceId
注解用于为当前 PlayerService
设置一个持久化 ID
,该 ID
将用于 PlayerService
状态的持久化。如果你没有使用 @PersistenceId
注解设置持久化 ID
,则持久化 ID
默认为你的 PlayerService
的完整类名(例如 snow.demo.MyPlayerService
)。建议为你的 PlayerService
设置一个持久化 ID
,这样即使重命名 PlayerService
也不会导致状态丢失。
- 注册 PlayerService
<service
android:name="snow.demo.MyPlayerService"
android:exported="true"
android:foregroundServiceType="mediaPlayback">
<intent-filter>
<action android:name="android.media.browse.MediaBrowserService" />
</intent-filter>
</service>
<receiver android:name="androidx.media.session.MediaButtonReceiver" >
<intent-filter>
<action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
</receiver>
- 连接到
PlayerService
:
// 创建一个 PlayerClient 对象
PlayerClient playerClient = PlayerClient.newInstance(context, MyPlayerService.class);
// 连接到 PlayerService
playerClient.connect(new PlayerClient.OnConnectCallback() {
@Override
public void onConnected(boolean success) {
// DEBUG
Log.d("App", "connect: " + success);
}
});
- 创建一个播放列表
提示:下例中的播放链接可能已失效,如果已失效,建议开发者自行从其他地方获取播放链接并构建对应的 MusicItem 对象。
private Playlist createPlaylist() {
MusicItem song1 = new MusicItem.Builder()
.setTitle("太阳照常升起")
.setArtist("久石让")
.setAlbum("太阳照常升起 电影原声大碟")
.setDuration(224013)
.setUri("http://music.163.com/song/media/outer/url?id=441722")
.setIconUri("http://p2.music.126.net/drqGdK7zgW7B7IFl4lWpoQ==/109951163369835547.jpg")
.build();
MusicItem song2 = new MusicItem.Builder()
.setTitle("钢铁洪流进行曲")
.setArtist("李旭昊")
.setAlbum("国庆70周年阅兵BGM")
.setDuration(186154)
.setUri("http://music.163.com/song/media/outer/url?id=1394369908")
.setIconUri("http://p2.music.126.net/KnC_YJjnRTNvCF82_2leCg==/109951164930615683.jpg")
.build();
MusicItem song3 = new MusicItem.Builder()
.setTitle("国际歌-钢琴")
.setArtist("曹伟健")
.setAlbum("音迹")
.setDuration(141369)
.setUri("http://music.163.com/song/media/outer/url?id=1857796913")
.build();
MusicItem song4 = new MusicItem.Builder()
.setTitle("我爱你中国[Forbid Seek]")
.setDuration(136000)
// cross-protocol redirects
.setUri("https://music.163.com/song/media/outer/url?id=174451")
.setIconUri("http://p2.music.126.net/x6pVwc6ysKZ9S01jYlYiAw==/97856534887060.jpg")
// forbid seek
.setForbidSeek(true)
.build();
return new Playlist.Builder()
.append(song1)
.append(song2)
.append(song3)
.append(song4)
.build();
}
- 设置播放列表并播放音乐
// 创建播放列表
Playlist playlist = createPlaylist();
// 设置播放列表,并播放音乐
playerClient.setPlaylist(playlist, true);
End