Android 小项目之--Mini音乐播放器【简单版】

智能终端课程设计之安卓音乐播放器 智能终端课程设计之安卓音乐播放器 这里是一个最基本最简单的本地音乐播放器,应付课设基本就OK了。 课设题目要求 ======================================================== 题目九 音乐播放器 一、目的与要求 学会如何使用 MediaPlayer 等媒体播放组件。 2. 学会如何进行数据保存。 二、功能需求 音乐播放器主要的功能: 1. 播放列... 阅读详情

1.1. 什么是Open Core?

Open Core 是 Android 多媒体框架的核心,所有 Android 平台的音频、视频的 采用以及播放等操作,都是通过它来实现。

1.2. Open Core 的具体功能

1、多媒体文件的播放、下载,包括:3GPP,MPEG-4,AAC 和 MP3 containers。

2、流媒体文件的下载、实时播放,包括:3GPP,HTTP 和 RTSP/RTP。

3、动态视频和静态图像的编码、解码,例如:MPEG-4,H.263 和 AVC (H.264), JPEG。

4、语音编码格式:MP3,AAC,AAC+。

5、视频和图像格式:3GPP,MPEG-4 和 JPEG。

6、视频会议:基于 H324-M 标准。

Open Core是一个多媒体的框架,从宏观上来看,它主要包含了两大方面的内容:

1、PVPPlayer:提供媒体播放器的功能,完成各种音频(Audio)、视频(Video) 流的回放(Playback)功能。

2、PVAuthor:提供媒体流记录的功能,完成各种音频、视频流以及静态图像的捕获 功能。

1.3. Mediaplayer 介绍 

MediaPlayer类可以用来播放音频、视频和流媒体,MediaPlayer 包含了 Audio  和 Video 的播放功能,在 Android 的界面上, Music 和 Video 两个应用程序 都是调用 MediaPlayer 实现的。下面两张图是 MediaPlayer  在 Android 和  Open Core 的示例图:

 

下面是图例显示 MediaPlayer 的生命周期

Ø MediaPlayer 常用方法介绍

·  方法:create(Context context, Uri uri) 
解释:静态方法,通过Uri创建一个多媒体播放器。

· 方法:create(Context context, int resid)
解释:静态方法,通过资源ID创建一个多媒体播放器

· 方法:create(Context context, Uri uri, SurfaceHolder holder)
解释:静态方法,通过Uri和指定 SurfaceHolder 【抽象类】 创建一个多媒体播放器

· 方法: getCurrentPosition()
解释:返回 Int, 得到当前播放位置

· 方法: getDuration()
解释:返回 Int,得到文件的时间

· 方法:getVideoHeight()
解释:返回 Int ,得到视频的高度

· 方法:getVideoWidth()
解释:返回 Int,得到视频的宽度

· 方法:isLooping()
解释:返回 boolean ,是否循环播放

· 方法:isPlaying()
解释:返回 boolean,是否正在播放

· 方法:pause()
解释:无返回值 ,暂停

· 方法:prepare()
解释:无返回值,准备同步

· 方法:prepareAsync()
解释:无返回值,准备异步

· 方法:release()
解释:无返回值,释放 MediaPlayer 对象

· 方法:reset()
解释:无返回值,重置 MediaPlayer 对象

· 方法:seekTo(int msec)
解释:无返回值,指定播放的位置(以毫秒为单位的时间)

· 方法:setAudioStreamType(int streamtype)
解释:无返回值,指定流媒体的类型

· 方法:setDataSource(String path)
解释:无返回值,设置多媒体数据来源【根据 路径】

· 方法:setDataSource(FileDescriptor fd, long offset, long length)
解释:无返回值,设置多媒体数据来源【根据 FileDescriptor】

· 方法:setDataSource(FileDescriptor fd)
解释:无返回值,设置多媒体数据来源【根据 FileDescriptor】

· 方法:setDataSource(Context context, Uri uri)
解释:无返回值,设置多媒体数据来源【根据 Uri】

· 方法:setDisplay(SurfaceHolder sh)
解释:无返回值,设置用 SurfaceHolder 来显示多媒体

· 方法:setLooping(boolean looping)
解释:无返回值,设置是否循环播放

· 事件:setOnBufferingUpdateListener(MediaPlayer.OnBufferingUpdateListener listener)
解释:监听事件,网络流媒体的缓冲监听

· 事件:setOnCompletionListener(MediaPlayer.OnCompletionListener listener)
解释:监听事件,网络流媒体播放结束监听

· 事件:setOnErrorListener(MediaPlayer.OnErrorListener listener)
解释:监听事件,设置错误信息监听

