android之播放器

本部分代码在《Android应用开发揭秘》中提到,但是在eclipse环境下调试时出现异常,几番纠结,代码终于可以播放器音乐、并成功移植到手机上......

package com.example.calculate;

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

import android.annotation.SuppressLint;
import android.app.ListActivity;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;
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;

@SuppressLint("SdCardPath")
public class Music extends ListActivity{

	private static ImageButton mFrontImageButton = null;
	private static ImageButton mStopImageButton = null;
	private static ImageButton mPlayImageButton = null;
	private static ImageButton mPauseImageButton = null;
	private static ImageButton mNextImageButton = null;

	//MediaPlayer对象
	private MediaPlayer mMediaPlayer = null;

	//歌曲播放列表
	private List<String> mMusicList = new ArrayList<String>();

	//当前歌曲播放索引
	private int currentListItem = 0;

	//音乐路径
//	private static final String MUSIC_PATH = new String("/sdcard/");	//该路径是用于eclipse 下仿真用的
	private static final String MUSIC_PATH = new String("/storage/sdcard1/qqmusic/song/");	//该路径是用于手机,这个路径是我手机歌曲的路径

	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.music);
	//	setContentView(R.layout.activity_calculate);

		mMediaPlayer = new MediaPlayer();
		//更新播放列表
		musicList();

		mStopImageButton = (ImageButton)findViewById(R.id.imageButton2);

		mPlayImageButton =  (ImageButton)findViewById(R.id.imageButton3);
		mPlayImageButton.setOnClickListener(new OnClickListener()
		{
			public void onClick(View v)
			{
				playMusic(MUSIC_PATH + mMusicList.get(currentListItem));
			}
		});

		mPauseImageButton =  (ImageButton)findViewById(R.id.imageButton4);
		mPauseImageButton.setOnClickListener(new OnClickListener()
		{
			public void onClick(View v)
			{
				if (mMediaPlayer.isPlaying())
					mMediaPlayer.stop();
				else
					mMediaPlayer.start();
			}
		});

		mNextImageButton =  (ImageButton)findViewById(R.id.imageButton5);
		mNextImageButton.setOnClickListener(new OnClickListener()
		{
			public void onClick(View v)
			{
				nextMusic();
			}
		});

		mFrontImageButton = (ImageButton)findViewById(R.id.imageButton1);
		mFrontImageButton.setOnClickListener(new OnClickListener()
		{
			public void onClick(View v)
			{
				FrontMusic();
			}
		});

		listener();
	}

	   //监听事件
	   void listener(){
	       //停止
		   mStopImageButton.setOnClickListener(new OnClickListener() {

	        @Override
	        public void onClick(View v) {
	            // TODO Auto-generated method stub
	            if(mMediaPlayer.isPlaying()){
	                mMediaPlayer.reset();
	            }
	        }
	    });
	  }

	public void onClick(View view) {
		if (view == mFrontImageButton){

		}else if (view == mStopImageButton) {
			if (mMediaPlayer.isPlaying()) {
				mMediaPlayer.reset();
			}
		}else if (view == mPlayImageButton) {
			playMusic(MUSIC_PATH+mMusicList.get(currentListItem));

		}else if (view == mPauseImageButton) {
			if (mMediaPlayer.isPlaying())
				mMediaPlayer.stop();
			else
				mMediaPlayer.start();

		}else if (view == mNextImageButton) {
			nextMusic();
		}else if (view == mFrontImageButton) {
			FrontMusic();
		}
	}

	public boolean onKeyDown(int keyCode, KeyEvent event) {
		if (keyCode == KeyEvent.KEYCODE_BACK) {
			mMediaPlayer.stop();
			mMediaPlayer.release();
			this.finish();
			return true;
		}
		return super.onKeyDown(keyCode, event);
	}

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

	public void playMusic(String path) {
		try {
			//mMediaPlayer在重新播放一首歌曲之前要之行下面的操纵,
			//reset()重置,
			//setDataSource(path)播放歌曲路径.
			//prepare()、start() 准备、播放.
			mMediaPlayer.reset();
			mMediaPlayer.setDataSource(path);
			mMediaPlayer.prepare();
			mMediaPlayer.start();
			mMediaPlayer.setOnCompletionListener(new OnCompletionListener() {
				public void onCompletion(MediaPlayer arg0) {
					//播放完一首歌曲之后进行下一首
					nextMusic();
				}
			});

		}catch (IOException e) {
			 e.printStackTrace();
		}
	}

	public void nextMusic() {
		if (++currentListItem >= mMusicList.size()) {
			currentListItem = 0;
		}else {
			playMusic(MUSIC_PATH+mMusicList.get(currentListItem));
		}
	}

	public void FrontMusic() {
		if (--currentListItem >= mMusicList.size()) {
			currentListItem = 0;
		}else {
			playMusic(MUSIC_PATH+mMusicList.get(currentListItem));
		}
	}

    //绑定音乐
    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<String> musicList=new ArrayAdapter<String>(Music.this,R.layout.c1, mMusicList);
            setListAdapter(musicList);
        }
    }
}

