关闭

做一个简单的音乐播放器

605人阅读 评论(0) 收藏 举报
分类:
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中添加权限和样式

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:117000次
    • 积分:1943
    • 等级:
    • 排名:千里之外
    • 原创:54篇
    • 转载:102篇
    • 译文:1篇
    • 评论:18条
    文章分类
    最新评论