· 事件:setOnVideoSizeChangedListener(MediaPlayer.OnVideoSizeChangedListener listener)
解释:监听事件,视频尺寸监听

· 方法:setScreenOnWhilePlaying(boolean screenOn)
解释:无返回值,设置是否使用 SurfaceHolder 显示

· 方法:setVolume(float leftVolume, float rightVolume)
解释:无返回值,设置音量

· 方法:start()
解释:无返回值,开始播放

· 方法:stop()
解释:无返回值,停止播放

1.4. 完整音乐播放例子演示

通过上面的讲解大致知道了 MediaPlayer 的播放原理,下面我们来完成一个小项 目,即实现一个 Mini 版音乐播放器。这个播放器中我们需要有暂停、停止、上一首、 下一首等基本按钮,有了上面的讲解要实现这个小项目就轻松多了,下面将贴出代码

import java.io.File; 

import java.io.FilenameFilter;

public class MusicFilter implements FilenameFilter{

@Override

public boolean accept(File dir, String filename) {

// TODO Auto-generated method stub

return (filename.endsWith(".mp3"));

}

}

Tip:播放器不可能只是希望播放一种音乐格式,并且还需要自动识别指定的路径中哪些是可以播放的音频文件,哪些是不支持的格式,以上代码可以作为参考。好了,下面贴出完整代码

package com.terry;

import java.io.File;

import java.util.ArrayList;

import java.util.List; 

import android.app.ListActivity;

import android.media.MediaPlayer;

import android.media.MediaPlayer.OnCompletionListener;

import android.os.Bundle;

import android.view.KeyEvent;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.ArrayAdapter;

import android.widget.Button;

import android.widget.ListView;

import android.widget.Toast;

public class musicActivity extends ListActivity {

    //播放对象

    private MediaPlayer myMediaPlayer;

    //播放列表

    private List<String> myMusicList=new ArrayList<String>();

    //当前播放歌曲的索引

    private int currentListItem=0;

    //音乐的路径

    private static final String MUSIC_PATH=new String("/sdcard/");

    

    /** Called when the activity is first created. */

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        myMediaPlayer=new MediaPlayer();

        

        findView();

        musicList();

        listener();

    }

    

    

    //绑定音乐

    void musicList(){

        File home=new File(MUSIC_PATH);

        if(home.listFiles(new MusicFilter()).length>0){

            for(File file:home.listFiles(new MusicFilter())){

                myMusicList.add(file.getName());

            }

            ArrayAdapter<String> musicList=new ArrayAdapter<String>

            (musicActivity.this,R.layout.musicitme, myMusicList);

            setListAdapter(musicList);

        }

    }

    

    //获取按钮

   void findView(){

       viewHolder.start=(Button)findViewById(R.id.start);

       viewHolder.stop=(Button)findViewById(R.id.stop);

       viewHolder.next=(Button)findViewById(R.id.next);

       viewHolder.pause=(Button)findViewById(R.id.pause);

       viewHolder.last=(Button)findViewById(R.id.last);

   }

   

   

   //监听事件

   void listener(){

       //停止

       viewHolder.stop.setOnClickListener(new OnClickListener() {

        

        @Override

        public void onClick(View v) {

            // TODO Auto-generated method stub

            if(myMediaPlayer.isPlaying()){

                myMediaPlayer.reset();

            }

        }

    });

       //开始

       viewHolder.start.setOnClickListener(new OnClickListener() {

        

        @Override

        public void onClick(View v) {

            // TODO Auto-generated method stub

            playMusic(MUSIC_PATH+myMusicList.get(currentListItem));

        }

    });

       //下一首

       viewHolder.next.setOnClickListener(new OnClickListener() {

        

        @Override

        public void onClick(View v) {

            // TODO Auto-generated method stub

            nextMusic();

        }

    });

       //暂停

       viewHolder.pause.setOnClickListener(new OnClickListener() {

        

        @Override

        public void onClick(View v) {

            // TODO Auto-generated method stub

            if(myMediaPlayer.isPlaying()){

                myMediaPlayer.pause();

            }else{

                myMediaPlayer.start();

            }

        }

    });

       //上一首

       viewHolder.last.setOnClickListener(new OnClickListener() {

        

        @Override

        public void onClick(View v) {

            // TODO Auto-generated method stub

            

            lastMusic();

        }

    });

       

   }

   

   //播放音乐 

   void playMusic(String path){

       try { 

        myMediaPlayer.reset();

        myMediaPlayer.setDataSource(path);

        myMediaPlayer.prepare();

        myMediaPlayer.start();

        myMediaPlayer.setOnCompletionListener(new OnCompletionListener() {

            

            @Override

            public void onCompletion(MediaPlayer mp) {

                // TODO Auto-generated method stub

                nextMusic();

            }

        });

    } catch (Exception e) {

        // TODO: handle exception

        e.printStackTrace();

    }

   }

   

   //下一首

   void nextMusic(){

       if(++currentListItem>=myMusicList.size()){

           currentListItem=0;

       }

       else{

           playMusic(MUSIC_PATH+myMusicList.get(currentListItem));

       }

   }

   

   //上一首

   void lastMusic(){

       if(currentListItem!=0)

           {

       if(--currentListItem>=0){

           currentListItem=myMusicList.size();

       } else{

           playMusic(MUSIC_PATH+myMusicList.get(currentListItem));

       }

          }  else{

           playMusic(MUSIC_PATH+myMusicList.get(currentListItem));

       }

   }

   

   //当用户返回时结束音乐并释放音乐对象

       @Override

    public boolean onKeyDown(int keyCode, KeyEvent event) {

        // TODO Auto-generated method stub

           if(keyCode==KeyEvent.KEYCODE_BACK){

               myMediaPlayer.stop();

               myMediaPlayer.release();

               this.finish();

               return true;

           }

        return super.onKeyDown(keyCode, event);

    }

   

       //当选择列表项时播放音乐 

       @Override

    protected void onListItemClick(ListView l, View v, int position, long id) {

        // TODO Auto-generated method stub

        currentListItem=position;

        playMusic(MUSIC_PATH+myMusicList.get(currentListItem));

    }

}

