详解Android应用开发--MP3音乐播放器代码实现(一)

需求1:将内存卡中的MP3音乐读取出来并显示到列表当中

1.从数据库中查询所有音乐数据,保存到List集合当中,List当中存放的是Mp3Info对象

2.迭代List集合,把每一个Mp3Info对象的所有属性,保存到Map对象当中

3.定义一个List集合,把Map对象添加到List集合当中

4.通过定义一个SimpleAdpter,调用setAdpter方法,将数据显示到列表当中

/**
* 用于从数据库中查询歌曲的信息,保存在List当中
*
* @return
*/
public List<Mp3Info> getMp3Infos() {
  Cursor cursor = getContentResolver().query(
    MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null,
    MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
  List<Mp3Info> mp3Infos = new ArrayList<Mp3Info>();
  for (int i = 0; i < cursor.getCount(); i++) {
    Mp3Info mp3Info = new Mp3Info();
    cursor.moveToNext();
    long id = cursor.getLong(cursor
      .getColumnIndex(MediaStore.Audio.Media._ID));  //音乐id
    String title = cursor.getString((cursor
      .getColumnIndex(MediaStore.Audio.Media.TITLE)));//音乐标题
    String artist = cursor.getString(cursor
      .getColumnIndex(MediaStore.Audio.Media.ARTIST));//艺术家
    long duration = cursor.getLong(cursor
      .getColumnIndex(MediaStore.Audio.Media.DURATION));//时长
    long size = cursor.getLong(cursor
      .getColumnIndex(MediaStore.Audio.Media.SIZE)); //文件大小
    String url = cursor.getString(cursor
      .getColumnIndex(MediaStore.Audio.Media.DATA));       //文件路径
  int isMusic = cursor.getInt(cursor
    .getColumnIndex(MediaStore.Audio.Media.IS_MUSIC));//是否为音乐
  if (isMusic != 0) {   //只把音乐添加到集合当中
    mp3Info.setId(id);
    mp3Info.setTitle(title);
    mp3Info.setArtist(artist);
    mp3Info.setDuration(duration);
    mp3Info.setSize(size);
    mp3Info.setUrl(url);
    mp3Infos.add(mp3Info);
    }
  }
return mp3Infos;
}
/**
   * 填充列表
   * @param mp3Infos
   */
  public void setListAdpter(List<Mp3Info> mp3Infos) {
    List<HashMap<String, String>> mp3list = new ArrayList<HashMap<String, String>>();
    for (Iterator iterator = mp3Infos.iterator(); iterator.hasNext();) {
      Mp3Info mp3Info = (Mp3Info) iterator.next();
      HashMap<String, String> map = new HashMap<String, String>();
      map.put("title", mp3Info.getTitle());
      map.put("Artist", mp3Info.getArtist());
      map.put("duration", String.valueOf(mp3Info.getDuration()));
      map.put("size", String.valueOf(mp3Info.getSize()));
      map.put("url", mp3Info.getUrl());
      mp3list.add(map);
    }
    mAdapter = new SimpleAdapter(this, mp3list,
        R.layout.music_list_item_layout, new String[] { "title", "Artist", "duration" },
        new int[] { R.id.music_title, R.id.music_Artist, R.id.music_duration });
    mMusiclist.setAdapter(mAdapter);
  }

实现效果如图:

需求2:点击列表的每一项,启动一个服务来播放音乐

1.   注册条目点击监听器OnItemClickListener

2.   定义一个实现OnItemClickListener接口的内部类

3.   定义一个继承Service的服务类PlayerServie

1.   注册条目点击监听器OnItemClickListener

mMusiclist = (ListView) findViewById(R.id.music_list);
    mMusiclist.setOnItemClickListener(new MusicListItemClickListener());
    mp3Infos = getMp3Infos();
    setListAdpter(getMp3Infos());

2.   定义一个实现OnItemClickListener接口的内部类

private class MusicListItemClickListener implements OnItemClickListener {
  @Override
  public void onItemClick(AdapterView<?> parent, View view, int position,
      long id) {
    if(mp3Infos != null) {
      Mp3Info mp3Info = mp3Infos.get(position);
      Log.d("mp3Info-->", mp3Info.toString());
      Intent intent = new Intent();
      intent.putExtra("url", mp3Info.getUrl());
      intent.putExtra("MSG", AppConstant.PlayerMsg.PLAY_MSG);
      intent.setClass(MainActivity.this, PlayerService.class);
      startService(intent);    //启动服务
    }
  }
}

3.   定义一个继承Service的服务类PlayerServie(未完善的Service类)

package com.wwj.sb.service; 

import android.annotation.SuppressLint;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnPreparedListener;
import android.os.IBinder; 

import com.wwj.sb.domain.AppConstant; 

@SuppressLint("NewApi")
public class PlayerService extends Service {
  private MediaPlayer mediaPlayer = new MediaPlayer();    //媒体播放器对象
  private String path;            //音乐文件路径
  private boolean isPause;          //暂停状态 

  @Override
  public IBinder onBind(Intent arg0) {
    return null;
  } 

  @Override
  public int onStartCommand(Intent intent, int flags, int startId) {
    if(mediaPlayer.isPlaying()) {
      stop();
    }
    path = intent.getStringExtra("url");
    int msg = intent.getIntExtra("MSG", 0);
    if(msg == AppConstant.PlayerMsg.PLAY_MSG) {
      play(0);
    } else if(msg == AppConstant.PlayerMsg.PAUSE_MSG) {
      pause();
    } else if(msg == AppConstant.PlayerMsg.STOP_MSG) {
      stop();
    }
    return super.onStartCommand(intent, flags, startId);
  } 

  /**
   * 播放音乐
   * @param position
   */
  private void play(int position) {
    try {
      mediaPlayer.reset();//把各项参数恢复到初始状态
      mediaPlayer.setDataSource(path);
      mediaPlayer.prepare(); //进行缓冲
      mediaPlayer.setOnPreparedListener(new PreparedListener(position));//注册一个监听器
    }
    catch (Exception e) {
      e.printStackTrace();
    }
  } 

  /**
   * 暂停音乐
   */
  private void pause() {
    if (mediaPlayer != null && mediaPlayer.isPlaying()) {
      mediaPlayer.pause();
      isPause = true;
    }
  } 

  /**
   * 停止音乐
   */
  private void stop(){
    if(mediaPlayer != null) {
      mediaPlayer.stop();
      try {
        mediaPlayer.prepare(); // 在调用stop后如果需要再次通过start进行播放,需要之前调用prepare函数
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
  } 

  @Override
  public void onDestroy() {
    if(mediaPlayer != null){
      mediaPlayer.stop();
      mediaPlayer.release();
    }
  }
  /**
   *
   * 实现一个OnPrepareLister接口,当音乐准备好的时候开始播放
   *
   */
  private final class PreparedListener implements OnPreparedListener {
    private int positon; 

    public PreparedListener(int positon) {
      this.positon = positon;
    } 

    @Override
    public void onPrepared(MediaPlayer mp) {
      mediaPlayer.start();  //开始播放
      if(positon > 0) {  //如果音乐不是从头播放
        mediaPlayer.seekTo(positon);
      }
    }
  } 

}

以上代码实现了两个需求,显示音乐列表和实现列表点击事件启动Servic。下次会实现控制音乐播放的需求。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android递归方式删除某文件夹下的所有文件(.mp3文件等等)

    1.由于需要删除文件,因此需要如下权限: <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> 2.核心代码 复制代码 代码如下: package com.example.deleteyoumi; import java.io.File; import android.os.Bundle; import android.os.Han

  • Android编程实现播放MP3功能示例

    本文实例讲述了Android编程实现播放MP3功能.分享给大家供大家参考,具体如下: 在android中播放mp3非常简单,也是项目中经常使用的,比如说要做项目的背景音乐,应用中某些功能的提示音等的.应用非常广泛,下面提供一个简单的使用实例: layout文件的配置: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.and

  • 比较完整的android MP3 LRC歌词滚动高亮显示(附源码)

    1.以前的滚动只是安行来刷新,现在不是按行来滚动了,其实就是在一定时间内整体往上移动,比如说在1S内刷新10次,由于认得肉眼看起来像是滚动. 关键代码如下: 复制代码 代码如下: float plus = currentDunringTime == 0 ? 30                : 30                        + (((float) currentTime - (float) sentenctTime) / (float) currentDunringTim

  • Android实现使用流媒体播放远程mp3文件的方法

    本文实例讲述了Android实现使用流媒体播放远程mp3文件的方法.分享给大家供大家参考,具体如下: package com.shadow.util; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.

  • Android录制mp3格式文件

    前言 最近做一个即时通信类的项目,由于要保证pc端,iOS端和Android端的通用性,最终统一为MP3格式,一直担心MP3格式会不会很大,但是实测还是可以接受的.下面来看看具体步骤: 工具 MP3格式是用一个开源项目转的,MP3lame,由于该项目用到了jni,所以需要大家配置好ndk环境,环境配置在此就不多说了,大家可以自行百度,最新的应该很好配置. 创建jni 拷贝文件 下载好后(我下载的是3.98.4版本)打开,找到libmp3lame文件,将里面的.h和.c拷贝下来,在自己的工程里创建

  • 利用libmp3lame实现在Android上录音MP3文件示例

    之前项目需要实现MP3的录音,于是使用上了Lame这个库.这次做一个demo,使用AndroidStudio+Cmake+NDK进行开发.利用Android SDK提供的AndroidRecorder进行录音,得到PCM数据,并使用jni调用Lame这个C库将PCM数据转换为MP3文件.并使用MediaPlayer对录音的MP3文件进行播放.另外此次的按键是仿微信的语音按键,按下录音,松开结束,若中途上滑松开即取消 效果如下: 项目地址: LameMp3ForAndroid_jb51.rar 一

  • 详解Android应用开发--MP3音乐播放器代码实现(一)

    需求1:将内存卡中的MP3音乐读取出来并显示到列表当中 1.从数据库中查询所有音乐数据,保存到List集合当中,List当中存放的是Mp3Info对象 2.迭代List集合,把每一个Mp3Info对象的所有属性,保存到Map对象当中 3.定义一个List集合,把Map对象添加到List集合当中 4.通过定义一个SimpleAdpter,调用setAdpter方法,将数据显示到列表当中 /** * 用于从数据库中查询歌曲的信息,保存在List当中 * * @return */ public Lis

  • Android实现简易的音乐播放器

    本文实例为大家分享了Android实现简易的音乐播放器,供大家参考,具体内容如下 功能介绍 本次实验实现的是使用Andriod Studio开发一个简易的音乐播放器,所包含的功能有音乐的播放.暂停.上一曲.下一曲.音乐播放的进度以及手动拖动来控制音乐的播放进度. 实现过程 导入项目所需的音乐文件.图标.背景等 1.创建一个raw文件夹,将音乐文件导入到这个文件夹中,方便我们在项目中使用 2.在drawable中导入所需的图片.图标 设计UI界面 1.设计5个button控件,分别对应上一曲,下一

  • Android开发简易音乐播放器

    这里介绍一个简易的音乐播放器,供大家参考,具体内容如下 效果图如下: 但是,由于这是一个简易版的音乐播放器,所播放的音乐只有一首,且被写死,但,操作却十分简单,方便理解! 这是代码的主要设计: 音乐主要存放在这一个文件中: 下面就来介绍各部分代码: activity-main.xml: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://

  • Android基于Service的音乐播放器

    本文开发一个基于Service的音乐播放器,音乐由后台运行的Service负责播放,当后台的播放状态发生变化时,程序将会通过发送广播通知前台Activity更新界面:当点击Activity的界面按钮时,系统将通过发送广播通知后台Service来改变播放状态. 前台Activity界面有两个按钮,分别用于控制播放/暂停.停止,另外还有两个文本框,用于显示正在播放的歌曲名.歌手名.前台Activity的代码如下: public class MainActivity extends AppCompat

  • Android实现简单的音乐播放器

    本文实例为大家分享了Android实现简单音乐播放器的具体代码,供大家参考,具体内容如下 1.制作一个简易的音乐播放器 使用软件:Android studio + jdk1.8 + Gradle6.5(其他版本也可以) 2.activity_main.xml文件(主页面的编写) 先看一下示意图再来排版(音乐板块的模型看的是某云) 分3个部分来看,第一个是音乐的标题,就是Sky_High.No Copyright Sounds和那个圆形的可以转动的图标. <ImageView     androi

  • 基于python实现音乐播放器代码实例

    核心播放模块(pygame内核) import time import pygame import easygui as gui file = r'D:\CloudMusic\G.E.M.邓紫棋,艾热 - 光年之外 (热爱版).mp3' #这里为音乐文件路径 pygame.mixer.init() gui.msgbox("正在播放"+file) track = pygame.mixer.music.load(file) pygame.mixer.music.play() time.sl

  • 详解Android应用开发中Intent的作用及使用方法

    Intent是一种运行时绑定(run-time binding)机制,它能在程序运行过程中连接两个不同的组件.通过Intent,你的程序可以向Android表达某种请求或者意愿,Android会根据意愿的内容选择适当的组件来完成请求.比如,有一个Activity希望打开网页浏览器查看某一网页的内容,那么这个Activity只需要发出WEB_SEARCH_ACTION给Android,Android就会根据Intent的请求内容,查询各组件注册时声明的IntentFilter,找到网页浏览器的Ac

  • 详解Android MVP开发模式

    本文主要讲解MVP开发模式以及具体实例. 一.简介 MVP(Model View Presenter)模式是著名的MVC(Model View Controller)模式的一个演化版本,目前它在Android应用开发中越来越重要了.初看起来我们会感觉增加了很多类接口代码看起来更加清晰. MVP模式可以分离显示层和逻辑层,所以功能接口如何工作与功能的展示可以实现分离,MVP模式理想化地可以实现同一份逻辑代码搭配不同的显示界面.不过MVP不是一个结构化的模式,它只是负责显示层而已,任何时候都可以在自

  • 详解Android 传感器开发 完全解析

    大家好,由于最近会有对智能硬件相关的开发需求,所以最近这些天分享的博文也就大致挂钩智能硬件了,像上一篇的蓝牙分享,相信很多读者已经看过了,那么今天我为大家带来Android传感器方面知识的介绍与使用方法,对于传感器的使用,不同版本的Android手机也许存在较大的硬件差异,但是万变不离其宗,本篇将通过几个最常见的传感器,渗透式的教会大家如何使用这些传感器,带领大家完成这部分的进阶提高.让每一位Android开发者都对传感器的使用变得游刃有余. 1.Android的三大类传感器 Android传感

  • 实例详解Android快速开发工具类总结

    一.日志工具类 Log.java public class L { private L() { /* 不可被实例化 */ throw new UnsupportedOperationException("Cannot be instantiated!"); } // 是否需要打印bug,可以在application的onCreate函数里面初始化 public static boolean isDebug = true; private static final String TAG

随机推荐