做一个简单的音乐播放器

原创 2013年12月04日 07:44:13
package com.siyehuazhilian.musicplay;

import java.util.ArrayList;
import java.util.HashMap;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Color;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.provider.MediaStore;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.SimpleAdapter;

public class MainActivity extends Activity implements OnClickListener {
	// ListView
	private ListView listView;
	// 适配器
	private SimpleAdapter adapter;
	// 数据源
	private ArrayList<HashMap<String, String>> list;
	// MediaPlay对象
	private MediaPlayer mediaPlayer;
	// 当前播放的曲目
	private int currentPositionMusic = -1;
	// 刷新SeekBar进度
	private static final int UPDATE_PROGRESS = 1;
	// 加载数据
	private static final int LOADING_DATA = 2;

	// 通知管理
	private NotificationManager notificationManager;
	// 通知
	private Notification notification;

	// 上一首
	private ImageButton lastImageButton;
	// 播放
	private ImageButton playImageButton;
	// 下一首
	private ImageButton nextImageButton;
	// 循环
	private ImageButton loopImageButton;
	// 播放进度
	private SeekBar playSeekBar;
	// 当前播放曲目
	private TextView currentPlayingSong;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		listView = (ListView) findViewById(R.id.listview);
		lastImageButton = (ImageButton) findViewById(R.id.imagebutton_previous);
		playImageButton = (ImageButton) findViewById(R.id.imagebutton_play);
		nextImageButton = (ImageButton) findViewById(R.id.imagebutton_next);
		loopImageButton = (ImageButton) findViewById(R.id.imagebutton_loops);
		playSeekBar = (SeekBar) findViewById(R.id.seekbar_play);
		currentPlayingSong = (TextView) findViewById(R.id.textview_songinformation);
		notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
		list = new ArrayList<HashMap<String, String>>();

		adapter = new SimpleAdapter(this, list, R.layout.list_item,
				new String[] { "title" }, new int[] { R.id.textview_item });
		listView.setAdapter(adapter);

