要开发一个Android App音乐播放器,需要掌握以下技能:
- Java基础知识
- Android App开发基础
- Android多媒体API
以下是详细步骤:
1. 建立Android项目
在Android Studio中新建一个项目,选择基本空白Activity。
2. 必备权限与依赖
在 AndroidManifest.xml 中增加以下必须权限:
```
```
在 build.gradle 文件中增加以下依赖库:
```
dependencies {
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support:recyclerview-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:2.0.0-beta2'
implementation 'com.android.support:cardview-v7:28.0.0'
implementation 'com.android.support:design:28.0.0'
implementation 'com.squareup.picasso:picasso:2.71828'
implementation 'com.google.android.exoplayer:exoplayer:2.9.6'
}
```
3. 定义数据模型
播放器需要一些特定的数据来管理歌曲,如歌曲标题、歌手、专辑封面以及歌曲文件的绝对路径。因此,需要建立一个数据模型类来存放这些数据。
```java
public class Song {
private long id;
private String title;
private String artist;
private String album;
private String artworkPath;
private String uri;
private int duration;
private int trackNumber;
private long albumId;
//... getter and setter
}
```
4. 实现音乐播放器
使用ExoPlayer作为音乐播放器。ExoPlayer是一款功能强大的多媒体播放器,可以在Android设备上播放本地音频和视频以及通过网络播放媒体资源。以下是ExoPlayer的初始化代码:
```java
private void initializePlayer() {
if (player == null) {
player = ExoPlayerFactory.newSimpleInstance(this);
player.addListener(this);
playerView.setPlayer(player);
MediaSource mediaSource = buildMediaSource(Uri.parse(song.getUri()));
player.prepare(mediaSource);
player.setPlayWhenReady(true);
}
}
private MediaSource buildMediaSource(Uri uri) {
DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(this, Util.getUserAgent(this, "MusicPlayer"));
return new ProgressiveMediaSource.Factory(dataSourceFactory).createMediaSource(uri);
}
```
5. 展示歌曲信息和播放控制
使用RecyclerView展示当前列表中的歌曲。在列表上添加点击事件,用于选择歌曲并开始播放。播放控制使用按钮,并在ExoPlayer的监听器中实现暂停/播放切换。
```java
playButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (player == null) {
initializePlayer();
} else {
if (player.getPlaybackState() == Player.STATE_READY) {
if (player.getPlayWhenReady()) {
player.setPlayWhenReady(false);
playButton.setImageResource(R.drawable.ic_play_arrow);
} else {
player.setPlayWhenReady(true);
playButton.setImageResource(R.drawable.ic_pause);
}
}
}
}
});
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView> adapterView, View view, int position, long id) {
song = songList.get(position);
titleTextView.setText(song.getTitle());
artistTextView.setText(song.getArtist());
if (player == null) {
initializePlayer();
} else {
player.stop();
MediaSource mediaSource = buildMediaSource(Uri.parse(song.getUri()));
player.prepare(mediaSource);
player.setPlayWhenReady(true);
playButton.setImageResource(R.drawable.ic_pause);
}
}
});
```
6. 添加歌曲列表
使用Android的MediaStore类访问设备上的音频文件,并在列表上显示歌曲信息。
```java
ContentResolver musicResolver = getContentResolver();
Uri musicUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
String selection = MediaStore.Audio.Media.IS_MUSIC + "!=0";
Cursor musicCursor = musicResolver.query(musicUri, null, selection, null, null);
if (musicCursor != null && musicCursor.moveToFirst()) {
do {
String title = musicCursor.getString(musicCursor.getColumnIndex(MediaStore.Audio.Media.TITLE));
String artist = musicCursor.getString(musicCursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));
long id = musicCursor.getLong(musicCursor.getColumnIndex(MediaStore.Audio.Media._ID));
String album = musicCursor.getString(musicCursor.getColumnIndex(MediaStore.Audio.Media.ALBUM));
int duration = musicCursor.getInt(musicCursor.getColumnIndex(MediaStore.Audio.Media.DURATION));
int trackNumber = musicCursor.getInt(musicCursor.getColumnIndex(MediaStore.Audio.Media.TRACK));
long albumId = musicCursor.getLong(musicCursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID));
String artworkPath = getAlbumArtworkPath(albumId);
String uri = musicCursor.getString(musicCursor.getColumnIndex(MediaStore.Audio.Media.DATA));
Song song = new Song(id, title, artist, album, artworkPath, uri, duration, trackNumber, albumId);
songList.add(song);
} while (musicCursor.moveToNext());
}
musicCursor.close();
```
7. 显示专辑封面
使用Picasso库可以加载专辑封面,并通过ImageView显示在UI中。
```java
Picasso.get().load(new File(artworkPath)).placeholder(R.drawable.placeholder).error(R.drawable.placeholder).into(artworkImageView);
```
以上是安卓app开发音乐播放器的大概流程,实际还需要进行一些代码优化、界面布局设计等方面的工作。