第九章动画干过一遍了,大部分都能理解套路。接下来学第十章
1、简单的利用MediaPlayer制作音乐播放基础
1.1先看看xml很简单 定义几个基本的按钮
<span style="font-size:18px;"><?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.hejingzhou.mp3.MainActivity">
<TextView
android:id="@+id/textViewshow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:text="State"
android:textAppearance="?android:attr/textAppearanceLarge" />
<Button
android:id="@+id/buttonZanting"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/buttonTingzhi"
android:layout_alignBottom="@+id/buttonTingzhi"
android:layout_toRightOf="@+id/buttonTingzhi"
android:text="暂停" />
<Button
android:id="@+id/buttonKaishi"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/textViewshow"
android:layout_marginTop="112dp"
android:layout_toLeftOf="@+id/buttonTingzhi"
android:text="开始" />
<Button
android:id="@+id/buttonTingzhi"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/buttonKaishi"
android:layout_alignBottom="@+id/buttonKaishi"
android:layout_centerHorizontal="true"
android:text="停止" />
</RelativeLayout></span>
1.2 MainActivity
package com.example.hejingzhou.mp3;
<span style="font-size:18px;">import android.media.MediaPlayer;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.io.File;
public class MainActivity extends AppCompatActivity {
private MediaPlayer mediaPlayer;
private boolean isPause = false;//是否暂停
private File file;
private TextView textView;//声明显示提示信息
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final Button buttonStart = (Button) findViewById(R.id.buttonKaishi);
final Button buttonStop = (Button) findViewById(R.id.buttonTingzhi);
final Button buttonZanting = (Button) findViewById(R.id.Zanting);
final TextView textViewShow = (TextView) findViewById(R.id.textViewshow);
file = new File("/data/mp3.mp3");//获取播放的文件这个文件必须要指定放入同名的mp3文件
if (file.exists()) { //</span><span style="font-size:18px; font-family: Arial, Helvetica, sans-serif;">返回一个boolean值,指示是否可以找到此文件·底层文件系统上。</span><span style="font-size:18px;">
mediaPlayer = MediaPlayer.create(this, Uri.parse(file.getAbsolutePath()));//解析路径文件传递给mediaPlayer对象
} else {
textViewShow.setText("要播放的文件不存在");
buttonStart.setEnabled(false);//设置为Button不在响应
return;
}
/**
* 按键监听
* */
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
//注册一个回调时要调用的媒体源底在回放期间,已达到。
@Override
public void onCompletion(MediaPlayer arg0) {
// TODO Auto-generated method stub
paly();
}
});
</span><pre name="code" class="java"><span style="font-size: 18px;">/**
* 按键监听
* */</span>
buttonStart.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub paly(); if (isPause) { buttonZanting.setText("暂停"); isPause = false; } buttonZanting.setEnabled(true); buttonStop.setEnabled(true); buttonStart.setEnabled(false);//播放不可用 } }); /** * 停止 * */ buttonStop.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub mediaPlayer.stop(); textViewShow.setText("停止播放音频"); buttonZanting.setEnabled(false); buttonStop.setEnabled(false); buttonStart.setEnabled(true);//只允许开始可以操作 } }); /** * 暂停监听 * */ buttonZanting.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub if (mediaPlayer.isPlaying() && !isPause)//如果状态是在监听中,或者是 不是暂停中 { mediaPlayer.pause();//暂停播放 isPause = true; ((Button) arg0).setText("继续"); textViewShow.setText("暂停播放音频"); buttonStart.setEnabled(true); } else { mediaPlayer.start(); ((Button) arg0).setText("暂停"); textViewShow.setText("播放音频"); isPause = false; buttonStart.setEnabled(false); } } }); } /** * 播放 */ private void paly() { try { mediaPlayer.reset(); mediaPlayer.setDataSource(file.getAbsolutePath());//获取文件的绝对路径 mediaPlayer.prepare();//准备播放器 预加载音频 mediaPlayer.start();//开始播放 } catch (Exception e) { e.printStackTrace(); } } @Override protected void onDestroy() { // TODO Auto-generated method stub if (mediaPlayer.isPlaying()) { mediaPlayer.stop(); } mediaPlayer.release();//释放资源 super.onDestroy(); }}
简单的效果:
2、稍微复杂的带有列表的播放器
2.1 xml文件
<span style="font-size:18px;color:#666600;"><?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.hejingzhou.bofangsdquanbuyinpin.MainActivity"
android:background="@drawable/eee">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:id="@+id/linearLayout">
<Button
android:id="@+id/buttnoBrodcast"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="播放"/>
<Button
android:id="@+id/buttnoPause"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="暂停"/>
<Button
android:id="@+id/buttonUp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="上一首"/>
<Button
android:id="@+id/buttonStop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="停止"/>
</LinearLayout>
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:drawSelectorOnTop="false"
android:layout_below="@+id/linearLayout" />
<Button
android:id="@+id/buttonDown"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="下一首"
android:layout_above="@+id/listView"
android:layout_toRightOf="@+id/linearLayout"
android:layout_toEndOf="@+id/linearLayout" />
<!--android:drawSelectorOnTop="true" 点击某一条记录,颜色会显示在最上面,记录上的文字被遮住,所以点击文字不放,文字就看不到
android:drawSelectorOnTop="false" 点击某条记录不放,颜色会在记录的后面,成为背景色,但是记录内容的文字是可见的-->
</RelativeLayout></span><span style="color:#ff0000;">
</span>
2.2MainActivity
package com.example.hejingzhou.bofangsdquanbuyinpin;
<span style="font-size:18px;color:#666600;">import android.media.MediaPlayer;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private MediaPlayer mediaPlayer;
private List<String> audioList = new ArrayList<String>();//定义一个存放音频的List表
private int currentItem = 0;//当前项 当前播放歌曲的索引
private Button buttonPause;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mediaPlayer = new MediaPlayer();//实例化mediaPlayer对象
Button buttonUp = (Button) findViewById(R.id.buttonUp);
Button buttonBrodcast = (Button) findViewById(R.id.buttnoBrodcast);
buttonPause = (Button) findViewById(R.id.buttnoPause);
Button buttonStop = (Button) findViewById(R.id.buttonStop);
Button buttonDown = (Button) findViewById(R.id.buttonDown);
audioList();
/**
* 为MediaPlayer 对象添加完成事件的监听器 在重写onCompletion方法中调用nextMusic()方法播放下一首音乐
* */
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
nextMusic();//播放下一首
}
});
buttonUp.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
preMusic();
}
});
buttonBrodcast.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
playMusic(audioList.get(currentItem));
}
});
buttonPause.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mediaPlayer.isPlaying())
{
mediaPlayer.pause();
((Button)v).setText("继续");
}else
{
mediaPlayer.reset();//继续播放
((Button) v).setText("暂停");
}
}
});
buttonStop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mediaPlayer.isPlaying())
{
mediaPlayer.stop();
}
buttonPause.setEnabled(false);
}
});
buttonDown.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
nextMusic();
}
});
}
private void audioList() {
getFiles("/data/SD/");//自己定 存放资源
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, audioList);//创建一个适配器
ListView listView = (ListView) findViewById(R.id.listView);
listView.setAdapter(adapter);//将list列表设置一个适配器
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
currentItem = position;//将当前项的索引值传递给currentItem
playMusic(audioList.get(currentItem));
}
});
}
/**
* 定义一个保存合法的文件格式的字符串数组,并编写根据文件路径判断文件是否为音频文件方法
* */
private static String[] imageFormatSet = new String[] {"mp3","wav","3gp"};
private static boolean isAudioFile(String path)
{
for(String format : imageFormatSet)
{
if(path.contains(format))//如果包含择个字符
{
return true;
}
}
return
false;
}
/**
* getFiles()函数 查找路径中的所有音频文件 并且将他添加到list里
* */
private void getFiles(String url)
{
File files = new File(url);//创建一个新的文件对象
File[] file = files.listFiles();//listFiles()该方法返回的路径名用于表示此抽象路径名的目录中的文件和目录的数组。
try
{
for(File f : file)//遍历这个数组获取到的文件数组
{
if(f.isDirectory()) //如果是文件夹,那么就递归调用
{
getFiles(f.getPath());//递归
}else
{
if(isAudioFile(f.getPath()))
{
audioList.add(f.getPath());//找到音频文件并且将它添加到audioList表里
}
}
}
}catch (Exception e)
{
e.printStackTrace();
}
}
/**
* 播放
*/
void playMusic(String path) {
try {
if (mediaPlayer.isPlaying()) {
mediaPlayer.stop();
}
mediaPlayer.reset();
mediaPlayer.setDataSource(path);//指定要播放文件的路径
mediaPlayer.prepare();//预加载音频文件
mediaPlayer.start();//播放音频
buttonPause.setText("暂停");
buttonPause.setEnabled(true);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 下一首
* */
void nextMusic()
{
if(++currentItem >= audioList.size())//当对currentItem 进行+1操作后,如果其值大于等于音频文件的总数
{
currentItem = 0;
}
playMusic(audioList.get(currentItem));//调用playMusic()方法播放音乐
}
/**
* 上一首
* */
void preMusic()
{
if(--currentItem >= 0)// 当对currentItem进行-1操作后 如果对其值大于等于0
{
if(currentItem >= audioList.size())//如果currentItem的值大于等于音频总数
{
currentItem = 0;
}
}else
{
currentItem = audioList.size() - 1;
}
playMusic(audioList.get(currentItem));
}
}</span>
存放指定文件路径
效果
源代码 : http://download.csdn.net/detail/csdnhejingzhou/9368472