第十八单元 使用MediaPlayer完成音乐播放器(内容提供者获得本地所有音频)

Android 使用MediaPlayer播放音频详解 官方资料 MediaPlayer 概览 媒体播放器 其实,通过阅读上面两个文档,基本上就可以实现自己的需求了,毕竟每个人的需求不一样。由于需求只用到播放音频部分,所以不会设计涉及视频播放。 MediaPlayer位于android.media包下,media下还有一系列相关的API: MediaPlayer :可用于控制音频/视频文件和流的播放。 可以在VideoView找到有关如何使用此类中的方法的示例。 AudioTrack :为应用程序管理和播放单个音频资源。 它允许将 P... 阅读详情

使用MediaPlayer完成音乐播放器

项目需求:

1.播放本地音乐:
2.播放网络音乐:
3.完成音乐列表,

MediaPlayer常用的方法:

void setDataSource(String path) :通过一个具体的路径来设置MediaPlayer的数据源,path可以是本地的一个路径,也可以是一个网络路径
int getCurrentPosition() 获取当前播放的位置
int getAudioSessionId() 返回音频的session ID
int getDuration() 得到文件的时间
boolean isLooping () 是否循环播放
boolean isPlaying() 是否正在播放
void pause () 暂停
void start () 开始
void stop () 停止
void prepare() 同步的方式装载流媒体文件。
void prepareAsync() 异步的方式装载流媒体文件。
void reset() 重置MediaPlayer至未初始化状态。
void release () 回收流媒体资源。
void seekTo(int msec) 指定播放的位置(以毫秒为单位的时间)
void setLooping(boolean looping) 设置是否单曲循环
setOnCompletionListener(MediaPlayer.OnCompletionListener listener) 网络流媒体播放结束时回调
setOnErrorListener(MediaPlayer.OnErrorListener listener) 发生错误时回调 **
setOnPreparedListener(MediaPlayer.OnPreparedListener listener):当装载流媒体完毕的时候回调。

reset方法是将数据清空。 release方法是将媒体对象回收掉

MediaPlayer使用注意的地方:

尽量保证在一个App中只有MediaPalyer对象(单例模式)
在使用start()播放流媒体之前,需要装载流媒体资源。这里最好使用prepareAsync()用异步的方式装载流媒体资源。因为流媒体资源的装载是会消耗系统资源的,在一些硬件不理想的设备上,如果使用prepare()同步的方式装载资源,可能会造成UI界面的卡顿,这是非常影响用于体验的。因为推荐使用异步装载的方式,为了避免还没有装载完成就调用start()而报错的问题,需要绑定MediaPlayer.setOnPreparedListener()事件,它将在异步装载完成之后回调。异步装载还有一个好处就是避免装载超时引发ANR((Application Not Responding)错误。

详细代码:

public class MainActivity extends AppCompatActivity {
    private ListView list;
    private List<Sing> lists=new ArrayList<>();
    private ImageView imageView1;
    private ImageView imageView3;
    private ImageView imageView4;
    private MediaPlayer mediaPlayer;
    private Uri uri;
    private SeekBar seekBar;
    private MyAdapter myAdapter;
    private int a=-1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        list = findViewById(R.id.list);
        imageView1 = findViewById(R.id.imageView1);
        imageView3 = findViewById(R.id.imageView3);
        imageView4 = findViewById(R.id.imageView4);
        mediaPlayer=new MediaPlayer();
        seekBar=findViewById(R.id.seek);
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
            requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE},100);
        }else{
            videoMethod();
        }
        list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
               a=position;
               sb(a);
            }
        });
        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                mediaPlayer.start();
            }
        });
        seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                if(fromUser){
                    mediaPlayer.seekTo(progress);
                }
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

            }
        });
        list = findViewById(R.id.list);
        myAdapter=new MyAdapter(MainActivity.this,lists);
        list.setAdapter(myAdapter);
    }

    private void videoMethod() {
        ContentResolver contentResolver=getContentResolver();
        uri= MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
        Cursor cursor=contentResolver.query(uri,null,null,null,null);
        while (cursor.moveToNext()){
            String name = cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media.TITLE));
            String singer = cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media.ARTIST));
            String time = cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media.DURATION));
            String address = cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media.DATA));
            lists.add(new Sing(name,singer,time,address));

        }
        myAdapter.notifyDataSetChanged();
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if(requestCode == 100 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
            Log.i("TAG", "onRequestPermissionsResult: 读取成功");
            videoMethod();
        }
    }

    public void privices(View view) {
        a--;
        if(a>=0){
            sb(a);
        }
    }

    public void next(View view) {
        a++;
        if(a<lists.size()){
            sb(a);
        }
    }
    public void stop(View view) {
        mediaPlayer.pause();
    }


    public void sb(int i){
        try {
            mediaPlayer.reset();
            seekBar.setProgress(0);
            mediaPlayer.setDataSource(lists.get(i).getAddress());
            mediaPlayer.prepareAsync();
            mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    mediaPlayer.start();
                    seekBar.setMax(mediaPlayer.getDuration());
                    final Timer timer=new Timer();
                    timer.schedule(new TimerTask() {
                        @Override
                        public void run() {
                            int currentPosition = mediaPlayer.getCurrentPosition();
                            seekBar.setProgress(currentPosition);
                            if(currentPosition==mediaPlayer.getDuration()){
                                timer.cancel();
                                Log.i("TAG", "哈哈哈哈哈哈");
                            }
                        }
                    },0,1000);
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

    }
}

