Android小程序实现音乐播放列表

yizhihongxing

Android小程序实现音乐播放列表攻略

在Android小程序中实现音乐播放列表,需要使用到以下知识点:

  • RecyclerView控件展示列表
  • Service组件进行音乐播放
  • Notification通知栏控制播放状态

下面详细讲解实现的完整攻略。

实现步骤

  1. 设计音乐列表的布局文件

在布局文件中,使用RecyclerView控件展示音乐列表,用TextView显示音乐名称和歌手信息。

示例代码:

<?xml version="1.0" encoding="utf-8"?>
<androidx.recyclerview.widget.RecyclerView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/playlist_recyclerview"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
  1. 实现音乐列表的适配器

在适配器中,根据数据源展示每一条音乐列表项。同时,通过onClick()方法监听用户点击列表项的事件。

示例代码:

public class PlaylistAdapter extends RecyclerView.Adapter<PlaylistAdapter.ViewHolder> {

    private List<Song> mSongList;
    private OnItemClickListener mListener;

    public interface OnItemClickListener {
        void onItemClick(View view, int position);
    }

    public void setOnItemClickListener(OnItemClickListener listener) {
        mListener = listener;
    }

    static class ViewHolder extends RecyclerView.ViewHolder {
        TextView songName;
        TextView singer;

        public ViewHolder(@NonNull View itemView, final OnItemClickListener listener) {
            super(itemView);
            songName = itemView.findViewById(R.id.song_name);
            singer = itemView.findViewById(R.id.singer);

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (listener != null) {
                        int position = getAdapterPosition();
                        listener.onItemClick(v, position);
                    }
                }
            });
        }
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.playlist_item, parent, false);
        ViewHolder holder = new ViewHolder(view, mListener);
        return holder;
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        Song song = mSongList.get(position);
        holder.songName.setText(song.getSongName());
        holder.singer.setText(song.getSinger());
    }

    @Override
    public int getItemCount() {
        return mSongList.size();
    }

    public PlaylistAdapter(List<Song> songList) {
        mSongList = songList;
    }
}
  1. 创建音乐播放的Service组件

在Service组件中,在后台进行音乐播放,同时提供控制音乐播放状态的接口。使用MediaPlayer控件播放音乐。

示例代码:

public class MusicService extends Service implements MediaPlayer.OnCompletionListener {

    private final IBinder mBinder = new MusicBinder();
    private MediaPlayer mMediaPlayer;

    public class MusicBinder extends Binder {
        MusicService getService() {
            return MusicService.this;
        }
    }

    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        mMediaPlayer = MediaPlayer.create(this, R.raw.test_song);
        mMediaPlayer.setOnCompletionListener(this);
        return super.onStartCommand(intent, flags, startId);
    }

    public void play() {
        if (!mMediaPlayer.isPlaying()) {
            mMediaPlayer.start();
        }
    }

    public void pause() {
        if (mMediaPlayer.isPlaying()) {
            mMediaPlayer.pause();
        }
    }

    public void stop() {
        mMediaPlayer.stop();
        mMediaPlayer.release();
        mMediaPlayer = null;
    }

    @Override
    public void onCompletion(MediaPlayer mp) {
        stop();
    }

    @Override
    public void onDestroy() {
        stop();
        super.onDestroy();
    }
}
  1. 创建通知栏,并控制音乐播放状态

使用NotificationCompat.Builder创建通知栏,监听通知栏控件的点击事件,并在点击事件中控制音乐播放状态。

示例代码:

public class MusicNotification {
    private static final int NOTIFICATION_ID = 1;
    private static final String CHANNEL_ID = "CHANNEL_ID";

    private Context mContext;
    private NotificationManager mNotificationManager;
    private NotificationCompat.Builder mBuilder;

    public MusicNotification(Context context) {
        mContext = context;
        mNotificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
        createChannel();
        mBuilder = new NotificationCompat.Builder(mContext, CHANNEL_ID)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle("app name")
                .setContentText("song name")
                .setContentIntent(onNotificationClick())
                .addAction(onPauseButtonClick())
                .setAutoCancel(true)
                .setOngoing(false);
    }

