/**
菜鸟交流学习所作。实现功能:左右滑动换上、下一曲;上下滑动切换音量;点击、双击播放暂停;随机播放与单曲循环;切换播放路径等。
*/
package com.simplemedia;
import java.io.File;
import java.io.FileInputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.app.Service;
import android.content.Context;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.util.Log;
import android.view.GestureDetector;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity implements OnTouchListener {
private String songRootPath,songpath,rootPath = "/mnt/sdcard/", path, currentRootPath = "/mnt/sdcard/";
private int currentSong = 0, songCount, id = -1;
boolean isPaused=false,isStopped=false;
private ListView showPathList;
public MediaPlayer mediaPlayer;
GestureDetector detector;
public AudioManager audioManager;
TextView songNamText, stateText, showPathText;
LinearLayout detectorLayout, layoutParent;
File currentParent;
File[] currentFiles;
ImageButton lastSongBtn, nextSongBtn, voicMaxBtn, voiceDefaultBtn,
voiceMinBtn, cycleBtn, randomBtn, pathBtn, stopBtn, playBtn,
pauseBtn;
private List<String> songList = new ArrayList<String>();
void init() {
songNamText = (TextView) findViewById(R.id.songNamText);
playBtn = (ImageButton) findViewById(R.id.playBtn);
pauseBtn = (ImageButton) findViewById(R.id.pauseBtn);
stopBtn = (ImageButton) findViewById(R.id.stopBtn);
cycleBtn = (ImageButton) findViewById(R.id.cycleBtn);
randomBtn = (ImageButton) findViewById(R.id.randomBtn);
pathBtn = (ImageButton) findViewById(R.id.pathBtn);
lastSongBtn = (ImageButton) findViewById(R.id.lastSongBtn);
nextSongBtn = (ImageButton) findViewById(R.id.nextSongBtn);
voicMaxBtn = (ImageButton) findViewById(R.id.voicMaxBtn);
voiceMinBtn = (ImageButton) findViewById(R.id.voiceMinBtn);
voiceDefaultBtn = (ImageButton) findViewById(R.id.voiceDefaultBtn);
detectorLayout = (LinearLayout) findViewById(R.id.detectorLayout);
layoutParent = (LinearLayout) findViewById(R.id.layoutParent);
mediaPlayer = new MediaPlayer();
audioManager = (AudioManager) getSystemService(Service.AUDIO_SERVICE);
songList();
getSongCount();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
detector = new GestureDetector(this, new LearnGestureDetector());
songNamText.setText("当前无播放歌曲");
detectorLayout.setOnTouchListener(this);
voicMaxBtn.setOnClickListener(new ImaBtnClickListener());
voiceMinBtn.setOnClickListener(new ImaBtnClickListener());
voiceDefaultBtn.setOnClickListener(new ImaBtnClickListener());
pathBtn.setOnClickListener(new ImaBtnClickListener());
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
class LearnGestureDetector extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onDoubleTap(MotionEvent e) {
// TODO Auto-generated method stub
Log.e("---", "onDoubleTap");
return true;
}
@Override
public boolean onDoubleTapEvent(MotionEvent e) {
// TODO Auto-generated method stub
Log.e("onDoubleTap+pause()", "---------");
pauseMeida();
return true;
}
@Override
public boolean onDown(MotionEvent e) {
// TODO Auto-generated method stub
return true;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
// TODO Auto-generated method stub
// 向左滑动判断
Log.e("onFling()", "--------");
if ((e1.getX() - e2.getX()) > 15
&& ((e1.getX() - e2.getX()) > Math.abs(e1.getY()
- e2.getY()))) {
nextSong();
} else if (e2.getX() - e1.getX() > 15
&& ((e2.getX() - e1.getX()) > Math.abs(e1.getY()
- e2.getY()))) {
lastSong();
} else if ((e1.getY() - e2.getY()) > 15
&& ((e1.getY() - e2.getY()) > Math.abs(e1.getX()
- e2.getX()))) {
voiceManagerMax();
} else if ((e2.getY() - e1.getY()) > 15
&& ((e2.getY() - e1.getY()) > Math.abs(e1.getX()
- e2.getX()))) {
voiceManagerMin();
}
return true;
}
@Override
public void onLongPress(MotionEvent e) {
// TODO Auto-generated method stub
super.onLongPress(e);
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX, float distanceY) {
// TODO Auto-generated method stub
return true;
}
@Override
public void onShowPress(MotionEvent e) {
// TODO Auto-generated method stub
super.onShowPress(e);
}
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
// TODO Auto-generated method stub
Log.e("onSingleTapConfirmed+play()", "---------");
if(isPaused==false||isStopped==true){
prepareMedia(MainActivity.this.songpath);
}
else{
playMedia();
}
return true;
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
// TODO Auto-generated method stub
return true;
}
}
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
if (songList.size() > 0) {
return detector.onTouchEvent(event);
}
return false;
}
// 选择播放类型
class SongFilter implements FilenameFilter {
@Override
public boolean accept(File arg0, String arg1) {
// TODO Auto-generated method stub
if (arg1.endsWith(".wmv")) {
return true;
} else if (arg1.endsWith(".mp3")) {
return true;
}
return false;
}
}
// 获得歌曲列表
public void songList() {
File rootPath = new File(getPath());
Log.e("PATH-----", rootPath.getPath());
// 如果存在.mp3 wmv歌曲
if (rootPath.listFiles(new SongFilter()).length > 0) {
for (File file : rootPath.listFiles(new SongFilter())) {
MainActivity.this.songList.add(file.getName());
}
addBtnListener();
} else {
Toast.makeText(this, "未找到歌曲", 2000).show();
removeBtnListener();
}
}
//增加按钮监听
private void addBtnListener(){
stopBtn.setOnClickListener(new ImaBtnClickListener());
cycleBtn.setOnClickListener(new ImaBtnClickListener());
randomBtn.setOnClickListener(new ImaBtnClickListener());
playBtn.setOnClickListener(new ImaBtnClickListener());
pauseBtn.setOnClickListener(new ImaBtnClickListener());
nextSongBtn.setOnClickListener(new ImaBtnClickListener());
lastSongBtn.setOnClickListener(new ImaBtnClickListener());
}
//移除按钮监听
private void removeBtnListener(){
stopBtn.setOnClickListener(null);
cycleBtn.setOnClickListener(null);
randomBtn.setOnClickListener(null);
playBtn.setOnClickListener(null);
pauseBtn.setOnClickListener(null);
nextSongBtn.setOnClickListener(null);
lastSongBtn.setOnClickListener(null);
}
class ImaBtnClickListener implements OnClickListener {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.playBtn:
Log.e("playListener", "--------------");
// 如果记录存在,则当前歌曲为上一次已完成歌曲的下一首
if(isPaused==false||isStopped==true){
prepareMedia(songpath);
}else{
playMedia();
}
break;
case R.id.pauseBtn:
Log.e("pauseListener", "-------");
pauseMeida();
break;
case R.id.nextSongBtn:
Log.e("nextSongListener", "--------------");
nextSong();
break;
case R.id.lastSongBtn:
Log.e("lastSongListener", "--------------");
lastSong();
break;
case R.id.voicMaxBtn:
voiceManagerMax();
break;
case R.id.voiceMinBtn:
voiceManagerMin();
break;
case R.id.voiceDefaultBtn:
voiceManagerDefault();
break;
case R.id.stopBtn:
stopPlayer();
break;
case R.id.cycleBtn:
recyleCurrentSong();
break;
case R.id.randomBtn:
randomPlay();
break;
case R.id.pathBtn:
// getRootPath();
createDialog();
}
}
}
// 暂停
private void pauseMeida() {
Log.e("In pauseMedia()", "-----");
isPaused=true;
if (mediaPlayer.isPlaying()) {
mediaPlayer.pause();
songNamText.setText(songList.get(currentSong) + "---暂停中");
}
}
//播放器准备
private void prepareMedia(String songPath){
Log.e("SONGPATH", songPath);
isStopped=false;
if (MainActivity.this.currentSong >= songList.size()) {
MainActivity.this.currentSong = 0;
}
mediaPlayer.reset();
try {
File songFile=new File(songPath);
FileInputStream fis=new FileInputStream(songFile);
mediaPlayer.setDataSource(fis.getFD());
mediaPlayer.prepare();
}catch(Exception e){
e.printStackTrace();
}
playMedia();
}
// 播放
private void playMedia() {
if (!mediaPlayer.isPlaying()) {
if (MainActivity.this.currentSong >=songList.size()) {
MainActivity.this.currentSong = 0;
}
mediaPlayer.start();
isPaused=false;
Log.e("In playMedia()", "-----");
mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub
if (MainActivity.this.id == 1) {// 单曲循环
prepareMedia(MainActivity.this.songpath);
strogeMusicSP(currentSong);
} else if (MainActivity.this.id == -1) {// 顺序播放(默认模式)
nextSong();
strogeMusicSP(currentSong);
} else if (MainActivity.this.id == 0) {// 随机播放
currentSong = (int) (songList.size() * Math
.random()) + 1;
MainActivity.this.songpath = songRootPath
+"/"+ songList.get(currentSong);
prepareMedia(MainActivity.this.songpath);
strogeMusicSP(currentSong);
}
}
});
if(mediaPlayer.isPlaying()){
Log.e("IsPlaying()", "-----------");
}
if (MainActivity.this.id == 1) {
songNamText.setText(songList.get(currentSong)
+ "---播放中--单曲循环模式");
} else if (MainActivity.this.id == 0) {
songNamText.setText(songList.get(currentSong)
+ "---播放中--随机播放模式");
} else {
songNamText.setText(songList.get(currentSong) + "---播放中--顺序播放模式");
}
}
}
// 下一首
private void nextSong() {
Log.e("In nextSong()", "------");
if (MainActivity.this.currentSong >= (songList.size() - 1)) {
MainActivity.this.currentSong = 0;
} else {
MainActivity.this.currentSong++;
}
MainActivity.this.songpath = songRootPath + "/"+songList.get(currentSong);
if (mediaPlayer.isPlaying()) {
prepareMedia(MainActivity.this.songpath);
}else if(isStopped==true){
songNamText.setText(songList.get(currentSong) + "---停止中");
}else{
songNamText.setText(songList.get(currentSong) + "---暂停中");
}
}
// 停止
private void stopPlayer() {
mediaPlayer.stop();
isStopped=true;
songNamText.setText(songList.get(currentSong) + "---停止中");
}
// 上一首
private void lastSong() {
Log.e("In LastSong()", "------");
if ((MainActivity.this.currentSong - 1) < 0) {
MainActivity.this.currentSong = songList.size() - 1;
} else {
MainActivity.this.currentSong--;
}
MainActivity.this.songpath = songRootPath + "/"+songList.get(currentSong);
if (mediaPlayer.isPlaying()) {
prepareMedia(MainActivity.this.songpath);
} else if(isStopped==true){
songNamText.setText(songList.get(currentSong) + "---停止中");
}else{
songNamText.setText(songList.get(currentSong) + "---暂停中");
}
}
// 一次单曲循环,一次单击取消转顺序
private void recyleCurrentSong() {
Log.e("In recyleCurrentSong()", "------");
if (MainActivity.this.id != 1) {
MainActivity.this.id = 1;
MainActivity.this.songpath = songRootPath
+ "/"+songList.get(currentSong);
songNamText.setText(songList.get(currentSong) + "---播放中--单曲循环模式");
} else {
MainActivity.this.id = -1;
getSongCount();
songNamText.setText(songList.get(currentSong) + "---播放中");
}
}
// 一次随机播放,一次单击取消转顺序
private void randomPlay() {
Log.e("In randomPlay()", "------");
if (MainActivity.this.id != 0) {
MainActivity.this.id = 0;
songNamText.setText(songList.get(currentSong) + "---播放中--随机播放模式");
} else {
MainActivity.this.id = -1;
getSongCount();
songNamText.setText(songList.get(currentSong) + "---播放中");
}
}
// 降低音量
private void voiceManagerMin() {
MainActivity.this.audioManager.adjustStreamVolume(
AudioManager.STREAM_MUSIC, AudioManager.ADJUST_LOWER,
AudioManager.FLAG_SHOW_UI);
}
// 提高音量
private void voiceManagerMax() {
MainActivity.this.audioManager.adjustStreamVolume(
AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE,
AudioManager.FLAG_SHOW_UI);
}
// 静音
private void voiceManagerDefault() {
MainActivity.this.audioManager.setStreamVolume(
AudioManager.STREAM_MUSIC, 0, AudioManager.FLAG_SHOW_UI);
}
// 存储播放器歌曲记录
private void strogeMusicSP(int currentSong) {
Context ctx = MainActivity.this;
SharedPreferences sp = ctx.getSharedPreferences("SP", MODE_PRIVATE);
Editor editor = sp.edit();
editor.putInt("SimpleMedia_int_currentSong", currentSong);
editor.commit();
}
// 存储播放器路径记录
private void strogePathSP(String songRootPath) {
Context ctx = MainActivity.this;
SharedPreferences sp = ctx.getSharedPreferences("SP", MODE_PRIVATE);
Editor editor = sp.edit();
editor.putString("SimpleMedia_string_currentPath", songRootPath);
editor.commit();
}
// 获取播放器记录中上次歌曲位置
private void getSongCount() {
Context ctx = MainActivity.this;
SharedPreferences sp = ctx.getSharedPreferences("SP", MODE_PRIVATE);
songCount = sp.getInt("SimpleMedia_int_currentSong", -1);
if (songCount != -1) {
MainActivity.this.currentSong = songCount;
}
if ((songList.size() > 0) ) {
// 获取播放歌曲的路径
if(MainActivity.this.currentSong>=songList.size()){
MainActivity.this.currentSong=0;
}
MainActivity.this.songpath = MainActivity.this.songRootPath +"/"+songList.get(currentSong);
}
}
// 获取播放器记录中上次播放的路径
private String getPath() {
Context ctx = MainActivity.this;
SharedPreferences sp = ctx.getSharedPreferences("SP", MODE_PRIVATE);
path = sp.getString("SimpleMedia_string_currentPath", null);
if (path != null) {
Log.e("in getPath()",path);
MainActivity.this.songRootPath = path;
return MainActivity.this.songRootPath;
} else {
MainActivity.this.songRootPath="/mnt/sdcard/";
return songRootPath;
}
}
// 播放器路径选择
private void getRootPath() {
Log.e("LISTVIEW", "----");
File root = new File(rootPath);
if (root.exists()) {
currentParent = root;
currentFiles = root.listFiles();// 获取根目录下所有文件
createListView(currentFiles);
}
showPathList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
// TODO Auto-generated method stub
if (arg2 == 0) {
try {
if (currentParent.getParentFile().getPath().equals(
"/mnt")){
}else {
currentParent = currentParent.getParentFile();
currentFiles = currentParent.listFiles();
MainActivity.this.currentRootPath = currentFiles[arg2].getParentFile().getPath();
createListView(currentFiles);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
File[] childFiles = currentFiles[arg2 - 1].listFiles();
MainActivity.this.currentRootPath = currentFiles[arg2 - 1].getPath();
if (childFiles != null && childFiles.length > 0) {
currentParent = currentFiles[arg2 - 1];
currentFiles = childFiles;
MainActivity.this.createListView(currentFiles);
} else {
Toast.makeText(getApplicationContext(), "文件为空或不可访问",
2000);
}
}
}
});
}
// listview显示目录
private void createListView(File[] currentFiles) {
List<String> fileNameList = new ArrayList<String>();
showPathText.setText(currentRootPath);
fileNameList.add("返回上一级");
for (int i = 0; i < currentFiles.length; i++) {
fileNameList.add(currentFiles[i].getName());
}
showPathList.setAdapter(new ArrayAdapter<String>(MainActivity.this,
android.R.layout.simple_expandable_list_item_1, fileNameList));
//setContentView(showPathList);
}
//创建dialog
private void createDialog() {
Builder builder=new AlertDialog.Builder(this);
LinearLayout pathLayout=(LinearLayout) getLayoutInflater().inflate(R.layout.path_select, null);
showPathList = (ListView) pathLayout.findViewById(R.id.showPathList);
showPathText = (TextView) pathLayout.findViewById(R.id.showPathText);
getRootPath();//获取路径
builder.setView(pathLayout);
builder.setPositiveButton("确认路径",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
Log.e("CurrentRootPath", MainActivity.this.currentRootPath);
strogePathSP(MainActivity.this.currentRootPath);
songList();
Log.e("CreateDialog-songList()", "---------------");
getSongCount();
}
});
builder.setNegativeButton("取消选择",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
currentRootPath="/mnt/sdcard/";
}
});
builder.create().show();
}
//长按返回键退出
@Override
public boolean onKeyLongPress(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
if(keyCode==KeyEvent.KEYCODE_BACK){
System.exit(0);
}
return super.onKeyLongPress(keyCode, event);
}
}
相关推荐
本实例将详细讲解如何使用`MediaPlayer`进行媒体播放,并通过附带的`SimpleMedia`代码示例进行深入解析。 1. `MediaPlayer`类概述: `MediaPlayer`是一个强大的类,它支持多种媒体格式,如MP3、AAC、WAV等音频格式...
在Android源码中,`MediaPlayer`类的实现涉及到多个系统服务,如MediaServer,AudioFlinger等。MediaServer是一个运行在单独进程中的服务,负责处理多媒体数据的解码和硬件交互。AudioFlinger是音频处理的核心服务,...
通过研究这些实例源码,开发者可以加深对Android开发的理解,提升解决问题的能力,同时也能学习到最佳实践和优化技巧。这些案例覆盖了Android开发的多个层面,对于初学者和有经验的开发者都是宝贵的参考资料。
"Android开发实例大全源码第二部分"提供了一系列的实例源码,涵盖了从实例80以后的项目,这些实例旨在帮助开发者深入理解和掌握Android应用开发的核心技术。以下是这些实例涉及的一些关键知识点: 1. **布局管理**...
在使用`MediaPlayer`之前,首先需要实例化一个对象。通常,我们可以通过`MediaPlayer.create()`静态方法来初始化,它会根据传入的上下文和资源ID自动加载媒体文件。例如,播放本地视频可以这样写: ```java ...
本实例源码是关于如何使用SurfaceView和MediaPlayer类来构建一个非Android自带VideoView的视频播放器。下面将详细探讨这两个关键组件以及它们在视频播放中的作用。 1. **SurfaceView**: SurfaceView是Android提供的...
"Android开发10个实例源码"集合提供了一系列实用的项目源代码,帮助开发者深入理解Android应用的构建过程,同时也为学习新功能和优化技巧提供了丰富的资源。下面我们将详细探讨这些实例可能涵盖的知识点。 1. **...
总之,这个`Android源码`包提供了一个实践平台,让你通过实例学习如何在安卓应用中有效地集成和控制音乐播放。深入理解`MediaPlayer`不仅可以提升应用的用户体验,也有助于你更好地处理多媒体相关的复杂场景。通过...
在Android开发领域,掌握丰富的实例源码是提升技能的关键步骤之一。"Android 实例 源码 39个"这个资源包包含了39个不同的Android应用实例,旨在帮助开发者深入理解Android应用的工作原理,提高编程技巧。这些实例...
这份名为“Android入门书籍实例源码(完整版)花了不少钱的书籍源码就贡献给大家了12.2”的资源是一份宝贵的Android开发学习材料,包含了一本Android入门书籍中的所有实例源代码。这些源码可以帮助初学者深入理解...
2. **播放器**:在"Android实例源码"中,播放器可能涉及到Android Media Framework,它包含了MediaPlayer类,用于播放音频和视频文件。开发者需要了解如何加载媒体文件,控制播放、暂停、停止,以及调整音量和播放...
"Android 实例源码 2"这个资源集合提供了一系列的Android应用示例源代码,旨在帮助开发者深化对Android平台的理解和应用开发技巧。这些源码涵盖了多种功能和场景,对于初学者和有一定经验的开发者来说都是宝贵的参考...
"Android经典实例源码"集合了多个实际项目中的代码示例,对于初学者来说,这些源码提供了宝贵的实践学习材料。以下将详细介绍这些经典实例可能涉及的Android知识点: 1. **Activity生命周期**:Android应用的核心...
《Android编程典型实例与项目开发源码》是吴亚峰编著的一本深入浅出的Android开发教程,书中涵盖了从基础到进阶的各种实例和项目。通过对这些源码的学习,开发者可以快速掌握Android应用程序设计的核心技能。以下是...
在Android应用开发领域,实例源码是学习和提升技能的重要资源。通过分析和研究实际运行的应用代码,开发者能够深入理解Android系统的运作机制,以及如何利用Java或Kotlin语言构建功能丰富的移动应用程序。以下是对...
《Android上百实例源码集合打包2》是一份珍贵的学习资源,包含了丰富的Android应用程序开发实例和开源项目的源码解析。这份资料旨在帮助开发者深入理解Android应用的实现机制,提高编程技能,以及掌握最新的开发技巧...
在Android开发领域,掌握各种实例源码是提升技能的关键步骤。这个"android 实例源码集合"涵盖了多个重要模块,让我们一一深入探讨这些知识点。 首先,蓝牙(Bluetooth)功能是移动设备间通信的重要方式,特别是在...
摘要:Java源码,Android源码,Android播放器 一款仿写的android手机中的媒体播放器,mediaplayer源码分享与大家下载。源码爱好者以前发过几款android播放器相关源码,有兴趣的搜索一下,这一款里面的注释是英文的,仅...
《Android小游戏连连看源码详解》 在移动设备上,小游戏因其轻松有趣、易于上手的特点,深受用户喜爱。作为一款经典的小游戏,连连看在...总的来说,这个源码是Android小游戏开发的绝佳学习实例,值得深入探究。
通过研究《Android编程典型实例与项目开发》源码,你可以深入了解每个知识点的实际应用,从而提高自己的Android开发能力。这些实例和项目覆盖了Android开发的各个方面,从基础到高级,为实际项目开发提供了坚实的...