热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android音乐播放器【安卓进化二十】

今日看书,看到这个播放器,我就写了个例子,感觉还行,这个播放器能播放后缀是。MP3的音乐,这个例子在main.xml设置listView的时候,注意:andr

                今日看书,看到这个播放器,我就写了个例子,感觉还行,这个播放器能播放后缀是。MP3的音乐,这个例子在main.xml设置listView的时候,注意:android:id="@+id/android:list"的设置,否则程序会报错,说找不到listview。这个效果还是不错的。可以当做是简单的音乐播放器,可以读取sdcard里面后缀是。MP3的歌曲。有问题可以留言,想要源码可以留言,这个代码比较简单。转载请标明出处:

http://blog.csdn.net/wdaming1986/article/details/6768884

csdn资源下载链接地址http://download.csdn.net/detail/wdaming1986/3611735

 

                           看程序效果图:可以点击每首歌播放,

                       也可以用下面的按钮:                                                         修改后的程序加了滚动条了

                                                        

 

代码说明一切:

一、MainActivity。java类中的代码:

package com.cn.daming;

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

import android.app.ListActivity;
import android.graphics.Color;
import android.graphics.drawable.GradientDrawable;
import android.graphics.drawable.GradientDrawable.Orientation;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;
import android.os.Handler;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;

public class MainActivity extends ListActivity {

	private ImageButton mFrOntImageButton= null;
	private ImageButton mStopImageButton = null;
	private ImageButton mStartImageButton = null;
	private ImageButton mPauseImageButton = null;
	private ImageButton mNextImageButton = null;

	/*定义进度handler,显示百分比进度*/
	Handler mPercentHandler = new Handler();

	private SeekBar     mSeekBar=null;
	private TextView curProgressText=null;
	private TextView curtimeAndTotaltime=null;

	
	public MediaPlayer mMediaPlayer;
	private List mMusicList = new ArrayList();
	private int currentListItem = 0;
	
	private static final String MUSIC_PATH = new String("/sdcard/");
	
