MediaPlayer是Android设计的媒体播放器,不仅仅可以播放音频文件,还可以播放视频文件

播放:Audio(音频,.mp3)相关

播放:Video(视频,.mp4)相关

以下图,是Android官方提供:MediaPlayer时序图:

只要会看这个图:就能实现音频/视频播放,暂停,继续,停止,重播,等等

看图规律:

    1.蓝色椭圆形是状态,例如:Initialized已初始化状态,Prepared准备状态,Started启动状态,Stopped停止状态,End结束状态,等等;

    2.单箭头是方法调用:例如:调用reset方法重置,调用prepare方法准备,调用start方法播放,等等;

    3.双箭头是监听回调:例如:onError回调错误,等等


此MediaPlayer播放使用普通准备,不使用异步准备

package liudeli.my_media1;

import android.database.Cursor;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.SystemClock;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast; /**
* 此MediaPlayer播放使用普通准备,不使用异步准备
*/
public class MediaPlayAudioActivity extends AppCompatActivity { private TextView tvPlayerPath; // 显示播放的路径
private TextView tvAudioInfo; // 歌曲时长/歌手/专辑
private TextView tvAudioThisDuration; // 当前播放的时长 /**
* 媒体播放器,可以播放(音频/视频)
* 播放(音频/视频)操作一模一样
*/
private MediaPlayer mediaPlayer; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_play_audio); tvPlayerPath = findViewById(R.id.tv_player_path);
tvAudioInfo = findViewById(R.id.tv_audio_info);
tvAudioThisDuration = findViewById(R.id.tv_audio_this_duration);
mediaPlayer = new MediaPlayer(); // 为了测试,这样写,真实开发中,不这样写
new Thread(){
@Override
public void run() {
super.run();
while (true) { runOnUiThread(new Runnable() {
@Override
public void run() {
if (mediaPlayer.isPlaying()) {
tvAudioThisDuration.setText("当前时长:" + postions(mediaPlayer.getCurrentPosition()));
}
}
}); SystemClock.sleep(1000);
}
}
}.start(); /**
* 监听播放完成
*/
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
Log.d("mp", "播放完成");
Toast.makeText(MediaPlayAudioActivity.this, "播放完成", Toast.LENGTH_SHORT).show();
tvAudioThisDuration.setText("当前时长:-");
}
}); /**
* 去获取第一条外置存储的音频文件.mp3 的路径
* 通过Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 获取外置存储音频文件
* getContentResolver.query(uri)
*/
initAudioPlayerPath();
} /**
* 去获取第一条外置存储的音频文件.mp3 的路径
*/
private void initAudioPlayerPath() {
Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
// 查询的列
String[] projection = new String[]{MediaStore.Audio.Media.DATA, // 音频路径
MediaStore.Audio.Media.DURATION, // 音频时长
MediaStore.Audio.Media.ARTIST, // 歌手
MediaStore.Audio.Media.ALBUM // 专辑
};
// 让Android系统也会去读取外置存储
Cursor cursor = getContentResolver().query(uri,
projection,
null,
null,
null,
null);
if (cursor.moveToFirst()) {
tvPlayerPath.setText(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA)));
String duration = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION));
String artist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));
String album = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM));
tvAudioInfo.setText("歌曲时长:" + postions(Integer.parseInt(duration)) + " \n歌手:" + artist + " \n专辑:" + album);
}
} /**
* 转换时长值
*/
private String postions(int postion) {
int musicTime = postion / 1000; return musicTime / 60 + ":" + musicTime % 60;
} /**
* 开始播放:此次播放使用普通准备,不使用异步准备
* @param view
*/
public void player(View view) {
try {
// 重置
mediaPlayer.reset();
// 设置音频文件路径
mediaPlayer.setDataSource(tvPlayerPath.getText().toString().trim());
// 准备:是操作硬件在播放,所以需要准备
mediaPlayer.prepare();
// 开始
mediaPlayer.start();
} catch (Exception e) {
e.printStackTrace();
}
} /**
* 暂停播放 继续播放
* @param view
*/
public void pause(View view) {
/**
* 这种方式可以拿到控件
*/
Button pause_continue = (Button) view;
if (mediaPlayer.isPlaying()) {
pause_continue.setText("继续");
// 暂停
mediaPlayer.pause();
} else {
pause_continue.setText("暂停");
// 继续播放
mediaPlayer.start();
}
} /**
* 停止播放
*/
public void stop(View view) {
// 停止播放
mediaPlayer.stop();
} /**
* 重播
* @param view
*/
public void recorded(View view) {
try {
/**
* 一定要seekTo
* 因为由于没有执行reset,mediaPlayer不会从0开始播放,所以要设置
*/
mediaPlayer.seekTo(0);
// 准备:是操作硬件在播放,所以需要准备
mediaPlayer.prepare();
// 播放
mediaPlayer.start();
} catch (Exception e) {
e.printStackTrace();
}
} /**
* 此Activity销毁后,一定要
* mediaPlayer.release();
* mediaPlayer = null;
* 因为 MediaPlayer 是操作硬件在播放,所以一定要释放资源
*/
@Override
protected void onDestroy() {
super.onDestroy();
mediaPlayer.release();
mediaPlayer = null;
System.gc();
}
}

