安卓java音乐播放器下一曲_Android应用开发--MP3音乐播放器代码实现(一)

本文主要是介绍安卓java音乐播放器下一曲_Android应用开发--MP3音乐播放器代码实现(一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

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

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

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

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

/**

* 用于从数据库中查询歌曲的信息,保存在List当中

*

* @return

*/

public List getMp3Infos() {

Cursor cursor = getContentResolver().query(

MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null,

MediaStore.Audio.Media.DEFAULT_SORT_ORDER);

List mp3Infos = new ArrayList();

for (int i = 0; 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 mp3Infos) {

List> mp3list = new ArrayList>();

for (Iterator iterator = mp3Infos.iterator(); iterator.hasNext();) {

Mp3Info mp3Info = (Mp3Info) iterator.next();

HashMap map = new HashMap();

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);

}

实现效果如图:

0fdbd67b036183f0dfed792cda68353b.png

需求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);

}

}

}

}

public class MusicActivity extends Activity {

private boolean isStop = false;

private MediaPlayer mPlayer;

public final String TITLE = Environment.getExternalStorageDirectory()

+ "/iwantyourlove.mp3";

private File file;

private SeekBar seekBar;

private ImageView play;

private TextView title;

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.music_main);

initWidgets();

}

// 重新初始化播放器

public void initWidgets() {

play = (ImageView) findViewById(R.id.img_stop);

title = (TextView) findViewById(R.id.title);

seekBar = (SeekBar) findViewById(R.id.seek);

seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

@Override

public void onStopTrackingTouch(SeekBar seekBar) {

//seekBar.setProgress(mPlayer.getCurrentPosition() *seekBar.getMax() / total);

//Log.i("sss", seekBar.getProgress()+"");

//mPlayer.seekTo(mPlayer.getCurrentPosition());

mPlayer.seekTo(seekBar.getProgress() * mPlayer.getDuration() /100 );

}

@Override

public void onStartTrackingTouch(SeekBar seekBar) {

}

@Override

public void onProgressChanged(SeekBar seekBar, int progress,

boolean fromUser) {

//Log.i("progress", ""+progress);

//Log.i("qqq", seekBar.getProgress()+"");

//progress = currentPosition * 100 / duration;

//progress*duration/100

//mPlayer.seekTo(progress * mPlayer.getDuration() /100 );

}

});

file = new File(TITLE);

title.setText(file.getName());

mPlayer = new MediaPlayer();

try {

mPlayer.setDataSource(TITLE);

mPlayer.prepare();

} catch (Exception e) {

e.printStackTrace();

}

}

public void play(View v) {

if (!mPlayer.isPlaying()) {

mPlayer.start();

}

}

public void pause(View v) {

if (mPlayer.isPlaying()) {

mPlayer.pause();

}

}

public void replay(View v) {

mPlayer.reset();

initWidgets();// 重新构建播放器

// mPlayer.start();

play(v);

}

public void stop(View v) {

isStop = true;

mPlayer.stop();

play.setImageResource(R.drawable.player_play);

}

// 用图片代替按钮

public void playOrPause(View v) {

if (isStop) {// 停止后重新开始播放

mPlayer.reset();

initWidgets();

mPlayer.start();

play.setImageResource(R.drawable.player_pause);

isStop = false;

} else if (mPlayer.isPlaying()) {// 播放状态

play.setImageResource(R.drawable.player_play);

mPlayer.pause();

} else {// 暂停状态

play.setImageResource(R.drawable.player_pause);

mPlayer.start();

}

// 异步任务

new MusicTask().execute();

}

@Override

protected void onDestroy() {

super.onDestroy();

// 释放资源

mPlayer.release();

}

// 音乐播放异步任务

class MusicTask extends AsyncTask {

//int current = mPlayer.getCurrentPosition();// 当前播放是什么位置,

int total = mPlayer.getDuration(); // 音乐总共多长时间

@Override

protected Void doInBackground(Void... params) {

// 让SeekBar跟着音乐一起向右边走

while (mPlayer.getCurrentPosition() <= total&&!isStop) {//!isPause不是停止状态

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

publishProgress();

}

return null;

}

@Override

protected void onProgressUpdate(Void... values) {

super.onProgressUpdate(values);

//Log.i("msg", ""+mPlayer.getCurrentPosition() * 100 / total);

seekBar.setProgress(mPlayer.getCurrentPosition() *seekBar.getMax() / total);

}

@Override

protected void onPostExecute(Void result) {

super.onPostExecute(result);

}

}

}

这篇关于安卓java音乐播放器下一曲_Android应用开发--MP3音乐播放器代码实现(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/314338

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,