一、前言

MediaPlayer类是Android API中专门针对媒体资源的使用开发的一个类,其中包含音频资源和视频资源,使用起来也较简单。

二、音频资源的使用

1、初始化MediaPlayer,有两种方式可以初始化MediaPlayer,直接new或者用静态方法create

// # 1 直接new
mp = new MediaPlayer();
// # 2 使用静态方法创建
mp = MediaPlayer.create(this,R.raw.a);

2、设置音频资源:此方法可传本地资源路径,也可传网络音频网址

mp.setDataSource(musicVo.getPath());

3、准备资源状态:若准备本地资源,可直接使用prepare()方法,若准备网络资源可使用prepareAsync(),另外要准备网络资源要结合准备监听同步使用

// # 1 本地资源的准备
mp.prepare();
// # 2 网络资源的准备
mp.prepareAsync();

4、一旦资源准备完毕,就可以使用MediaPlayer这个强大的类来播放音频资源了

mp.start();

三、MediaPlayer常用属性及方法

1、可使用MediaPlayer对象获取音频资源长度,以及获取音频资源播放的当前长度

mp.getDuration();//总时长
mp.getCurrentPosition();//当前位置

2、可使用MediaPlayer对象将播放资源直接跳到指定位置

//跳到指定位置播放
mp.seekTo(80);

3、强大的reset,每次播放新的音频资源时,可使用reset将播放器对象重置,清除之前的所有内容

mp.reset();

4、四种监听,都比较容易理解和使用

// #  设置监听(非必需)
mp.setOnCompletionListener(this);//完成监听
mp.setOnErrorListener(this);//错误监听
mp.setOnPreparedListener(this);//准备好的监听
mp.setOnBufferingUpdateListener(this);//缓冲监听

四、获取专辑封面

1、若获取本地已经存在的歌曲专辑封面,可通过ContentProvider获取指定的歌曲的封面图片,以下是获取歌曲封面的工具类

package com.projectb.mediaplayer;

import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.ParcelFileDescriptor;

import java.io.FileDescriptor;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

/**
 * Created by macbook on 2016/11/20.
 */

public class MusicGetPic {public static Bitmap getArtwork(Context context, long song_id, long album_id, boolean allowdefault) {if (album_id < 0) {// This is something that is not in the database, so get the album art directly
            // from the file.
            if (song_id >= 0) {Bitmap bm = getArtworkFromFile(context, song_id, -1);
                if (bm != null) {return bm;
                }}if (allowdefault) {return getDefaultArtwork(context);
            }return null;
        }ContentResolver res = context.getContentResolver();
        Uri uri = ContentUris.withAppendedId(sArtworkUri, album_id);
        if (uri != null) {InputStream in = null;
            try {in = res.openInputStream(uri);
                return BitmapFactory.decodeStream(in, null, sBitmapOptions);
            } catch (FileNotFoundException ex) {// The album art thumbnail does not actually exist. Maybe the user deleted it, or
                // maybe it never existed to begin with.
                Bitmap bm = getArtworkFromFile(context, song_id, album_id);
                if (bm != null) {if (bm.getConfig() == null) {bm = bm.copy(Bitmap.Config.RGB_565, false);
                        if (bm == null && allowdefault) {return getDefaultArtwork(context);
                        }}} else if (allowdefault) {bm = getDefaultArtwork(context);
                }return bm;
            } finally {try {if (in != null) {in.close();
                    }} catch (IOException ex) {}}}return null;
    }private static Bitmap getArtworkFromFile(Context context, long songid, long albumid) {Bitmap bm = null;
        byte[] art = null;
        String path = null;
        if (albumid < 0 && songid < 0) {throw new IllegalArgumentException("Must specify an album or a song id");
        }try {if (albumid < 0) {Uri uri = Uri.parse("content://media/external/audio/media/" + songid + "/albumart");
                ParcelFileDescriptor pfd = context.getContentResolver().openFileDescriptor(uri, "r");
                if (pfd != null) {FileDescriptor fd = pfd.getFileDescriptor();
                    bm = BitmapFactory.decodeFileDescriptor(fd);
                }} else {Uri uri = ContentUris.withAppendedId(sArtworkUri, albumid);
                ParcelFileDescriptor pfd = context.getContentResolver().openFileDescriptor(uri, "r");
                if (pfd != null) {FileDescriptor fd = pfd.getFileDescriptor();
                    bm = BitmapFactory.decodeFileDescriptor(fd);
                }}} catch (FileNotFoundException ex) {}if (bm != null) {mCachedBit = bm;
        }return bm;
    }private static Bitmap getDefaultArtwork(Context context) {Drawable drawable = context.getResources().getDrawable(R.drawable.pic_ax);
        BitmapDrawable bd = (BitmapDrawable) drawable;
        Bitmap bitmap = bd.getBitmap();

        return bitmap;
    }private static final Uri sArtworkUri = Uri.parse("content://media/external/audio/albumart");
    private static final BitmapFactory.Options sBitmapOptions = new BitmapFactory.Options();
    private static Bitmap mCachedBit = null;
}