		// 为listView设置监听器
		listView.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> arg0, View arg1,
					int position, long arg3) {
				try {
					currentPositionMusic = position;
					playMusic(((HashMap<String, String>) list
							.get(currentPositionMusic)).get("path"));
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});

		lastImageButton.setOnClickListener(this);
		playImageButton.setOnClickListener(this);
		nextImageButton.setOnClickListener(this);
		loopImageButton.setOnClickListener(this);
		playSeekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

			@Override
			public void onStopTrackingTouch(SeekBar seekBar) {

			}

			@Override
			public void onStartTrackingTouch(SeekBar seekBar) {

			}

			@Override
			public void onProgressChanged(SeekBar seekBar, int progress,
					boolean fromUser) {
				if (fromUser && mediaPlayer != null) {
					mediaPlayer.seekTo(progress);
				}
			}
		});
	}

	@Override
	protected void onStop() {
		super.onStop();
		notification = new Notification(R.drawable.app_icon, "百度音乐",
				System.currentTimeMillis());

		notification.flags |= Notification.FLAG_NO_CLEAR;
		notification.flags |= Notification.FLAG_ONGOING_EVENT;

		Intent intent = new Intent(this, this.getClass());
		intent.setAction(Intent.ACTION_MAIN);
		intent.addCategory(Intent.CATEGORY_LAUNCHER);
		PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
				intent, 0);

		notification.setLatestEventInfo(this, "正在播放",
				((HashMap<String, String>) list.get(currentPositionMusic))
						.get("title"), pendingIntent);

		notificationManager.notify(1, notification);
	}

	@Override
	protected void onResume() {
		super.onResume();
		// 得到所有音频
		scanMusic();
		notificationManager.cancelAll();
	}

	@Override
	protected void onDestroy() {
		super.onDestroy();
		notificationManager.cancelAll();
		mediaPlayer.release();
		mediaPlayer = null;
	}

	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		if (keyCode == KeyEvent.KEYCODE_BACK) {
			AlertDialog.Builder builder = new AlertDialog.Builder(this);
			builder.setTitle("你确定要退出吗?");
			builder.setPositiveButton("确定",
					new DialogInterface.OnClickListener() {
						@Override
						public void onClick(DialogInterface dialog, int which) {
							finish();
						}
					});
			builder.setNegativeButton("取消",
					new DialogInterface.OnClickListener() {
						@Override
						public void onClick(DialogInterface dialog, int which) {
						}
					});
			builder.show();
			return true;
		} else {
			return super.onKeyDown(keyCode, event);
		}
	}

	/**
	 * 得多所有的音频
	 */
	private void scanMusic() {
		new Thread() {
			public void run() {
				Cursor cursor = getContentResolver().query(
						MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null,
						null, null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER);

				while (cursor.moveToNext()) {
					String title = cursor
							.getString(cursor
									.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));
					String path = cursor
							.getString(cursor
									.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));
					String size = cursor
							.getString(cursor
									.getColumnIndexOrThrow(MediaStore.Audio.Media.SIZE));
					if (Long.parseLong(size) > 1024 * 1024) {
						HashMap<String, String> hashMap1 = new HashMap<String, String>();
						hashMap1.put("title", title);
						hashMap1.put("path", path);
						list.add(hashMap1);
						handler.sendEmptyMessage(LOADING_DATA);
					}
				}
				cursor.close();

			};
		}.start();

	}

	/**
	 * 播放音乐
	 * 
	 * @param path
	 * @throws Exception
	 */
	private void playMusic(String path) throws Exception {
		if (mediaPlayer == null) {
			// 新建一个mediaPalyer对象
			mediaPlayer = new MediaPlayer();
		}
		// 使mediaPalyer进入Idle状态
		mediaPlayer.reset();
		// 设置数据源,使mediaPlayer进入Intialized状态
		mediaPlayer.setDataSource(path);
		// 准备播放
		mediaPlayer.prepareAsync();
		mediaPlayer.setOnPreparedListener(new OnPreparedListener() {

			@Override
			public void onPrepared(MediaPlayer mp) {
				// 开始播放音乐
				mp.start();
				// 把图片改为播放的图片
				playImageButton.setImageResource(R.drawable.play);
				// 同时更改SeekBar的进度,因为进度是不断变化的,所以需要一个子线程来刷新下
				playSeekBar.setMax(mp.getDuration());
				handler.sendEmptyMessage(UPDATE_PROGRESS);
				// 设置当前播放曲目信息
				currentPlayingSong.setTextColor(Color.GREEN);
				currentPlayingSong.setText(list.get(currentPositionMusic).get(
						"title"));
			}
		});
		mediaPlayer.setOnCompletionListener(new OnCompletionListener() {

			@Override
			public void onCompletion(MediaPlayer mp) {
				playNextSong();
			}
		});
	}

	private Handler handler = new Handler() {
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case UPDATE_PROGRESS:
				playSeekBar.setProgress(mediaPlayer.getCurrentPosition());
				handler.sendEmptyMessageDelayed(UPDATE_PROGRESS, 1000);
				break;
			case LOADING_DATA:
				adapter.notifyDataSetInvalidated();
				break;
			default:
				break;
			}
		};
	};

	/**
	 * 监听
	 */
	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.imagebutton_previous:
			playLastSong();
			break;
		case R.id.imagebutton_play:
			if (mediaPlayer != null) {
				// 如果音乐播放器正在播放
				if (mediaPlayer.isPlaying()) {
					// 那就暂停它
					mediaPlayer.pause();
					// 还要把图片改为暂停的图片
					playImageButton.setImageResource(R.drawable.pause);
				} else {
					// 否则就播放它
					mediaPlayer.start();
					// 把图片设置成播放的图片
					playImageButton.setImageResource(R.drawable.play);
				}
			}
			break;
		case R.id.imagebutton_next:
			playNextSong();
			break;
		case R.id.imagebutton_loops:
			if (mediaPlayer != null) {
				// 如果音乐播放器正在循环
				if (mediaPlayer.isLooping()) {
					// 那就终止循环它
					mediaPlayer.setLooping(false);
					// 还要把图片改为不循环的图片
					loopImageButton.setImageResource(R.drawable.loop_false);
				} else {
					// 否则就循环播放它
					mediaPlayer.setLooping(true);
					// 把图片设置成循环播放的图片
					loopImageButton.setImageResource(R.drawable.loop_true);
				}
			}
			break;
		default:
			break;
		}
	}

	/**
	 * 播放下一曲
	 */
	private void playNextSong() {
		// 只有当有音乐在播放的时候才可以点击下一首
		if (currentPositionMusic != -1) {
			// 如果当前歌曲为最后一首,就播放第一首歌曲
			if (currentPositionMusic == list.size() - 1) {
				// 设置当前歌曲为第一首
				currentPositionMusic = 0;
				try {
					// 播放第一首歌曲
					playMusic(list.get(currentPositionMusic).get("path"));
				} catch (Exception e) {
					e.printStackTrace();
				}
			}// 否则就播放下一首歌曲
			else {
				// 设置当前歌曲为下一首
				currentPositionMusic++;
				try {
					// 播放下一首歌曲
					playMusic(list.get(currentPositionMusic).get("path"));
				} catch (Exception e) {
					e.printStackTrace();
				}
			}

		}
	}

	/**
	 * 播放上一曲
	 */
	private void playLastSong() {
		// 只有当有音乐在播放的时候才可以点击上一首
		if (currentPositionMusic != -1) {
			// 如果当前歌曲为第一首,就播放最后一首歌曲
			if (currentPositionMusic == 0) {
				// 设置当前歌曲为最后一首
				currentPositionMusic = list.size() - 1;
				try {
					// 播放最后一首歌曲
					playMusic(list.get(currentPositionMusic).get("path"));
				} catch (Exception e) {
					e.printStackTrace();
				}
			}// 否则就播放上一首歌曲
			else {
				// 设置当前歌曲为前一首
				currentPositionMusic--;
				try {
					// 播放前一首歌曲
					playMusic(list.get(currentPositionMusic).get("path"));
				} catch (Exception e) {
					e.printStackTrace();
				}
			}

		}
	}

}