AndroidManifest.xml 配置 外部存储读取权限:

Android系统也会去读取外置存储,需要读取外部存储的权限

  <!--
getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, ...)
Android系统也会去读取外置存储,需要读取外部存储的权限
-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MediaPlayAudioActivity"
android:orientation="vertical"> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="播放音频.mp3路径:"
/> <TextView
android:id="@+id/tv_player_path"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="/mnt/sdcard/"
/> </LinearLayout> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"> <Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="播放"
android:onClick="player"
/> <Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="暂停"
android:onClick="pause"
/> <Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="停止"
android:onClick="stop"
/> <Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="重播"
android:onClick="recorded"
/> </LinearLayout> <TextView
android:id="@+id/tv_audio_info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:text="test"
/> <TextView
android:id="@+id/tv_audio_this_duration"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:text="歌曲时长:-"
/> </LinearLayout>

播放效果:

Android-MediaPlayer-音频播放-普通准备的更多相关文章

  1. Android MediaPlayer 音频倍速播放,调整播放速度

    本文链接: Android MediaPlayer 倍速播放,调整播放速度 现在市面上的很多音视频App都有倍速播放的功能,例如把播放速度调整为0.5.1.5.2倍等等. 从Android API 2 ...

  2. MediaPlayer 音频播放 示例

    状态机.流程图.生命周期 对播放音频/视频文件和流的控制是通过一个状态机来管理的.下图显示一个MediaPlayer对象被支持的播放控制操作驱动的生命周期和状态. 椭圆代表MediaPlayer对象可 ...

  3. Android——简单音乐播放器

    使用MediaPlayer做的简单音乐播放器,更多内容请到百度经验查看   http://jingyan.baidu.com/article/60ccbceb63452364cab197f1.html ...

  4. Android MediaPlayer播放一般音频与SoundPool播放短促的音效

    [1]使用MediaPlayer实现一般的音频播放 MediaPlayer播放通常的音频文件 MediaPlayer mediaPlayer = new MediaPlayer(); if (medi ...

  5. Android MediaPlayer 播放音频

    本文链接: Android MediaPlayer 播放音频 主要介绍使用MediaPlayer播放音频的方式.关于MediaPlayer的基础知识,比如状态,可以参考Android MediaPla ...

  6. Android音频播放之SoundPool

    SoundPool 一.基本概念 在Android应用程序的开发过程中,经常需要播放多媒体文件,也许最先想到的会是MediaPlayer类了,该类提供了播放.暂停.停止及重复播放等功能性方法(该类位于 ...

  7. Android 学习笔记多媒体技术之 AsyncTask+实现音频播放...

    PS:今天搞了一下如何实现音频播放...结果被坑了,看书上写的代码是挺简单的,但是有个函数就是死活没看懂,这真是受不了...最后才弄明白,原来是一个实现异步任务的一个类...这个类使用java.uti ...

  8. Android(java)学习笔记180:Android MediaPlayer 播放prepareAsync called in state 8解决办法

    使用android MediaPlayer播放音频文件时,有时会出现prepareasync called in state 8错误. 以下方法可以避免这个异常出现.  第一种方法: private ...

  9. android 音频播放总结 soundlPool,MediaPlay

    soundlPool 用于小音频的播放多个同时播放. 使用步骤: 步骤一: 首先下载音频文件可以将其放入assets文件夹下或者res下的raw文件夹下,区别在于assets下可以再新建文件夹二raw ...

  10. 音频播放 音乐 MediaPlayer

    MediaPlayer对象的生命周期如下: Idle 状态:当使用new()方法创建一个MediaPlayer对象或者调用了其reset()方法时,该MediaPlayer对象处于idle状态.这两种 ...

随机推荐

  1. bzoj4558: [JLoi2016]方

    Description 上帝说,不要圆,要方,于是便有了这道题.由于我们应该方,而且最好能够尽量方,所以上帝派我们来找正方形 上帝把我们派到了一个有N行M列的方格图上,图上一共有(N+1)×(M+1) ...

  2. python3_爬虫_爬百度音乐

    工具及环境 1.操作系统:windows 64位系统 2.软件工具:谷歌浏览器.pycharm集成开发工具 3.第三方库:request 注:如果第三方库搭建有困难,请看博客:https://www. ...

  3. 汇编_指令_INC

    加1指令 INC指令功能:目标操作数+1 INC指令只有1个操作数,它将指定的操作数的内容加1,再将结果送回到该操作数.INC指令将影响SF,AF,ZF,PF,OF标志位,但是不影响CF标志位. IN ...

  4. 一.jQuery源码解析之总体架构

    (function (window, undefined) { //构建jQuery对象 var document = window.document, navigator = window.navi ...

  5. 常用的ubantu操作命令

    Ubuntu软件操作的相关命令 sudo apt-get update 更新源 sudo apt-get install package 安装包 sudo apt-get remove package ...

  6. mysql数据导入的时候提示Got a packet bigger than 'max_allowed_packet' bytes

    Got a packet bigger than 'max_allowed_packet' bytes错误 默认可能是2M 把max_allowed_packet设置大于5M试试,我设置为160M,输 ...

  7. MPI 派生数据类型 MPI_Type_create_struct(),MPI_Type_contiguous(),MPI_Type_vector(),MPI_Type_create_hvector(),MPI_Type_indexed()

    ▶ 使用 MPI 派生数据类型,减少数据在传输过程中的耗时 ● MPI_Type_create_struct() 范例代码 { ; int globalDataInt[globalSize], glo ...

  8. $(window).scrollTop() 获取当前的鼠标位置 offset.left()指定标签在html中的坐标 offset.top() 指定标签在html中的坐标position() 指定标签相对父(relative)标签的坐标

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. VS2010生成的文件在别的机器上运行提示“丢失MSVCR100D.dll”<转>

    用vs2010编写的程序经常会发生的一个问题.在自己的机器上运行的好好的,但是在别的机器上就会发生没有找到MSVCR100D.dll.这是 个很头疼的问题.对于一些代码量几百行的小程序,我不可能要求其 ...

  10. (1)activiti认识以及数据库和插件配置

    工作流介绍 工作流(Workflow),就是通过计算机对业务流程自动化执行管理.它主要解决的是“使在多个参与者之间按照某种预定义的规则自动进行传递文档.信息或任务的过程, 从而实现某个预期的业务目标, ...