2、若播放网络端的图片,需要对应的接口才可以获取音频的图片,本地能从ContentProvider中获取,是因为你在下载歌曲的时候就已经把专辑图片一起下载下来了,所以可以获取

3、项目源码:https://github.com/Knight2016/MediaPlayer-

Android开发05_MediaPlayer之音频播放相关推荐

  1. Android音频开发(四):音频播放模式

    一.Android音频开发(一):音频基础知识 二.Android音频开发(二):录制音频(WAV及MP3格式) 三.Android音频开发(三):使用ExoPlayer播放音频 四.Android音 ...

  2. android 音频播放过程,一种Android系统中的音频播放方法与流程

    本申请涉及android系统技术,特别涉及一种android系统中的音频播放方法. 背景技术: 在android系统中,现有的使用audiotrack进行音频播放时,audiotrack应用与andr ...

  3. Android 使用 MediaCodec API音频播放器

    OpenMAX 有时缩写为"OMX",是针对多媒体处理的免版税.跨平台的例程和接口集.它主要用于嵌入式设备,在设计时考虑了效率,因此可以以优化和受控的方式处理大量多媒体数据,包括视 ...

  4. android开发监听媒体播放器,Android开发之媒体播放工具类完整示例

    本文实例讲述了Android开发之媒体播放工具类.分享给大家供大家参考,具体如下: package com.maobang.imsdk.util; import android.media.Media ...

  5. iOS开发实用技术之音频播放(QQ音乐)

    音频播放 --- 一. 录音 0. 应用场景 大多数应用在即时通讯APP中, 语音发送 1. 录音步骤 导入AVFoundation框架 #import <AVFoundation/AVFoun ...

  6. android mediaplayer 权限,Android — 使用MediaPlayer进行音频播放

    上一篇说到音频录制的时候我就知道肯定会有音频播放这个功能,果不其然后续播放的需求又给我加上了,因为之前是AMR格式,所以这里使用MediaPlayer进行播放,据ios说播放amr格式的音频还挺麻烦的 ...

  7. Android 开发中原始音频的录播和和自定义音频控制条的讲解及实战(超详细 附源码)

    需要源码请点赞关注收藏后评论区留下QQ~~~ 一.原始音频的录播 语音通话功能要求实时传输,如果使用MediaRecorder与MediaPlayer组合,那么只能整句话都录完并编码好了才能传给对方去 ...

  8. android 自定义音乐圆形进度条,Android自定义View实现音频播放圆形进度条

    本篇文章介绍自定义View配合属性动画来实现如下的效果 实现思路如下: 根据播放按钮的图片大小计算出圆形进度条的大小 根据音频的时间长度计算出圆形进度条绘制的弧度 通过Handler刷新界面来更新圆形 ...

  9. 微信小程序开发之录音机 音频播放 动画 (真机可用)

    趁着周末用微信小程序做了个简易录音机.跟大家分享,欢迎批评! 老规矩,先几张图. 1.为了进来看得清楚.刚开始没有加载音频列表.代码往前挪一挪即可. 2.按住 录音按钮的时候会出现麦克风.中间的麦克风 ...

最新文章

  1. 学术会议,已沦为表演...
  2. java事务设计iofo,Spring事务最佳实践
  3. python 字符转义_【课堂笔记】Python基础语法:字符串
  4. 在ABAP中将负号提前的方法
  5. mysql有个数据用or语句有相同条件_MySql带OR关键字的多条件查询语句
  6. Tomcat servlet工作原理
  7. linux中传输文件方法,Linux快速传输文件几种方法
  8. List接口常用实现类的特点和底层实现
  9. 洛谷 P1091 合唱队型
  10. 【恋上数据结构】希尔排序
  11. 计算机网络中为什么引入IP地址?
  12. 2019如何新建流程图_如何用ppt制作海报和流程图
  13. sobel边缘检测java_Sobel边缘检测
  14. 考勤系统需求分析(软件工程)
  15. 图像去雨(rainy streaks removal)#引导滤波
  16. 后端程序员看前端想死(二)进入页面之后js分析
  17. 无法连接到服务器。错误代码 0x80072EFD
  18. Nginx关闭后,网页仍能访问(缓存问题)
  19. 十大算法展辉煌历史,十大问题引锦绣前程
  20. SU-03T和STM32F103C8T6及MP3模块搭建离线语音识别控制系统01

热门文章

  1. 10个最好的免费PDF阅读器清单分享
  2. Gatling:Cookie
  3. 《操作系统》实验二:进程同步
  4. C# 阿里云Redis存储服务 使用总结
  5. 你见过凌晨四点破解密码的john吗?
  6. notes-JavaScript-JavaScript极速入门_玉女心经系列 网址:http://www.php.cn
  7. Java中char类型占几个字节?
  8. 【Ubuntu】局域网内ping不通
  9. 电力监控系统性能测试方案
  10. c语言之格式控制字符与输入输出函数