运行效果图:


1.5. Android 模拟器使用SD卡

例子中直接指定SD卡里面的音乐文件进行操作,那么我们的Android模拟器如何使 用SD卡呢?

1、你可以来 优快云 这里看一下他的文章 http://blog.youkuaiyun.com/ligaoyang/archive/2009/08/25/4484046.aspx

2、不用操作 DOS 直接使用 Android SDK and AVD Manager 在创建 AVD 时创 建一个SD 卡,这样就可以实现,不妨亲手试试。

创建好SD 卡那如何把文件导入SD 卡里面供模拟器使用呢?

1、启动程序,运行模拟器。

2、在 Eclipse 上先把 DDMS 窗口,选择 File Explorer 标签。

3、如果你当时创建AVD 时有顺带创建 SD 卡或者你通过DOS命令创建的SD 卡,那 么File Explorer 里面就会显示一个 "sdcard" 的文件夹,这时选中它,右上角 的两个箭头就变成可用,右边箭头是导入,左边箭头是导出。


Android Studio项目-JK音乐播放器 安卓课程设计 Android Studio项目开发实战,入门级的音乐播放器APP,作者本人用作本科大三“APP应用开发”课程设计项目提交。APK在根目录下。注释详尽,可以直接运行。 立即下载

相关推荐

Android课程设计—简易音乐播放器

简单的音乐播放器,扫码SD卡MP3音乐,显示播放列表!支持歌词显示! 界面干净!整洁! 运行效果很好!

Android手机开发课程设计之音乐播放器

音乐播放器概述与分析目前手机的音乐播放功能已经是大家比较关注的一个部分,不少在人在购买手机的时候都会关心手机的音乐播放的能力,这也足以看出目前大家对音乐播放功能的重视,所以一款性能良好的手机音乐播放器软件一定会受到欢迎。和传统的音乐播放器相比,手机播放音乐更加的容易携带,其他方面也都不输于传统音乐播放器,而且还具有网上听音乐功能,所以开发一款受欢迎的手机音乐播放软件是具有良好的市场和应用前景的。...

qq_44111805的博客 1万+

android音乐播放器课程设计

android手机音乐播放器,学期末课程设计,可以扫描sd卡音乐,歌词,前进,后退,暂停,时间进度条

网络资源模板--基于Android Studio 实现的音乐播放器

网络资源模板--基于Android Studio 实现的音乐播放器

编程乐学的博客 758

Android课程设计源码仿QQ音乐播放器安卓版项目

Android课程设计源码仿QQ音乐播放器安卓版项目

一个简易音乐播放器(android)

NULL 博文链接:https://xiaolongque.iteye.com/blog/1108795

Android课设:简易音乐播放器

实验主题 本次课程设计计划实现一个低配版的仿网易云音乐的音乐播放器 主要实现功能: 打开APP需先进行注册 已有账号可进行登录 登录后跳转至音乐界面,本地歌曲列表读取本地音乐文件并显示 点击本地音乐中音乐列表页的歌曲跳转至播放页 点击在线音乐中的网易云按钮可打开网易云网址 播放页可实现对歌曲的暂停,继续,上一首,下一首以及回退至歌曲列表页 activity_main为MainActivity的布局文件,显示注册界面。 activity_login为login的布局文件,显示登录界面, activity