/* 过滤文件类型 */
class MusicFilter implements FilenameFilter
{
	public boolean accept(File dir, String name)
	{
		//这里还可以设置其他格式的音乐文件
		return (name.endsWith(".mp3"));
	}
}

以下是music.xml界面布局

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <ImageButton
        android:id="@+id/imageButton2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/imageButton1"
        android:layout_toRightOf="@+id/imageButton1"
        android:src="@drawable/b2" />

    <ImageButton
        android:id="@+id/imageButton3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/imageButton2"
        android:layout_toRightOf="@+id/imageButton2"
        android:src="@drawable/b3" />

    <ImageButton
        android:id="@+id/imageButton4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/imageButton3"
        android:layout_toRightOf="@+id/imageButton3"
        android:src="@drawable/b4" />

    <ImageButton
        android:id="@+id/imageButton5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/imageButton4"
        android:layout_toRightOf="@+id/imageButton4"
        android:src="@drawable/b5" />

    <ImageButton
        android:id="@+id/imageButton1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginTop="20dp"
        android:src="@drawable/b1" />

    <ListView
        android:id="@android:id/list"
        android:layout_width="320dp"
        android:layout_height="200dp"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/imageButton2"
        android:layout_marginTop="14dp" >
    </ListView>

</RelativeLayout>

下面是c.xml,因为这个文件导致我花了好长的时间,这个文件会被ArrayAdapter()调用......不吐槽了,直接上码

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="无卡" />

最终是AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.calculate"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
 	<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="21" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".CalculateActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="Music"></activity>
        <activity android:name="GetResouceActivity"></activity>
        <activity android:name="ClockActivity"></activity>
    </application>

</manifest>

手机运行的效果:

过程很纠结,坚持!过程问题越多,受教越广,去享受那份纠结吧。。。。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-11 04:46:28

android之播放器的相关文章

android音乐播放器开发教程

android音乐播放器开发教程 android音乐播放器开发教程,布布扣,bubuko.com

Android 基于ijkplayer+Rxjava+Rxandroid+Retrofit2.0+MVP+Material Design的android万能播放器aaa

MDPlayer万能播放器 MDPlayer,基于ijkplayer+Rxjava+Rxandroid+Retrofit2.0+MVP+Material Design的android万能播放器,可以播放本地和在线视频,可以浏览宅男杀手妹纸图片,UI设计遵循 Material Design. GitHub地址:https://github.com/Dawish/MDPlayer UI浏览:         1.UI设计: 列表使用RecyclerView,item为CardView并设置rippl

使用Vitamio打造自己的Android万能播放器

前言 虽然Android已经内置了VideoView组件和MediaPlayer类来支持开发视频播放器,但支持格式.性能等各方面都十分有限,这里与大家一起利用免费的Vitamio来打造属于自己的Android万能播放器! 声明 欢迎转载,但请保留文章原始出处:) 博客园:http://www.cnblogs.com 农民伯伯: http://over140.cnblogs.com 正文 一.实现目标 1.1 支持格式 支持主流的视音频格式:mp3/mp4/mkv/avi/3gp/rmvb/mov

Vitamio打造自己的Android万能播放器

