`
myclover
  • 浏览: 195179 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

android中播放音乐的实例

阅读更多
在android中使用MediaPlayer播放音乐的实例。
package com.myclover.music;

import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.List;

import android.app.ListActivity;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class MusicPlayActivity extends ListActivity {
	
	private static final String TAG = "MusicPlayActivity";
	//sdcard卡路径
	private static final String MUSIC_PATH = "/sdcard/";
	//媒体对象
	private MediaPlayer mediaPlayer;
	//存放音乐名称
	private List<String> musicList = new ArrayList<String>();
	//播放列表索引
	private int currentMusicIndex = 0;
	//显示当前播放的文件信息
	private TextView playingMusic;

	@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        //实例化媒体对象
        mediaPlayer = new MediaPlayer();
        
        //如果读取的是res下的raw文件夹中的文件,则采用以下方式,一般是背景音乐的时候采用该方式
//        mediaPlayer = MediaPlayer.create(MusicPlayActivity.this, R.raw.wait);
        //设置循环播放
//        mediaPlayer.setLooping(true);
        
        //初始化音乐列表
        initMusicList();
        
        //上一曲图片按钮
        ImageButton previousBtn = (ImageButton)findViewById(R.id.previousBtn);
        //停止图片按钮
        ImageButton stopBtn = (ImageButton)findViewById(R.id.stopBtn);
        //开始图片按钮
        ImageButton startBtn = (ImageButton)findViewById(R.id.startBtn);
        //暂停图片按钮
        ImageButton pauseBtn = (ImageButton)findViewById(R.id.pauseBtn);
        //下一曲图片按钮
        ImageButton nextBtn = (ImageButton)findViewById(R.id.nextBtn);
        playingMusic = (TextView)findViewById(R.id.playingMusic);
        
        previousBtn.setOnClickListener(listener);
        stopBtn.setOnClickListener(listener);
        startBtn.setOnClickListener(listener);
        pauseBtn.setOnClickListener(listener);
        nextBtn.setOnClickListener(listener);
        
    }
	
	//定义一个监听器变量
	private View.OnClickListener listener = new View.OnClickListener() {
		@Override
		public void onClick(View v) {
			Log.i(TAG, "musicList size = " + musicList.size());
			if(musicList.size() > 0){
				ImageButton imgBtn = (ImageButton)v;
				switch (imgBtn.getId()) {
				case R.id.previousBtn:
					//上一首歌曲
					playPreviousMusic();
					break;
				case R.id.stopBtn:
					//停止当前播放的歌曲
					if(mediaPlayer.isPlaying()){
						mediaPlayer.reset();
					}else{
						Toast.makeText(MusicPlayActivity.this, R.string.noPlaying, Toast.LENGTH_LONG).show();
					}
					break;
				case R.id.startBtn:
					//开始播放
					playMusic(MUSIC_PATH + musicList.get(currentMusicIndex));
					break;
				case R.id.pauseBtn:
					//暂停播放
					if(mediaPlayer.isPlaying()){
						//如果文件正在播放,则暂停
						mediaPlayer.pause();
					}else{
						//文件不在播放,则进行播放
						mediaPlayer.start();
					}
					break;
				case R.id.nextBtn:
					//下一首歌曲
					playNextMusic();
					break;
				}
			}else{
				//如果sdcard卡中没有匹配的音乐文件,则给出相应的提示
				Toast.makeText(MusicPlayActivity.this, R.string.notExistsMusic, Toast.LENGTH_LONG).show();
			}
		}
	};
	
	//定义一个内部类,实现文件的过滤
	class MusicFileFilter implements FilenameFilter{
		@Override
		public boolean accept(File dir, String filename) {
			return (filename.endsWith(".mp3") || filename.endsWith(".wav"));
		}
	}
	
	//初始化音乐文件列表
	private void initMusicList(){
		File files = new File(MUSIC_PATH);
		if(!files.exists() || !files.isDirectory()){
			return;
		}
		MusicFileFilter musicFilter = new MusicFileFilter();
		if(files.listFiles(musicFilter).length > 0){
			for(File f : files.listFiles(musicFilter)){
				musicList.add(f.getName());
			}
			//构建一个ArrayAdapter
			ArrayAdapter<String> musicAdapter = new ArrayAdapter<String>(MusicPlayActivity.this,R.layout.music, musicList);
			//设置显示列表,继承了ListActivity类才有该方法
			setListAdapter(musicAdapter);
		}
	}
	
	/**
	 * 播放音乐
	 * @param musicPath 音乐文件所在的路径
	 */
	private void playMusic(String musicPath){
		try {
			//重置mediaPlayer实例,reset之后处于空闲状态
			mediaPlayer.reset();
			//设置需要播放的音乐文件的路径,只有设置了文件路径之后才能调用prepare
			mediaPlayer.setDataSource(musicPath);
			//准备播放,只有调用了prepare之后才能调用start
			mediaPlayer.prepare();
			//开始播放
			mediaPlayer.start();
			Log.i(TAG, "playMusic currentMusicIndex = " + currentMusicIndex);
			playingMusic.setText(getString(R.string.palyingMusic) + musicList.get(currentMusicIndex));
			mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
				@Override
				public void onCompletion(MediaPlayer mp) {
					//顺序播放
					playNextMusic();
				}
			});
		} catch (Exception e) {
			Log.e(TAG, "playMusic error " + e);
		} 
	}
	
	//下一曲
	private void playNextMusic(){
		Log.i(TAG, "playNextMusic currentMusicIndex = " + currentMusicIndex);
		//如果当前已经到最后一曲,则再下一曲就变为第一曲
		if(++currentMusicIndex >= musicList.size()){
			currentMusicIndex = 0;
		}
		playMusic(MUSIC_PATH + musicList.get(currentMusicIndex));
	}
	
	//上一曲
	private void playPreviousMusic(){
		Log.i(TAG, "playPreviousMusic currentMusicIndex = " + currentMusicIndex);
		//如果当前已经是第一曲,则再上一曲变为最后一曲
		if(--currentMusicIndex < 0){
			currentMusicIndex = musicList.size() - 1;
		}
		playMusic(MUSIC_PATH + musicList.get(currentMusicIndex));
	}

	@Override
	protected void onListItemClick(ListView l, View v, int position, long id) {
		//点击音乐列表进行播放当前点击的音乐文件
		currentMusicIndex = position;
		playMusic(MUSIC_PATH + musicList.get(currentMusicIndex));
	}

	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		//如果按了返回键之后进行停止并退出应用
		if(keyCode == KeyEvent.KEYCODE_BACK){
			if(mediaPlayer.isPlaying()){
				mediaPlayer.stop();
			}
			//应用退出之前释放媒体资源,处于结束状态
			mediaPlayer.release();
			MusicPlayActivity.this.finish();
			return true;
		}
		return super.onKeyDown(keyCode, event);
	}

}
分享到:
评论

相关推荐

    Android实例之MediaPlayer播放音乐和视频

    在这个实例中,可能还包含了如何在用户界面(UI)上集成MediaPlayer控件,如使用Button来控制播放、暂停和停止,或者使用SeekBar来调整播放进度。可能还会涉及监听MediaPlayer的状态变化,例如通过实现`...

    Android 使用mediaplayer播放res/raw文件夹中的音乐的实例

    Android 使用mediaplayer播放res/raw文件夹中的音乐的实例 (1)在res文件夹中新建一个文件夹重命名为raw,并且将要播放的音乐放到raw文件夹里面 (2)修改layout目录下的xml布局文件,添加3个按钮空间和一个文本...

    android声音播放实例

    在描述中提到的"android声音播放实例",可能是一个简单的应用示例,展示了如何使用`MediaPlayer`来播放音频文件。`MediaPlayer`提供了创建、加载、播放、控制和销毁音频资源的方法。 1. 创建`MediaPlayer`对象:...

    Android音乐播放器实例教学Demo

    在音乐播放器中,Service用于在后台持续播放音乐,即使用户离开应用,音乐依然可以继续播放。开发者需要理解如何创建和启动Service,以及如何在Service中处理音频流。 2. **Fragment**:Fragment是Android应用程序...

    Android实例之音乐播放器

    可以使用`MediaMetadataRetriever`类获取音频文件的基本信息,如专辑封面、艺术家名等,而无需实际播放音乐。同时,通过`AsyncTask`或`IntentService`在后台线程加载大文件,避免阻塞主线程。 最后,别忘了处理权限...

    Android播放音乐APP

    在Android中,长时间运行的任务(如播放音乐)通常需要在后台进行,这就需要用到`Service`。我们可以创建一个`IntentService`或者普通的`Service`,在这里处理音乐的播放逻辑,这样即使用户离开应用程序,音乐也...

    Android保活之循环播放无声音乐

    "循环播放无声音乐"是一种常见的保活策略,它利用了Android系统对媒体播放服务的优先级处理,使得应用能在后台保持活动状态。以下是对这一技术的详细解读。 1. **Android后台服务** Android系统允许开发者创建服务...

    Android MediaPlayer播放mp3的实例.doc

    "Android MediaPlayer播放mp3的实例" Android 中的 MediaPlayer 是一个功能强大且复杂的媒体播放器,可以播放音频和视频文件。在 Android 的界面上,Music 和 Video 两个应用程序都是调用 MediaPlayer 实现的。...

    android控制左右声道实例

    本实例将探讨如何在Android应用中通过调用API来调整左右声道的声音输出,从而实现立体声效果的定制。 首先,我们需要理解Android的音频框架。Android的音频系统基于OpenSL ES,这是一个跨平台的API,提供了丰富的...

    Android使用Service播放音乐

    在Android中,`Service`是一种没有用户界面的组件,它通常用于执行长时间运行的任务,如播放音乐、下载数据等。`Service`有两种启动方式:通过`startService()`启动(异步执行,可以随时停止)和通过`bindService()`...

    Android 实例 源码 39个

    9. 第三方库集成:许多第三方库如ButterKnife、Dagger2、Retrofit、RxJava等简化了开发流程,实例中可能会包含这些库的使用教程。 10. 性能优化:包括内存管理、UI流畅性、耗电优化等,"性能监控与调试"实例可以...

    android应用播放raw文件中的音乐

    4. **播放音乐**:调用`start()`方法来开始播放音频: ```java mediaPlayer.start(); ``` 5. **控制和管理播放**:你可以使用`MediaPlayer`提供的其他方法来控制播放,如暂停(`pause()`)、停止(`stop()`)、重置...

    android studio手机MP3音乐播放器

    开发者需要实例化`MediaPlayer`对象,设置数据源,准备并开始播放音乐。 4. **MediaController类**:提供了一个UI控件,用于展示音乐播放的控制按钮,如播放/暂停、前进、后退等,同时可以显示歌曲进度。 5. **UI...

    android音乐播放器源码实例

    - `MediaPlayer`通常与`Service`结合使用,即使在应用后台运行,也能持续播放音乐。` foreground service `可以确保即使在锁屏或应用被切换到后台时,音乐也不会被中断。 5. **通知栏控制** - 当音乐在后台播放时...

    android 播放背景音乐

    在Android平台上实现背景音乐播放是开发游戏或应用时常见的需求,它可以为用户提供更沉浸式的体验...例如,可以使用服务(Service)来在后台持续播放音乐,或者使用音乐播放库(如ExoPlayer)以获得更好的性能和控制。

    android暂停或停止其他音乐播放器的播放实现代码

    在Android平台上,开发一款音乐播放器时,有时我们需要控制或与其他音乐播放器进行交互,比如在用户切换到我们的应用时暂停其他正在播放的音乐。这个功能可以通过发送自定义广播(Broadcast)并监听特定的意图...

    Android上百实例源码

    5. **服务(Service)**:Android Service用于在后台长时间运行,实例可能包括音乐播放服务、定时任务服务等,教你如何正确管理和使用服务。 6. **广播接收器(BroadcastReceiver)**:广播接收器可以监听系统或...

    Android实例源码-音乐播放器类安卓源代码(9例).zip

    Android多线程断点续传下载+在线播放音乐 GL音乐播放器 基于SDL、FFmpeg的android播放器源码 简单实用的音乐播放器 简单音乐播放器,实现了播放器基本功能,使用service后台播放音乐,并使用异步线程加载音乐图片 边...

Global site tag (gtag.js) - Google Analytics