Music实体类:

public class Sing {
    private String name;
    private String singer;
    private String time;
    private String address;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSinger() {
        return singer;
    }

    public void setSinger(String singer) {
        this.singer = singer;
    }

    public String getTime() {
        return time;
    }

    public void setTime(String time) {
        this.time = time;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public Sing() {
    }

    public Sing(String name, String singer, String time, String address) {
        this.name = name;
        this.singer = singer;
        this.time = time;
        this.address = address;
    }
}

适配器

public class MyAdapter extends BaseAdapter  {
    private Context context;
    private List<Sing> list;
    private LayoutInflater layoutInflater;

    public MyAdapter(Context context, List<Sing> list) {
        this.context = context;
        this.list = list;
        layoutInflater=LayoutInflater.from(context);
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder=null;
        if(convertView==null){
            holder=new ViewHolder();
            convertView=layoutInflater.inflate(R.layout.list,parent,false);
            holder.text1=convertView.findViewById(R.id.text1);
            holder.text2=convertView.findViewById(R.id.text2);
            holder.text3=convertView.findViewById(R.id.text3);
            convertView.setTag(holder);
    }else{
            holder=(ViewHolder)convertView.getTag();
        }
        holder.text1.setText(list.get(position).getName());
        holder.text2.setText(list.get(position).getSinger());
        holder.text3.setText(list.get(position).getTime());

        return convertView;
    }
    class ViewHolder{
        private TextView text1;
        private TextView text2;
        private TextView text3;
    }
}

加入依赖

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
C++与Qt实战:多功能音乐播放器开发全解析 在桌面应用开发领域,C++因其高性能和底层控制能力,常被用于构建复杂的多媒体软件。其核心原理在于通过面向对象设计管理资源,并利用成熟的GUI框架(如Qt)实现跨平台界面。这种技术组合的价值在于能够深入控制内存、线程与性能,同时快速集成各类功能模块。典型的应用场景包括音视频播放器、图形处理工具及需要集成AI能力的智能应用。本文以开发一个集成手势识别与人脸登录的播放器为例,详细剖析了如何运用Qt Multimedia模块进行音频解码与播放控制,并通过模块化设计将播放列表管理、第三方SDK(如百度AI、虹软Arc 阅读详情

相关推荐

使用MediaPlayer类在Android中播放音频的完整指南

简介:本文深入讲解了在Android平台上使用类播放音频的方法。从基本结构和生命周期开始,介绍了如何使用prepare()start()等方法播放本地和在线音频文件,并且阐述了如何在适当的时候释放资源。同时,文章也涵盖了循环播放、状态管理、错误监听等高级用法,以及跨线程操作和音频控制技巧。本指南旨在指导开发者如何有效地使用组件,以创建流畅的多媒体应用。

weixin_42576186的博客 1597

Android 使用MediaPlayer播放assets或者raw目录的音频文件

Android 使用MediaPlayer播放assets或者raw目录的音频文件 https://blog.csdn.net/qq_31939617/article/details/80491552

Android Media——使用MediaPlayer播放SD卡中的音频

MediaPlayerAndroid当中开发音视频应用的一个重要组件,它不仅支持本地音视频的播放,同时也能够播放网络的音视频,支持多种音视频播放格式。在onDestroy函数中stop和release mediaPlayer,在verifyStoragePermissions函数中申请权限,如果只播放SD卡目录的歌曲申请个读权限就可以了,我也把写申请了。最后在onClick中根据不同的按键调用mediaPlayer的函数进行播放、暂停(再次播放继续播放)、和停止(再次播放从头播放)。

liuning1985622的博客 2045

MediaPlayer播放MP3文件

此类是用MediaPlayer播放MP3音频文件的。封装好的代码,大家可以借鉴使用。简单入门,欢迎大家免费下载。

MediaPlayer播放音频与视频

9.2 MediaPlayer播放音频与视频 分类Android 基础入门教程 本节引言: 本节带来的是Android多媒体中的——MediaPlayer,我们可以通过这个API来播放音频和视频 该类是Androd多媒体框架中的一个重要组件,通过该类,我们可以以最小的步骤来获取,解码 和播放音视频。它支持三种不同的媒体来源: 本地资源 内部的URI,比如你可以通过Content...

jinyu_mobao的博客 1117

Android使用MediaPlayer播放本地音乐

Android使用MediaPlayer播放本地音乐标签(空格分隔): androidAndroid使用MediaPlayer播放本地音乐 一装载音频 1 静态方法 2 动态加载 3 两种方式对比 二MediaPlayer的控制方法 三事件监听 1 准备监听事件 2 完成监听事件 3 错误监听事件 4 定位监听事件 四进度控制 1 添加SeekBar控件 2 给SeekBar设置监听 3 在启动播

陈小默的博客 2万+

第二十单元 使用MediaPlayer+Service+Broadcast完成音乐播放器

使用MediaPlayer+Service+Broadcast完成音乐播放器 1,封装歌曲的类 public class Song { private String singer; private String song; private String path; private int duration; private long size; pr...

Transparent_v的博客 502

Android第十八单元

内容提供者获得本地所有音频 MediaPlayer常用的方法: void setDataSource(String path) :通过一个具体的路径来设置MediaPlayer的数据源,path可以是本地的一个路径,也可以是一个网络路径 int getCurrentPosition() 获取当前播放的位置 int getAudioSessionId() 返回音频的session ID int ge...

haohao_9的博客 139

Android中的MediaPlayer、SoundPool、Assets

Android中的MediaPlayer、SoundPool、Assets。 在一款游戏或者APP中,除了华丽的界面UI直接吸引玩家或用户外,另外重要的就是游戏背景音乐与音效。合适的背景音乐以及精彩的音效搭配会令整个游戏或APP上升一个档次。 在Android中,常用于播放游戏背景音乐的类是MediaPlayer,而用于游戏音效的则是SoundPool类,其中与之相关的还有Assets文件夹。 ...

手写我对你的温柔 4206

android音乐播放器案例,Android MediaPlayer实现音乐播放器实例代码

Android MediaPlayer实现音乐播放器1、布局文件android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical" >android:id="@+id/hint"android:layout_width="wrap_content"android...

weixin_34539644的博客 428

开源Android音乐播放器Auro项目实战解析

在移动应用开发领域,音频类应用始终占据着重要位置。随着开源文化的普及和技术生态的成熟,构建一个功能完整、架构清晰的开源Android音乐播放器,不仅能够帮助开发者深入理解Android多媒体处理机制,还能作为学习现代移动开发范式的优秀实践案例。本章将从项目的整体视角出发,介绍该开源音乐播放器的设计目标、技术选型依据以及核心功能模块划分。仅支持标准协议(file://http://content://),不支持加密流、分片下载、动态拼接等高级加载方式。

weixin_42607969的博客 983

采用MediaPlayer播放网络音频本地音频(子线程里快速启动/切换播放音频

百度没解决只好自己鲁。百度上好多仅仅是播放网络音频简单的一条测试,很多条目的时候快速切换经历了很多mediapleayer播放异常。

android音乐播放器的开发实例,Android开发实战之简单音乐播放器(示例代码)

最近开始学习音频相关。所以,很想自己做一个音乐播放器,于是,花了一天学习,将播放器的基本功能实现了出来。我觉得学习知识点还是蛮多的,所以写篇博客总结一下关于一个音乐播放器实现的逻辑。希望这篇博文对你的学习和生活有所帮助。效果图:**实现逻辑**在市面上的音乐播放app,即时你关了。那么一样会在后台播放,所以播放的逻辑应该写在Service中。并且能够实现Service和Activity之间进行通信...

weixin_39553705的博客 833

Android本地音乐播放器开发实战(一):扫描并展示音乐文件

为提高鲁棒性,可实现一个复合型文件过滤器:));// 扩展名校验通过后,检查文件头if (read!i++) {// 默认信任扩展名Android平台为应用程序之间的数据共享设计了一套标准化的跨进程通信机制——。它作为四大组件之一,承担着结构化数据的封装与暴露职责。而在多媒体领域,MediaStore就是系统预置的核心实例,专门用于集中管理设备上的音频、视频和图像资源。

weixin_29840475的博客 1002

Salt Player:10分钟掌握Android本地音乐播放器的开源部署与深度定制

你是否厌倦了流媒体平台的广告和订阅费?是否担心个人音乐库的隐私安全?或者想要一个完全掌控在自己手中的音乐播放体验?Salt Player(椒盐音乐)作为一款备受数十万用户信赖的本地音乐播放器,提供了开源、纯净且功能丰富的解决方案。本文将带你深入了解如何部署、定制和优化这款优秀的开源Android音乐播放器。 ## 🎵 Salt Player:重新定义本地音乐播放体验 Salt Player是

gitblog_00859的博客 478

ssm音乐播放器设计app

获取歌曲列表添加歌单播放指定歌曲

QQ_188083800的博客 29

qt5.2音乐播放器的播放功能

qt5.2并没有了phonon 模块 ,在播放音频视频的时候可以使用QMediaplayer来实现。 //创建媒体 player=new QMediaPlayer(this); //创建播放列表,并在列表里添加两首歌曲 mediaList=new QMediaPlaylist; mediaList->addMedia(QUrl::fro

x_xiaosi的专栏 5573

移动端音频开发实战:从低延迟处理到跨平台兼容性优化

音频开发是数字信号处理与工程实践紧密结合的技术领域,其核心在于将连续的模拟信号转换为离散的数字信号进行处理与重构。这一过程涉及采样、量化、编码等基本原理,其技术价值在于实现高保真、低延迟的音频体验,广泛应用于多媒体播放、实时通信、游戏音效等场景。在移动开发中,低延迟音频的实现尤为关键,它直接影响到语音通话、音乐演奏等交互应用的体验。开发者需要深入理解系统音频框架,如iOS的AVAudioEngine和Android的Oboe库,通过优化音频回调、管理缓冲区大小来平衡延迟与稳定性。同时,跨平台兼容性挑战要求针

weixin_33743661的博客 363
上一篇: 第十七单元 Application的生命周期和上下文的应用场景
下一篇: 第十九单元 使用MediaPlayer+Service完成音乐播放器
安久儿
博客等级 码龄7年 2粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值