    private void createChannel() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel channel = new NotificationChannel(
                    CHANNEL_ID,
                    "app name",
                    NotificationManager.IMPORTANCE_HIGH);
            channel.setDescription("notification description");
            mNotificationManager.createNotificationChannel(channel);
        }
    }

    private PendingIntent onNotificationClick() {
        Intent intent = new Intent(mContext, MainActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
        return PendingIntent.getActivity(mContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    }

    private NotificationCompat.Action onPauseButtonClick() {
        PendingIntent pausePendingIntent = createPendingIntent(Command.PAUSE);
        return new NotificationCompat.Action(
                android.R.drawable.ic_media_pause,
                "Pause",
                pausePendingIntent);
    }

    public void showNotification() {
        mBuilder.setOngoing(true);
        Notification notification = mBuilder.build();
        mNotificationManager.notify(NOTIFICATION_ID, notification);
    }

    public void hideNotification() {
        mBuilder.setOngoing(false);
        Notification notification = mBuilder.build();
        mNotificationManager.notify(NOTIFICATION_ID, notification);
    }

    private PendingIntent createPendingIntent(String command) {
        Intent intent = new Intent(MusicService.ACTION_MUSIC_COMMAND);
        intent.putExtra(MusicService.EXTRA_COMMAND, command);
        return PendingIntent.getService(mContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    }
}
  1. 在MainActivity中控制音乐播放

在MainActivity中,创建Service组件,准备音乐播放并展示通知栏。同时,通过RecyclerView的onItemClickListener()方法,监听用户的音乐选择事件。

示例代码:

public class MainActivity extends AppCompatActivity {
    private RecyclerView mRecyclerView;
    private PlaylistAdapter mAdapter;
    private MusicService mMusicService;
    private MusicNotification mMusicNotification;

    private ServiceConnection mServiceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            MusicService.MusicBinder binder = (MusicService.MusicBinder) service;
            mMusicService = binder.getService();
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mRecyclerView = findViewById(R.id.playlist_recyclerview);
        mAdapter = new PlaylistAdapter(createSongList());
        mRecyclerView.setAdapter(mAdapter);
        mAdapter.setOnItemClickListener(new PlaylistAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(View view, int position) {
                mMusicService.stop();
                mMusicService.play();
                updateMusicNotification();
            }
        });

        Intent intent = new Intent(this, MusicService.class);
        startService(intent);
        bindService(intent, mServiceConnection, BIND_AUTO_CREATE);

        mMusicNotification = new MusicNotification(this);
        mMusicNotification.showNotification();
    }

    private void updateMusicNotification() {
        mMusicNotification.showNotification(); //暂定以播放状态展示通知栏
    }

    private List<Song> createSongList() {
        List<Song> songList = new ArrayList<>();
        songList.add(new Song("song 1", "singer 1"));
        songList.add(new Song("song 2", "singer 2"));
        songList.add(new Song("song 3", "singer 3"));
        return songList;
    }

    @Override
    protected void onDestroy() {
        unbindService(mServiceConnection);
        mMusicNotification.hideNotification();
        super.onDestroy();
    }
}

以上就是实现Android小程序音乐播放列表的完整攻略。

示例说明:

  1. MainActivity中展示了三个音乐列表项,用户点击其中一个音乐列表项,便会播放该音乐,并且通过通知栏展示播放状态。用户再次点击通知栏,可控制音乐播放的暂停或继续播放。

  2. 在MusicService中,没有使用本地数据,只是简单地加载项目中的一首测试歌曲。若需要加载外部数据,则需要在代码中增加相关实现。

附录:

  • Song类属性包含歌曲名称和歌手信息。
public class Song {
    private String songName;
    private String singer;

    public String getSongName() {
        return songName;
    }

    public String getSinger() {
        return singer;
    }

    public Song(String songName, String singer) {
        this.songName = songName;
        this.singer = singer;
    }
}
  • Command类包含通知栏上的控制事件。
