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

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";
}
阅读剩余 85%

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

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

相关文章

  • 教你用eclipse连接mysql数据库

    下面我就为你讲解如何使用Eclipse连接MySQL数据库的完整攻略。 1. 准备工作 在开始之前,你需要进行以下准备工作: 安装Eclipse IDE 如果你还没有安装Eclipse,请先去Eclipse官网下载并安装Eclipse IDE。 安装MySQL数据库 如果你还没有安装MySQL数据库,请先去MySQL官网下载并安装MySQL数据库。 安装My…

    Java 2023年5月20日
    00
  • Java数据结构之队列的简单定义与使用方法

    Java数据结构之队列的简单定义与使用方法 什么是队列? 队列是一种特殊的线性表,它支持在表的前端(入队)插入元素,同时支持在表的后端(出队)删除元素。队列是先进先出(FIFO)的数据结构,即其和人们排队相一致,先来先服务。 在Java中,队列在java.util包中实现,具体类为java.util.Queue接口,它是一种典型的集合,继承了java.uti…

    Java 2023年5月26日
    00
  • Java Apache Commons报错“InstantiationException”的原因与解决方法

    当使用Java的Struts框架时,可能会遇到“ActionServletMappingException”错误。这个错误通常由以下原因之一起: ActionServlet配置错误:如果ActionServlet配置错误,则可能会出现此错误。在这种情况下,需要检查ActionServlet配置以解决此问题。 ActionServlet无效:如果ActionS…

    Java 2023年5月5日
    00
  • Java环境中MyBatis与Spring或Spring MVC框架的集成方法

    下面是关于“Java环境中MyBatis与Spring或Spring MVC框架的集成方法”的完整攻略,包含两个示例说明。 Java环境中MyBatis与Spring或Spring MVC框架的集成方法 在Java环境中,MyBatis与Spring或Spring MVC框架的集成非常常见。在本文中,我们将介绍如何将MyBatis与Spring或Spring…

    Java 2023年5月17日
    00
  • java-SSH2实现数据库和界面的分页

    下面是“java-SSH2实现数据库和界面的分页”的完整攻略: 准备工作 创建一个Web工程,并配置好SSH2框架。 在项目中引入MySQL的JDBC驱动包。 编写JSP页面,用于展示分页数据。 实现分页查询功能 第一步:编写DAO层代码 DAO层是负责与数据库进行交互的层级,我们将在该层实现查询数据的功能。 在DAO层中,首先要编写一个查询总记录数的方法,…

    Java 2023年5月20日
    00
  • JDBC数据库连接步骤解析

    JDBC是Java Database Connectivity的缩写,用于Java语言访问关系型数据库的API。下面就来详细讲解JDBC数据库连接步骤解析。 JDBC数据库连接步骤 加载数据库驱动:通过Class.forName()方法加载数据库驱动,例如加载mysql数据库驱动可以使用以下代码: Class.forName(“com.mysql.jdbc.…

    Java 2023年5月20日
    00
  • EJB 3.0 开发指南之定时服务

    EJB 3.0 开发指南之定时服务 什么是定时服务? 定时服务是一种可以按照预定时间自动执行的任务服务,可以定时发送邮件、清理垃圾数据等操作。在 Java EE 中,可以使用 EJB(Enterprise JavaBeans)实现定时任务。 实现定时服务的步骤 创建 EJB 在 Java EE 项目中,首先需要创建一个 EJB,这个 EJB 将被用来实现定时…

    Java 2023年6月15日
    00
  • 作为程序员必须掌握的Java虚拟机中的22个重难点(推荐0

    作为程序员必须掌握的Java虚拟机中的22个重难点攻略 Java虚拟机(JVM)是Java语言的核心,作为程序员必须深入了解JVM的原理和机制。本攻略介绍了JVM中的22个重难点,帮助程序员深入了解JVM并掌握JVM原理和调优技巧。 1. JVM 总论 JVM是Java的运行环境,它主要由类加载器、运行时数据区、执行引擎、本地接口、本地方法库和垃圾回收器组成…

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