	@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        drawBackground();  
        setContentView(R.layout.main);
        musicList();
        mMediaPlayer = new MediaPlayer();
        initmFrontMusic();
        initStopMusic();
        initStartMusic();
        initPauseMusic();
        initNextMusic();
        initSeekBar();
    }
	
	 public void drawBackground()  
	     {  
	         GradientDrawable grad = new GradientDrawable(   
	                    Orientation.TL_BR,  
	                    new int[] {
		                    		   Color.rgb(0, 0, 127),  
		                               Color.rgb(0, 0, 255),  
		                               Color.rgb(127, 0, 255),  
		                               Color.rgb(127, 127, 255),  
		                               Color.rgb(127, 255, 255),  
		                               Color.rgb(255, 255, 255)
	                               }   
	         );   
	   
	         this.getWindow().setBackgroundDrawable(grad);  
	     }  

	
	public void initmFrontMusic()
	{
		mFrOntImageButton= (ImageButton)findViewById(R.id.front_button);
		mFrontImageButton.setOnClickListener(new OnClickListener(){

			public void onClick(View arg0) {
            	if(--currentListItem >= 0){
            		currentListItem = mMusicList.size();
            	}else{
            		playMusic(MUSIC_PATH + mMusicList.get(currentListItem));
            	}
			}
		});
	}
	
	public void initStopMusic()
	{
		mStopImageButton = (ImageButton)findViewById(R.id.stop_button);
		mStopImageButton.setOnClickListener(new OnClickListener(){

			public void onClick(View arg0) {
				if(mMediaPlayer.isPlaying())
				{
					mMediaPlayer.reset();
				}
			}
		});
	}
	
	public void initStartMusic()
	{
		mStartImageButton = (ImageButton)findViewById(R.id.start_button);
		mStartImageButton.setOnClickListener(new OnClickListener(){

			public void onClick(View arg0) {
				playMusic(MUSIC_PATH + mMusicList.get(currentListItem));
				startSeekBarUpdate();
			}
		});
	}
	
	public void initPauseMusic()
	{
		mPauseImageButton = (ImageButton)findViewById(R.id.pause_button);
		mPauseImageButton.setOnClickListener(new OnClickListener(){

			public void onClick(View arg0) {
				if(mMediaPlayer.isPlaying()){
					mMediaPlayer.pause();
				}
				else{
					mMediaPlayer.start();
				}
			}
		});
	}
	
	public void initNextMusic()
	{
		mNextImageButton = (ImageButton)findViewById(R.id.next_button);
		mNextImageButton.setOnClickListener(new OnClickListener(){

			public void onClick(View arg0) {
				nextMusic();
			}
		});
	}
	
	public void initSeekBar()
	{
		/*初始化拖动条和当前进度显示值*/
        mSeekBar=(SeekBar)findViewById(R.id.SeekBar01);
        curProgressText=(TextView)findViewById(R.id.currentProgress);
        curtimeAndTotaltime=(TextView)findViewById(R.id.curtimeandtotaltime);
        
		mSeekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

			public void onProgressChanged(SeekBar seekBar, int progress,
					boolean fromUser) {
				/* 如果拖动进度发生改变,则显示当前进度值 */
				curProgressText.setText("当前进度: " + progress);
			}

			public void onStartTrackingTouch(SeekBar arg0) {
				curProgressText.setText("拖动中...");
			}

			public void onStopTrackingTouch(SeekBar arg0) {
				int dest = mSeekBar.getProgress();    
				int mMax = mMediaPlayer.getDuration();
				int sMax = mSeekBar.getMax();

				mMediaPlayer.seekTo(mMax*dest/sMax);

			}
		});
	}
	
	private void playMusic(String path)
	{
		try {
			mMediaPlayer.reset();
			mMediaPlayer.setDataSource(path);
			mMediaPlayer.prepare();
			mMediaPlayer.start();
			mMediaPlayer.setOnCompletionListener(new OnCompletionListener(){

				public void onCompletion(MediaPlayer arg0) {
					nextMusic();
				}
			});
		 }catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	private void nextMusic()
	{
		if(++currentListItem >= mMusicList.size())
		{
			currentListItem = 0;
		}
		else
		{
			playMusic(MUSIC_PATH + mMusicList.get(currentListItem));
		}
	}
	
	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
        if(keyCode == KeyEvent.KEYCODE_BACK){
        	mMediaPlayer.stop();
        	mMediaPlayer.release();
        }
		return super.onKeyDown(keyCode, event);
	}

	@Override
	protected void onListItemClick(ListView l, View v, int position, long id) {
		currentListItem = position;
		playMusic(MUSIC_PATH + mMusicList.get(position));
		super.onListItemClick(l, v, position, id);
	}

	//播放列表
	public void musicList()
	{
		File home = new File(MUSIC_PATH);
		if(home.listFiles(new MusicFilter()).length > 0)
		{
			for(File file : home.listFiles(new MusicFilter()))
			{
				mMusicList.add(file.getName());
			}
			ArrayAdapter musicList = new ArrayAdapter(MainActivity.this,R.layout.musicitem,mMusicList);
			setListAdapter(musicList);
		}
	}
	
	/*更新拖动条进度*/

	public void startSeekBarUpdate() {
		mPercentHandler.post(start);
	}

	Runnable start = new Runnable() {

		public void run() {
			// 用一个handler更新SeekBar
			mPercentHandler.post(updatesb);
		}

	};

	Runnable updatesb =new Runnable(){

	public void run() {
			int position = mMediaPlayer.getCurrentPosition();
			int mMax = mMediaPlayer.getDuration();
			int sMax = mSeekBar.getMax();
			mSeekBar.setProgress(position * sMax / mMax);
			curtimeAndTotaltime.setText("当前播放时间: " + position / 1000 + "秒"
					+ "\n歌曲总时间: " + mMax / 1000 + "秒");
			// 每秒钟更新一次
			mPercentHandler.postDelayed(updatesb, 1000);
	}

	};
	

	//过滤文件类型
	class MusicFilter implements FilenameFilter
	{

		public boolean accept(File dir, String name) {
			//这里还可以设置其他格式的音乐文件
			return (name.endsWith(".mp3"));
		}
	}
}

 