public class Command {
    public static final String PAUSE = "PAUSE";
    public static final String RESUME = "RESUME";
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android小程序实现音乐播放列表 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • 一次线上websocket返回400问题排查的实战记录

    以下是“一次线上websocket返回400问题排查的实战记录”的完整攻略: 问题描述 我们的网站中有一个websocket服务,用于向前端推送实时数据。最近我们收到了一些用户投诉说无法连接websocket服务,并返回了400错误。我们需要排查这个问题并解决它。 问题分析 websocket连接返回400错误一般有以下几种可能的原因: URL路径错误 跨域…

    Java 2023年5月19日
    00
  • 深入学习java8 中的CompletableFuture

    深入学习Java8中的CompletableFuture攻略 什么是CompletableFuture CompletableFuture是Java8中新增加的一个类,实现了Future的所有特性,并提供了强大的异步编程能力。CompletableFuture可以让你像写同步代码一样写异步代码,大幅度提高代码的可读性和可维护性。 CompletableFut…

    Java 2023年5月26日
    00
  • SSH框架网上商城项目第24战之Struts2中处理多个Model请求的方法

    下面将详细讲解“SSH框架网上商城项目第24战之Struts2中处理多个Model请求的方法”的完整攻略。 前言 在网上商城项目开发过程中,处理多个 Model 的请求是一个比较常见的需求。本文将详细说明在 Struts2 中如何处理多个 Model 的请求,并提供两个示例说明。 具体步骤 步骤一:定义 Action 类 在 Struts2 中,我们可以通过…

    Java 2023年5月26日
    00
  • Spring Security实现多次登录失败后账户锁定功能

    一、Spring Security实现多次登录失败后账户锁定功能的实现过程 配置登录失败处理器 在Spring Security的配置类中,通过实现 org.springframework.security.web.authentication.AuthenticationFailureHandler 接口,自定义一个登录失败处理器。 示例代码: @Conf…

    Java 2023年5月20日
    00
  • java IO流读取图片供前台显示代码分享

    下面是Java IO流读取图片供前台显示的完整攻略: 一、概述 在Java中,使用IO流读取图片供前台显示可以分为以下几个步骤: 使用Java IO流读取图片文件到内存中; 将读取到的图片字节流转换为Base64编码; 将Base64编码的图片数据返回给前台。 二、代码示例 以下是两条示例代码,可以供您参考: 使用FileInputStream和ByteAr…

    Java 2023年5月19日
    00
  • 详解Spring Boot实现日志记录 SLF4J

    详解Spring Boot实现日志记录 SLF4J 什么是SLF4J SLF4J是Simple Logging Facade for Java的缩写,它是一个Java基础框架,为各种不同的Java日志库提供了一个简洁的接口。 Spring Boot中如何使用SLF4J 在Spring Boot中,我们可以使用以下步骤引入SLF4J: 在pom.xml文件中添…

    Java 2023年5月19日
    00
  • ArrayList及HashMap的扩容规则讲解

    1. ArrayList的扩容规则 ArrayList 是 Java 自带的动态数组容器,支持自动扩容。当在 arrayList 中添加元素时,如果当前的数组容量已满,则需要进行扩容。ArrayList 的默认初始容量是 10,扩容因子是 1.5 倍。也就是说,在当前容量满载时,会将容量扩大到 1.5 倍。 下面是 ArrayList 的扩容规则: 当添加元…

    Java 2023年5月26日
    00
  • Java中jqGrid 学习笔记整理——进阶篇(二)

    让我来详细讲解一下“Java中jqGrid 学习笔记整理——进阶篇(二)”这篇文章的内容。 一、概述 这篇文章是介绍如何在Java web项目中使用jqGrid进行数据展示和交互的进阶篇。主要包括以下内容: jqGrid特性及概念解析; 如何使用Java代码动态生成jqGrid; 如何在jqGrid中使用自定义格式化函数; 如何使用jqGrid中的事件; 如…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部