Android-MediaPlayer
MediaPlayer
突然觉得这个音乐播放有点意思,我们来做一下吧。 首先我们来一个名为MediaPlayerDemo的项目。 然后再main.xml文件里面创建三个按钮,分别是播放、暂停、停止,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/play"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Play"/>
<Button
android:id="@+id/pause"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Pause"/>
<Button
android:id="@+id/stop"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Stop"/>
</LinearLayout>
然后我们进入MainActivity活动页面,代码如下:
package com.example.mediaplayerdemo;
import android.Manifest;
import android.content.pm.PackageManager;
import android.media.MediaPlayer;
import android.os.Environment;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import java.io.File;
//继承View.OnClickListener,是按钮放在一起更直观,用另一种方法来设置按钮点击监听
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
//定义三个按钮并实例化MediaPlayer
private MediaPlayer mediaPlayer = new MediaPlayer();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button play = (Button)findViewById(R.id.play);
Button pause = (Button)findViewById(R.id.pause);
Button stop = (Button)findViewById(R.id.stop);
play.setOnClickListener(this);
pause.setOnClickListener(this);
stop.setOnClickListener(this);
if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(MainActivity.this,new String[]{
Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
}else {
initMediaPlayer();//初始化MediaPlayer
}
}
/*
* 初始化MediaPlayer
* */
private void initMediaPlayer(){
try {
File file = new File(Environment.getExternalStorageDirectory(),"music.mp3");
mediaPlayer.setDataSource(file.getPath());//指定音频文件的路径
mediaPlayer.prepare();//让MediaPlayer进入到准备状态
}catch (Exception e){
e.printStackTrace();
}
}
public void onRequestPermissionResult(int requestCode,String[] permissions,int[] grantResults){
switch (requestCode){
case 1:
if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
initMediaPlayer();
}else {
Toast.makeText(this,"拒绝权限将无法使用程序",Toast.LENGTH_SHORT).show();
finish();
}
break;
default:
}
}
@Override
public void onClick(View v){
switch (v.getId()){
case R.id.play:
if(!mediaPlayer.isPlaying()){
mediaPlayer.start();//开始播放
}
break;
case R.id.pause:
if(mediaPlayer.isPlaying()){
mediaPlayer.pause();//暂停播放
}
break;
case R.id.stop:
if(mediaPlayer.isPlaying()){
mediaPlayer.reset();//停止播放
initMediaPlayer();
}
break;
default:
break;
}
}
@Override
protected void onDestroy(){
super.onDestroy();
if(mediaPlayer != null){
mediaPlayer.stop();
mediaPlayer.release();
}
}
}
接下来我么来解释一下这一段代码,看上去还是挺多的。 在类初始化的时候就创建了一个MediaPlayer的实例,然后在onCreate()方法中进行了运行时权限处理,动态申请WRITE_EXTERNAL_STORAGE权限,因为我们的音乐文件是放在手机SD卡里面,所以需要这个权限来访问SD卡。在AndroidManifest.xml中添加这个权限
在onRequestPermissionResult()(你可以把这个方法理解为请求权限结果)方法中,如果你拒绝了这个权限申请,那么就会调用finish方法将程序直接关掉。 用户同意授权之后就会调用initMediaPlayer()方法为MediaPlayer对象进行初始化操作,在initMediaPlayer()方法中,首先是通过创建一个File(文件)对象来指定音频文件的路径,所以我们需要在SD卡的根目录下面放置一个名为music.mp3的音频文件。后面调用setDataSource()和prepare()方法为MediaPlayer做好播放准备。 下面的点击事件中我们对每个按钮进行判断,当点击Play按钮时会进行判断,如果当前MediaPlayer没有正在播放的音频就调用start()方法开始播放。当点击Pause按钮时会进行判断,如果当前MediaPlayer正在播放音频就调用pause()方法暂停播放。当点击Stop按钮时会进行判断,如果当前MediaPlayer正在播放音频就调用reset()方法将MediaPlayer重置为刚刚创建时的状态,然后重新调用一遍initMediaPlayer()方法。 最后在onDestroy()方法中,我们分别调用stop()方法和release()方法,将MediaPlayer相关的资源释放掉。
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Flink实战-定时器实现已完成订单自动五星好评
- 树状数组-HDU3015 Disharmony Trees
- 放弃fastjson,拥抱Jackson
- Spring入门
- 贪心-HDU1789 Doing Homework again(活动安排问题)
- flink实战-实时计算平台通过api停止流任务
- JAVA初级岗面试知识点——基础篇
- flink实战-flink streaming sql 初体验
- flink实战教程-使用set实时计算当天网站uv
- 贪心-HDU3348 coins(钱币问题)
- 归并排序详解 -HDU4911 Inversion(逆序对)
- 数据结构与算法——稀疏数组
- Maven安装配置详细教程
- 数据结构与算法——冒泡排序
- MyBatis Generator逆向工程-你还在手写mapper吗?