音乐播放器(MeidaPlayer)的简单使用

本文详细介绍Android平台MediaPlayer组件的使用方法,包括错误处理、播放流程及案例实现。通过具体实例展示了如何利用MediaPlayer播放本地及网络音乐,并实现了基本的播放器功能如播放、暂停、上一首、下一首等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MediaPlayer的简介:

#Error
* MediaPlayer: error (1, -107) 网络链接错误
* MediaPlayer   error (1, -2147483648) 1其实代表MEDIA_ERROR_UNKNOWN.原因在于,MP4有多种编码格式,例如H.264,H.263等,而Android版本较低的机器只支持部分编码。一旦遭遇不被支持的编码格式,MediaPlayer可能就会抛出上面的错误信息。可以使用一些视频软件查看视频的编码格式,然后转换为普遍支持的格式

# 播放音乐的流程
* 1.拿到mediaPlayer对象
两种方式
* 1.使用 MediaPlayer.create(this, R.raw.hua);的方式 播放的是资源文件夹下面的音乐
create()内部的操作是: new MediaPlayer();-- mp.setDataSource()---mp.prepare();
* 2.使用new MediaPlayer()的形式
* 2.设置播放资源文件的路径
  1)mediaPlayer.setDataSource("mnt/sdcard/hua.mp3"); 可能需要更改sd卡的权限(命令行的形式) 才能导入
* adb shell
* mount -o remount rw /
* chmod 075 sdcard
*
* <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
  2)mediaPlayer.setDataSource(this, Uri.parse("mnt/sdcard/hua.mp3"));
  3)//播放assets目录下的资源
* AssetFileDescriptor fileDescriptor = getAssets().openFd("hua.mp3");
mediaPlayer.setDataSource(fileDescriptor.getFileDescriptor())
4)mediaPlayer.setDataSource("http://172.17.26.115:8080/linzhiling/hua.mp3");//网络地址
<uses-permission android:name="android.permission.INTERNET"/>
* 3. 播放前准备播放mp.prepare();---mediaPlayer.prepareAsync();
* 4.调用方法进行播放


 由于 mediaPlayer调用的是底层的代码 在退出的时候 资源还在占用 音乐还在持续播放 所以.,需要在合适的位置去释放资源
* if (mediaPlayer != null) {
mediaPlayer.release();//释放资源
mediaPlayer = null;
}
* flag记录是否处于暂停状态,如果处于暂停,调用start继续播放,,,否则设置资源,准备然后开始播放

###播放asserts下面的音乐
* 使用asserts下面的文件的时候,可能会出现只播放第一首音乐
mediaPlayer.setDataSource(fd, openFd.getStartOffset(), openFd.getLength())

案例实现:

布局文件:
<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" >


    <ListView
        android:id="@+id/list_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@+id/linear" >
    </ListView>


    <LinearLayout
        android:id="@+id/linear"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:background="#27282A"
        android:orientation="vertical" >


        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:orientation="horizontal" >


            <ImageView
                android:id="@+id/image_pre"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/pre" />


            <ImageView
                android:id="@+id/iamge_play"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/play" />


            <ImageView
                android:id="@+id/image_next"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/next" />
        </LinearLayout>


        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >


            <ImageView
                android:id="@+id/image_touxiang"
                android:layout_width="50dp"
                android:layout_height="50dp"
                android:src="@drawable/ic_launcher" />


            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical" >


                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:orientation="horizontal" >


                    <TextView
                        android:id="@+id/text_name"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="goodTime"
                        android:textColor="#ff0000" />


                    <View
                        android:layout_width="0dp"
                        android:layout_height="0dp"
                        android:layout_weight="1" />


                    <TextView
                        android:id="@+id/text_time"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="00:00/05:17"
                        android:textColor="#ff0000" />
                </LinearLayout>


                <SeekBar
                    android:id="@+id/seek_bar"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content" />
            </LinearLayout>
        </LinearLayout>
    </LinearLayout>

</RelativeLayout>

Activity中的实现:

package com.example.mediaplayer_03;


import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;


import android.app.Activity;
import android.content.res.AssetFileDescriptor;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnPreparedListener;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;


public class MainActivity extends Activity implements OnPreparedListener, OnClickListener {


private ListView listView;
private ImageView image_pre;
private ImageView iamge_play;
private ImageView image_next;
private ImageView image_touxiang;
private TextView text_name;
private TextView text_time;
private SeekBar seekBar;
private List<MusicBean> list;
private MyAdapter myAdapter;

private int index = 0;//播放音乐的位置
private MediaPlayer mediaPlayer;
private boolean flag = false;//记录暂停的状态
private Timer timer;
private int duration;
private Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
if (msg.what == 0) {
//获取内容
int current = (Integer) msg.obj;//10001...>100
//simpleDateFormat.format(new Date(current))
//设置时间的显示
text_time.setText(simpleDateFormat.format(new Date(current))+"/"+simpleDateFormat.format(new Date(duration)));
//例如总时长是1000...当前到了200...确定一下进度条的进度?..200/1000*100=0
seekBar.setProgress(current*100/duration);
}
};
};
private SimpleDateFormat simpleDateFormat;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

//找到控件
listView = (ListView) findViewById(R.id.list_view);
image_pre = (ImageView) findViewById(R.id.image_pre);
iamge_play = (ImageView) findViewById(R.id.iamge_play);
image_next = (ImageView) findViewById(R.id.image_next);
image_touxiang = (ImageView) findViewById(R.id.image_touxiang);
text_name = (TextView) findViewById(R.id.text_name);
text_time = (TextView) findViewById(R.id.text_time);
seekBar = (SeekBar) findViewById(R.id.seek_bar);

