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

xiaoxiao2021-02-28  30

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; } }
转载请注明原文地址: https://www.6miu.com/read-2625565.html

最新回复(0)