前言 虽然Android已经内置了VideoView组件和MediaPlayer类来支持开发视频播放器,但支持格式.性能等各方面都十分有限,这里与大家一起利用免费的Vitamio来打造属于自己的Android万能播放器! 声明 欢迎转载,但请保留文章原始出处:) 石攻玉 :http://www.cnblogs.com/stone4/ 正文 一.实现目标 1.1 支持格式 支持主流的视音频格式:mp3/mp4/mkv/avi/3gp/rmvb/mov/flv等. 1.2 支持功能 1.2.1 当然

[Android]音乐播放器总结

1. MediaPlayer要播放的文件主要包括3个来源:a. 用户在应用中事先自带的resource资源例如:mp = MediaPlayer.create(this, R.raw.test);b. 存储在SD卡或其他文件路径下的媒体文件例如:mp.setDataSource("/sdcard/test.mp3");c. 网络上的媒体文件例如:mp.setDataSource("http://www.citynorth.cn/music/confucius.mp3"

android音乐播放器开发 SweetMusicPlayer 智能负载直插式歌词

在一份书面的使用MediaPlayer播放音乐, http://blog.csdn.net/huweigoodboy/article/details/39862773.假设没有本地歌词怎么办?如今来将一下载入在线歌词.好了,还是用那张图. 在实现这个功能的时候,lz尝试过baidu api,歌词迷api,后来选用了歌词迷api.尽管还是资源不全.并且还有非常多错误. 特别头疼的是有时候歌词竟然不分行.解析起来简直难受. 歌词迷api歌词查询地址:http://geci.me/api/lyric/

使用Vitamio打造自己的Android万能播放器(2)—— 手势控制亮度、音量、缩放

前言 本章继续完善播放相关播放器的核心功能,为后续扩展打好基础. 声明 欢迎转载,但请保留文章原始出处:) 博客园:http://www.cnblogs.com 农民伯伯: http://over140.cnblogs.com 系列 1.使用Vitamio打造自己的Android万能播放器(1)——准备 正文 一.实现目标 1.1 亮度控制 模仿VPlayer界面: 1.2 声音控制 模仿VPlayer界面: 1.3 画面缩放 根据下面API提供画面的拉伸.剪切.100%.全屏 二.Vitami

使用Vitamio打造自己的Android万能播放器(5)——在线播放(播放优酷视频)

前言 为了保证每周一篇的进度,又由于Vitamio新版本没有发布, 决定推迟本地播放的一些功能(截图.视频时间.尺寸等),跳过直接写在线播放部分的章节.从Vitamio的介绍可以看得出,其支持http.m3u8等多种网络协议,本章将编写播放优酷视频的例子. 声明 欢迎转载,但请保留文章原始出处:) 博客园:http://www.cnblogs.com 农民伯伯: http://over140.cnblogs.com 系列 1.使用Vitamio打造自己的Android万能播放器(1)——准备 2

使用Vitamio打造自己的Android万能播放器(3)——本地播放(主界面、播放列表)

前言 打造一款完整可用的Android播放器有许多功能和细节需要完成,也涉及到各种丰富的知识和内容,本章将结合Fragment.ViewPager来搭建播放器的主界面,并实现本地播放基本功能.系列文章提供截图.代码说明.源码下载,欢迎交流! 声明 欢迎转载,但请保留文章原始出处:) 博客园:http://www.cnblogs.com 农民伯伯: http://over140.cnblogs.com 系列 1.使用Vitamio打造自己的Android万能播放器(1)——准备 2.使用Vitam

使用Vitamio打造自己的Android万能播放器(7)——在线播放(下载视频)

前言 本章将实现非常实用的功能——下载在线视频.涉及到多线程.线程更新UI等技术,还需思考产品的设计,如何将新加的功能更好的融入到现有的产品中,并不是简单的加一个界面就行了,欢迎大家交流产品设计和技术细节实现! 声明 欢迎转载,但请保留文章原始出处:) 博客园:http://www.cnblogs.com 农民伯伯: http://over140.cnblogs.com 系列 1.使用Vitamio打造自己的Android万能播放器(1)——准备 2.使用Vitamio打造自己的Android万