//创建一个mediaPlayer
mediaPlayer = new MediaPlayer();
timer = new Timer();
//创建一个事件格式化的对象
simpleDateFormat = new SimpleDateFormat("mm:ss");


//数据展示...
try {
list = new ArrayList<MusicBean>();
list.add(new MusicBean(getAssets().openFd("a.mp3"), "A", R.drawable.a));
list.add(new MusicBean(getAssets().openFd("a.mp3"), "Fade", R.drawable.b));
list.add(new MusicBean(getAssets().openFd("a.mp3"), "画", R.drawable.c));
list.add(new MusicBean(getAssets().openFd("a.mp3"), "Roar", R.drawable.d));
list.add(new MusicBean(getAssets().openFd("a.mp3"), "Sugar", R.drawable.e));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//设置适配器
myAdapter = new MyAdapter(MainActivity.this,list);
listView.setAdapter(myAdapter);

//设置条目的监听事件
listView.setOnItemClickListener(new OnItemClickListener() {


@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
index = position;
//播放音乐
play();
}
});

//给那些图片设置点击事件
iamge_play.setOnClickListener(this);
image_next.setOnClickListener(this);
image_pre.setOnClickListener(this);

//seekBar的监听事件
seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub

}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub

}

@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
// 用户拖动进度条的时候,,,音乐到指定的位置去播放
if (mediaPlayer != null && fromUser) {

//根据拖动到的进度,来计算时间20...20*duration/100
int msec = progress*duration/100;
//音乐到指定的位置去播放
mediaPlayer.seekTo(msec);
}

}
});

}


/**
* 播放音乐的方法
*/
protected void play() {
try {
//2.重置资源
mediaPlayer.reset();

//3.设置数据源
AssetFileDescriptor openFd = list.get(index).getOpenFd();
mediaPlayer.setDataSource(openFd.getFileDescriptor(), openFd.getStartOffset(), openFd.getLength());
//4.准备播放
mediaPlayer.prepareAsync();
//5.准备完成的监听
mediaPlayer.setOnPreparedListener(this);

} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
/**
* 准备完成的回调方法
*/
@Override
public void onPrepared(MediaPlayer mp) {
// 开始播放
mediaPlayer.start();
//图片换成暂停的样式
iamge_play.setImageResource(R.drawable.pause);
//显示歌名
text_name.setText(list.get(index).getName());
//显示头像 
image_touxiang.setImageResource(list.get(index).getImage());
//一旦音乐开始播放,mediaPlayer会有一个总时长的方法
duration = mediaPlayer.getDuration();


//执行一个事件任务,,,一秒执行一次
TimerTask task = new TimerTask() {

@Override
public void run() {
//每隔一秒钟获取一下当前音乐播放的时间
int currentPosition = mediaPlayer.getCurrentPosition();
//设置时间文本的显示需要在主线程中进行
Message msg = Message.obtain();
msg.what = 0;//区分一个消息
msg.obj = currentPosition;//消息的内容
handler.sendMessage(msg);
}
};
timer.schedule(task , 0, 1000);


}


/**
* 图片的点击事件
* @param v
*/
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.iamge_play://播放
//1.如果正在播放需要暂停
if (mediaPlayer.isPlaying()) {//正在播放
mediaPlayer.pause();
//设置暂停状态
flag = true;
//改变图片变成播放的样式
iamge_play.setImageResource(R.drawable.play);
}else {//没有播放:1.压根没开始2.暂停播放的状态
if (flag) {
//继续播放
mediaPlayer.start();
//改变图片变成暂停的样式
iamge_play.setImageResource(R.drawable.pause);
}else {
play();
}
}
break;
case R.id.image_next://下一首
next();

break;
case R.id.image_pre://上一首
pre();
break;


default:
break;
}

}


/**
* 上一首
*/
private void pre() {
if (index <= 0) {
index = list.size();//1..0--4
}
index --;

play();
}


/**
* 下一首
*/
private void next() {
index ++;
//取余
index = index%list.size();

play();

}


}

适配器中:

package com.example.mediaplayer_03;


import java.util.List;


import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;


public class MyAdapter extends BaseAdapter{


private Context context;
private List<MusicBean> list;


public MyAdapter(Context context, List<MusicBean> list) {
this.context = context;
this.list = list;
}


@Override
public int getCount() {
// TODO Auto-generated method stub
return list.size();
}


@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return list.get(position);
}


@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}


@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = View.inflate(context, android.R.layout.simple_list_item_1, null);
holder = new ViewHolder();

holder.textView = (TextView) convertView.findViewById(android.R.id.text1);

convertView.setTag(holder);

}else {
holder = (ViewHolder) convertView.getTag();
}

//赋值
holder.textView.setText(list.get(position).getName());

return convertView;
}

private class ViewHolder{
TextView textView;
}


}

bean文件:

package com.example.mediaplayer_03;


import android.content.res.AssetFileDescriptor;


public class MusicBean {
private AssetFileDescriptor openFd;
private String name;
private int image;


public AssetFileDescriptor getOpenFd() {
return openFd;
}


public void setOpenFd(AssetFileDescriptor openFd) {
this.openFd = openFd;
}


public String getName() {
return name;
}


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


public int getImage() {
return image;
}


public void setImage(int image) {
this.image = image;
}


public MusicBean(AssetFileDescriptor openFd, String name, int image) {
super();
this.openFd = openFd;
this.name = name;
this.image = image;
}


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值