二、main。xml布局文件的代码:



    
	 
	 
	 

    

   
	 
	 
	 
	      
	      
	      
	      
	      
	  

 

三、musicitem.xml布局文件的代码:




 四、Manifest。xml文件



    

    
        
            
                
                
            
        

    


 

 


推荐阅读
  • Android 中的布局方式之线性布局
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 本文详细介绍如何在 Apache 中设置虚拟主机,包括基本配置和高级设置,帮助用户更好地理解和使用虚拟主机功能。 ... [详细]
  • 如何高效学习鸿蒙操作系统:开发者指南
    本文探讨了开发者如何更有效地学习鸿蒙操作系统,提供了来自行业专家的建议,包括系统化学习方法、职业规划建议以及具体的开发技巧。 ... [详细]
  • 本文分享了作者在使用LaTeX过程中的几点心得,涵盖了从文档编辑、代码高亮、图形绘制到3D模型展示等多个方面的内容。适合希望深入了解LaTeX高级功能的用户。 ... [详细]
  • 深入解析Unity3D游戏开发中的音频播放技术
    在游戏开发中,音频播放是提升玩家沉浸感的关键因素之一。本文将探讨如何在Unity3D中高效地管理和播放不同类型的游戏音频,包括背景音乐和效果音效,并介绍实现这些功能的具体步骤。 ... [详细]
  • 网络流24题——试题库问题
    题目描述:假设一个试题库中有n道试题。每道试题都标明了所属类别。同一道题可能有多个类别属性。现要从题库中抽取m道题组成试卷。并要求试卷包含指定类型的试题。试设计一个满足要求的组卷算 ... [详细]
  • 本文探讨了在AspNetForums平台中实施基于角色的权限控制系统的方法,旨在为不同级别的用户提供合适的访问权限,确保系统的安全性和可用性。 ... [详细]
  • 一、使用Microsoft.Office.Interop.Excel.DLL需要安装Office代码如下:2publicstaticboolExportExcel(S ... [详细]
  • 本文由chszs撰写,详细介绍了Apache Mina框架的核心开发流程及自定义协议处理方法。文章涵盖从创建IoService实例到协议编解码的具体步骤,适合希望深入了解Mina框架应用的开发者。 ... [详细]
  • 本文介绍了Tomcat的基本操作,包括启动、关闭及首次访问的方法,并详细讲解了如何在IDEA中创建Web项目,配置Servlet及其映射,以及如何将项目部署到Tomcat。 ... [详细]
  • ArcBlock 发布 ABT 节点 1.0.31 版本更新
    2020年11月9日,ArcBlock 区块链基础平台发布了 ABT 节点开发平台的1.0.31版本更新,此次更新带来了多项功能增强与性能优化。 ... [详细]
  • 探讨了一个包含纯虚函数的C++代码片段,分析了其中的语法错误及逻辑问题,并提出了修正方案。 ... [详细]
  • Asynchronous JavaScript and XML (AJAX) 的流行很大程度上得益于 Google 在其产品如 Google Suggest 和 Google Maps 中的应用。本文将深入探讨 AJAX 在 .NET 环境下的工作原理及其实现方法。 ... [详细]
  • JavaScript 跨域解决方案详解
    本文详细介绍了JavaScript在不同域之间进行数据传输或通信的技术,包括使用JSONP、修改document.domain、利用window.name以及HTML5的postMessage方法等跨域解决方案。 ... [详细]
  • 本文探讨了如何在PHP与MySQL环境中实现高效的分页查询,包括基本的分页实现、性能优化技巧以及高级的分页策略。 ... [详细]
author-avatar
郭城镣
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有