qq_45664450的博客 6434

【Lane】 Ultra-Fast-Lane-Detection 复现

引言 车道线检测源码复现以及训练自己的数据集 1 环境搭建 conda create -n lane python=3.7 conda activate lane # 激活环境 conda install pytorch torchvision cudatoolkit=10.1 -c pytorch pip install -r requirements.txt 2 下载项目源码 若在服务器上可以用指令下载,否则直接在网址中下载 git clone https://github.com/cfzd/U

qq_44703886的博客 2万+

基于 Android Studio 音乐播放器App

基于 Android Studio 实现的简易 音乐播放器App Android初学者开发第一个完整的实例项目应该就属《音乐播放器》了,项目包含SQLlit数据库的使用、listview、Fragment、等。用户进行注册数据使用SQLite存储,用户登录时根据数据库的内容来核对用户名和密码是否正确。主要用于音乐的显示以及点击对应的音乐跳转到对应的音乐播放页面。用于播放音乐,对音乐进行暂停,上一首、下一首功能的实现。

编程乐学的博客 2万+

RouterOS网桥VLAN实战:从零构建安全隔离的二层虚拟网络

本文详细讲解了如何在RouterOS上利用网桥和VLAN功能,从零开始构建安全隔离的二层虚拟网络。通过分步实战演示,涵盖核心概念、网桥创建、PVID设置、VLAN规则配置及安全过滤,帮助网络管理员实现办公、访客与服务器网络的逻辑隔离与灵活管理,提升网络安全性。

u9v0w的博客 504

【具身算法】VLA算法-Diffusion Policy

《扩散策略:多模态机器人控制的新方法》摘要 本文提出了一种基于扩散模型的机器人控制策略(DiffusionPolicy),用于解决视觉运动控制中的多模态行为、高维动作空间和训练稳定性问题。该方法利用去噪扩散概率模型(DDPM)生成动作序列,通过迭代优化处理复杂动作分布,显著提升了性能。实验表明,在15项机器人操作任务中,扩散策略平均性能提升46.9%,有效解决了传统显式/隐式策略的局限性。其核心优势在于:1)优雅建模多模态动作分布;2)适应高维动作空间;3)训练过程稳定。未来工作将探索与强化学习的结合及计算

puzhinan7781的博客 1390

Android 小项目之--Mini音乐播放器【简单版】(附源码)

继上篇音乐播放器,我们讲到使用 SDCard 播放音乐的例子,上篇也将如何在 Android 模拟器中创建 SDCard 的步骤列了出来。本篇将扩展上篇例子,去获取SDCard 的所存内存,显示出来告诉用户。本篇讲述的内容如下: 1、讲述 Environment 类。2、讲述 StatFs 类。3、完整例子读取 SDCard 内存 1、讲述 Environment 类Environ

chaozhung的专栏 4721

PyQtWebEngine安装避坑指南:快速解决ModuleNotFoundError

本文详细解析了PyQt5开发中常见的ModuleNotFoundError: No module named 'PyQt5.QtWebEngineWidgets'错误。核心原因是PyQt5 5.11版本后,网页引擎组件被独立为PyQtWebEngine包。文章对比了退回旧版本、独立安装及使用Conda等多种解决方案,并提供了针对Windows、macOS和Linux不同平台的实战安装指南与验证方法,帮助开发者快速解决依赖问题。

weixin_29056101的博客 427

android mp3简单项目,Android 小项目之--Mini音乐播放器【简单版】(附源码)

packagecom.terry;importjava.io.File;importjava.util.ArrayList;importjava.util.List;importandroid.app.ListActivity;importandroid.media.MediaPlayer;importandroid.media.MediaPlayer.OnCompletionListener;i...

weixin_39965514的博客 254

R语言vegan包实战:用varpart函数搞定生态学VPA分析(附完整代码与数据集)

本文详细介绍了如何使用R语言vegan包中的varpart函数进行生态学方差分解分析(VPA),包括数据准备、模型构建、结果解读和可视化呈现。通过完整的代码示例和数据集,帮助研究者理解不同环境因子对生物群落变化的相对贡献,并掌握显著性检验等高级技巧。

weixin_42525005的博客 449

AutoCAD 2024 Mac版安装激活教程:从下载到破解一站式解决方案

本文提供AutoCAD 2024 Mac版的详细安装与优化指南,包括系统要求检查、下载安装流程、常见问题解决方案及性能优化设置。特别介绍了如何应用最新补丁和Update保持软件性能,帮助用户顺利完成从安装到破解的全过程。

weixin_29239661的博客 840
上一篇: JAVA多线程与并发学习总结
下一篇: java模拟http get和post 提交
hoyan_li
博客等级 码龄14年 5粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值