xml代码:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/bg"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <ListView
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </ListView>

    <LinearLayout
        android:id="@+id/linearlayout_button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:orientation="horizontal" >

        <TextView
            android:id="@+id/textview_songinformation"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1" />

        <ImageButton
            android:id="@+id/imagebutton_previous"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="#00000000"
            android:src="@drawable/last" />

        <ImageButton
            android:id="@+id/imagebutton_play"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="#00000000"
            android:src="@drawable/pause" />

        <ImageButton
            android:id="@+id/imagebutton_next"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="#00000000"
            android:src="@drawable/next" />

        <ImageButton
            android:id="@+id/imagebutton_loops"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="#00000000"
            android:src="@drawable/loop_false" />
    </LinearLayout>

    <SeekBar
        android:id="@+id/seekbar_play"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_above="@id/linearlayout_button" />

</RelativeLayout>

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/textview_item"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:textColor="#a2007c" >

</TextView>

剩下的就是添加一些图片资源和在AndroidManifest.xml中添加权限和样式

相关文章推荐

利用java做一个简单的音乐播放器

利用java里的swing技术实现简单的音乐播放器,里面主要是用到JMFjar包里面的属性...
  • yan_kai
  • yan_kai
  • 2016年09月28日 14:53
  • 5845

百度音乐接口-——可以根据这做一个在线音乐播放器哦

分享一下 来自:http://blog.csdn.net/x1135768777/article/details/7459711 注意:要把得到的地址拼接一下,就可以得到mp3的下载地址了 当你...
  • daditao
  • daditao
  • 2013年05月11日 21:05
  • 684

仿实例开发---一个简单的音乐播放器

输入代码: activity_main.xml:

Android之多媒体MediaPlayer(一个简单的音乐播放器)

音乐播放器MediaPlayer: 利用Environment.getExternalStorageDirectory()方法得到sdcard路径,然后用new File(得到的sdcard...

用JS+Html5实现一个简单的音乐播放器

1.HTML   标签定义声音,比如音乐或其他音频流。其主要属性有src:要播放的音频的 URL,controls:如果出现该属性,则向用户显示控件,比如播放按钮。   几个主要的标签如下: ...

一个简单音乐播放器的java实现(一)

写在前面 这几天正在读head first系列的书籍,现在正好读的是java。这本书讲的深入浅出,环环相扣,非常精彩,不妨安利给大家,顺便把我学习过程中的一些心得体会已经实例分享出来。1.一个最简单...

一个简单的Android音乐播放器

在这里主要是用两个简单的按钮实现音乐的播放和停止功能,工程的目录结构为: 同时添加一个文件夹,里面放后缀为mp3的文件就可以了。 在main配置文件主要是添加两个Button: ...
  • judyge
  • judyge
  • 2015年05月31日 19:59
  • 333

制作一个简单的Android版的音乐播放器

音乐播放器是一个非常常见的应用,这篇博客就是介绍如何制作一个简单的音乐播放器,这款音乐播放器具有以下的功能:播放歌曲、暂停播放歌曲、、显示歌曲的总时长、显示歌曲的当前播放时长、调节滑块可以将歌曲调节到...

一个简单音乐播放器的Java实现(二)

写在前面 上一篇博客的内容我们介绍了一个最简单的音乐播放器的基本结构和实现代码,那么本篇内容我们只做一些稍微的变通,也要把MidiEvent的相关参数设置说明清楚。以下阅读最好结合本博客系列上一篇文...

android一个很简单很简单的音乐播放器

android很简单的音乐播放器暂时缺 循环和专辑图片,歌词
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:做一个简单的音乐播放器
举报原因:
原因补充:

(最多只允许输入30个字)