`
谢堂辉
  • 浏览: 11206 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

android的音乐播放器 出了点问题不知道是什么原因,有时候出现死循环

    博客分类:
  • Java
阅读更多

12-17 12:04:26.415: INFO/StagefrightPlayer(34): setDataSource('/mnt/sdcard/WonderGirls_TellMe.mp3')

12-17 12:04:26.415: ERROR/MediaPlayer(365): start called in state 2

12-17 12:04:26.415: ERROR/MediaPlayer(365): error (-38, 0)

12-17 12:04:26.415: ERROR/MediaPlayer(365): Error (-38,0)

12-17 12:04:26.425: WARN/InputManagerService(60): Starting input on non-focused client    com.android.internal.view.IInputMethodClient$Stub$Proxy@43e388e8 (uid=10032 pid=365)

12-17 12:04:26.445: INFO/StagefrightPlayer(34): setDataSource('/mnt/sdcard/Trouble is a friend.mp3')

12-17 12:04:26.445: ERROR/MediaPlayer(365): start called in state 2

12-17 12:04:26.445: ERROR/MediaPlayer(365): error (-38, 0)

12-17 12:04:26.445: ERROR/MediaPlayer(365): Error (-38,0)

12-17 12:04:26.455: WARN/InputManagerService(60): Starting input on non-focused client   com.android.internal.view.IInputMethodClient$Stub$Proxy@43e388e8 (uid=10032 pid=365)

12-17 12:04:26.545: INFO/StagefrightPlayer(34): setDataSource('/mnt/sdcard/sweet dream.mp3')

12-17 12:04:26.675: ERROR/MediaPlayer(365): start called in state 2

12-17 12:04:26.675: ERROR/MediaPlayer(365): error (-38, 0)

12-17 12:04:26.675: ERROR/MediaPlayer(365): Error (-38,0)

12-17 12:04:26.685: WARN/InputManagerService(60): Starting input on non-focused client   com.android.internal.view.IInputMethodClient$Stub$Proxy@43e388e8 (uid=10032 pid=365)

12-17 12:04:26.705: INFO/StagefrightPlayer(34): setDataSource('/mnt/sdcard/WonderGirls_TellMe.mp3')

12-17 12:04:26.705: ERROR/MediaPlayer(365): start called in state 2

12-17 12:04:26.715: ERROR/MediaPlayer(365): error (-38, 0)

12-17 12:04:26.715: ERROR/MediaPlayer(365): Error (-38,0)

12-17 12:04:26.745: WARN/InputManagerService(60): Starting input on non-focused client   com.android.internal.view.IInputMethodClient$Stub$Proxy@43e388e8 (uid=10032 pid=365)

12-17 12:04:26.755: INFO/StagefrightPlayer(34): setDataSource('/mnt/sdcard/Trouble is a friend.mp3')

12-17 12:04:26.765: ERROR/MediaPlayer(365): start called in state 2

 

package fly.mediaplayer;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;

import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SeekBar;
import android.widget.SimpleAdapter;
import android.widget.Toast;

/**
 * 音乐播放器
 * */
public class MainActivity extends Activity {

	private ListView listView;
	private EditText title;
	SeekBar bar;// 进度条

	private Map<String, String> listpath = new HashMap<String, String>();// 存储音乐名称和绝对路径
	MediaPlayer mediaPlayer = new MediaPlayer();
	private Handler handler = new UIHandler();
	private boolean pause;
	AdapterView<?> parent;
	int position = -1;
	int model = 0;// 播放模式 :0 随机 :1 顺序:2 单曲循环
	List<Map<String, Object>> paths = null;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		// 获得视图
		listView = (ListView) this.findViewById(R.id.list);
		title = (EditText) this.findViewById(R.id.title);
		bar = (SeekBar) this.findViewById(R.id.lenghtBar);

		Button pause = (Button) this.findViewById(R.id.pause);
		Button reset = (Button) this.findViewById(R.id.reset);
		Button stop = (Button) this.findViewById(R.id.stop);
		Button down = (Button) this.findViewById(R.id.down);
		Button up = (Button) this.findViewById(R.id.up);
		Button model = (Button) this.findViewById(R.id.model);

		// 按钮添加事件
		pause.setOnClickListener(new ButtonClickListener());
		reset.setOnClickListener(new ButtonClickListener());
		stop.setOnClickListener(new ButtonClickListener());
		down.setOnClickListener(new ButtonClickListener());
		up.setOnClickListener(new ButtonClickListener());
		model.setOnClickListener(new ButtonClickListener());

		bar.setOnSeekBarChangeListener(new SeekBarChangeListener());

		paths = getList();// 获得音乐文件列表
		SimpleAdapter adapter = new SimpleAdapter(this, paths, R.layout.list,
				new String[] { "path", "lenght" }, new int[] { R.id.path,
						R.id.lenght });
		listView.setAdapter(adapter);
		listView.setOnItemClickListener(new ListOnClickListener());// 添加点击事件

		new Thread(new BarThread()).start();
	}

	/**
	 * SeekBar重绘
	 * */
	private class UIHandler extends Handler {
		public void handleMessage(Message msg) {// 运行在主线程中
			int size = msg.getData().getInt("seek");
			bar.setProgress(size);
		}
	}

	/**
	 * 进度条拖拉监听
	 * */
	private class SeekBarChangeListener implements
			SeekBar.OnSeekBarChangeListener {

		@Override
		public void onProgressChanged(SeekBar seekBar, int progress,
				boolean fromUser) {
		}

		@Override
		public void onStartTrackingTouch(SeekBar seekBar) {

		}

		@Override
		public void onStopTrackingTouch(SeekBar seekBar) {
			if (mediaPlayer.isPlaying()) {
				mediaPlayer.stop();
				mediaPlayer.seekTo(seekBar.getProgress());
				play();
			}
		}
	}

	/**
	 * 进度条线程
	 * */
	private class BarThread implements Runnable {

		public void run() {
			bar.setMax(mediaPlayer.getDuration());
			while (mediaPlayer.getCurrentPosition() <= mediaPlayer
					.getDuration()) {
				Message ms = new Message();
				ms.getData().putInt("seek", mediaPlayer.getCurrentPosition());
				handler.sendMessage(ms);
				try {
					Thread.sleep(2000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}

	/**
	 * 按钮事件监听器
	 * */
	private final class ButtonClickListener implements OnClickListener {

		@Override
		public void onClick(View v) {
			if (position >= 0) {
				switch (v.getId()) {
				case R.id.pause:
					pause();
					break;
				case R.id.reset:
					reset();
					break;
				case R.id.stop:
					stop();
					break;
				case R.id.down:
					down();
					break;
				case R.id.up:
					up();
					break;
				case R.id.model:
					if (model == 0) {
						model = 1;
						((Button) v).setText(R.string.order);
					} else if (model == 1) {
						model = 2;
						((Button) v).setText(R.string.loop);
					} else {
						model = 0;
						((Button) v).setText(R.string.random);
					}
					break;
				}
			} else {
				Toast.makeText(getApplicationContext(), R.string.choice,
						Toast.LENGTH_LONG).show();
			}
		}

		/**
		 * 下一首
		 * */
		private void down() {
			if (position + 1 < paths.size()) {
				position++;
				initMediaplayer(parent, position);
				play();
			} else {
				stop();
				Toast.makeText(getApplicationContext(), R.string.last,
						Toast.LENGTH_LONG).show();
			}
		}

		/**
		 * 上一首
		 * */
		private void up() {

			if (position == 0) {
				stop();
				Toast.makeText(getApplicationContext(), R.string.first,
						Toast.LENGTH_LONG).show();
			} else {
				position = position - 1;
				initMediaplayer(parent, position);
				play();
			}

		}
	}


	/**
	 * ListView点击事件监听器
	 * */
	private final class ListOnClickListener implements OnItemClickListener {
		@Override
		public void onItemClick(AdapterView<?> parent, View view, int position,
				long id) {
			initMediaplayer(parent, position);
			mediaPlayer.setOnCompletionListener(new CompletionListener(parent,
					position));
			setViewAndPosition(parent, position);
			play();// 播放
		}
	}

	/**
	 * 存储当前的视图和位置
	 * */
	private void setViewAndPosition(AdapterView<?> parent, int position) {
		this.parent = parent;
		this.position = position;
	}

	/**
	 * 获得随即播放点
	 * */
	private int getRandom(AdapterView<?> parent, int position) {
		position = new Random().nextInt(parent.getChildCount());
		return position;
	}

	/**
	 * 获得顺序播放点
	 * */
	private int getDown(AdapterView<?> parent, int position) {
		position += 1;
		if (position > parent.getChildCount() - 1) {
			position = 0;
		}
		return position;
	}

	/**
	 * 播放完后 0.随即播放 1.顺序播放 2.单曲循环
	 * */
	private class CompletionListener implements
			MediaPlayer.OnCompletionListener {
		private int position;
		private AdapterView<?> parent;

		public CompletionListener(AdapterView<?> parent, int position) {
			super();
			this.position = position;
			this.parent = parent;
		}

		@Override
		public void onCompletion(MediaPlayer mp) {
			switch (model) {
			case 0:
				position = getRandom(parent, position);
				break;
			case 1:
				position = getDown(parent, position);
				break;
			case 2:
				break;

			}
			setViewAndPosition(parent, position);
			initMediaplayer(parent, position);
			play();
		}
	}

	/**
	 * 初始化 MediaPlayer
	 * */
	private void initMediaplayer(AdapterView<?> parent, int position) {
		@SuppressWarnings("unchecked")
		Map<String, String> map = (Map<String, String>) parent
				.getItemAtPosition(position);
		String path = map.get("path");// 获得触发事件的Item
		title.setText(path);// 设置标题
		String realPath = listpath.get(path);// 获得绝对路径
		mediaPlayer.reset();
		try {
			mediaPlayer.setDataSource(realPath);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	/**
	 * 重置
	 * */
	private void reset() {
		if (mediaPlayer.isPlaying()) {
			mediaPlayer.seekTo(0);
		} else {
			if (title != null)
				play();
		}
	}
	
	/**
	 * 暂停
	 * */
	private void pause() {
		if (mediaPlayer.isPlaying()) {
			mediaPlayer.pause();
			pause = true;
		} else {
			play();
		}
	}
	
	/**
	 * 停止
	 * */
	private void stop() {
		if (mediaPlayer.isPlaying()) {
			mediaPlayer.stop();
			pause = false;
		}
	}
	
	/**
	 * 播放
	 * */
	private void play() {
		try {
			if (!pause) {
				mediaPlayer.prepare();
			}
			mediaPlayer.start();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 获取音乐列表
	 * */
	private List<Map<String, Object>> getList() {
		File file = new File(Environment.getExternalStorageDirectory()
				.toString());// 获得SDCard
		File[] files = file.listFiles();
		int lenght = 0;
		int m = 0;
		int s = 0;
		List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
		// 获得所有的音乐文件
		for (File filepath : files) {
			if (filepath.getName().endsWith(".mp3")) {
				Map<String, Object> lists = new HashMap<String, Object>();
				try {
					mediaPlayer.reset();
					mediaPlayer.setDataSource(filepath.toString());
					mediaPlayer.prepare();
					lenght = mediaPlayer.getDuration();
					lenght = lenght / 1000;
					m = lenght / 60;
					s = lenght - m * 60;
				} catch (Exception e) {
					e.printStackTrace();
				}
				lists.put("path", filepath.getName());
				lists.put(
						"lenght",
						String.format("%02d", m) + ":"
								+ String.format("%02d", s));
				list.add(lists);
				listpath.put(filepath.getName(), filepath.toString());
			}
		}
		return list;
	}
}

 

1
0
分享到:
评论
1 楼 zhangxpower 2011-08-05  
我也遇到了这个问题。。。不知道怎么解决 。。还是说 要用mediaplayer之前要在 manifest.xml中申请 权限啊?

抱着个错:start called in state 2

相关推荐

    android音乐播放器demo

    以下将详细解析“android音乐播放器demo”所涵盖的知识点。 首先,Android音乐播放器的核心是媒体播放服务(MediaPlayer)。这是一个系统级的服务,用于处理音频和视频文件的播放。在Android中,MediaPlayer类提供...

    android音乐播放器需求分析

    在3G技术的迅猛发展中,人们对音乐的追求日益高涨,市场上的音乐播放器虽多,但普遍存在操作复杂或音质不佳等问题,难以满足用户的高品质音乐体验需求。因此,**Android音乐播放器需求分析**旨在开发一款更加人性化...

    android实现音乐播放器

    android简单音乐播放器的播放,暂停,前一首,后一首的控制。简单音乐播放器的播放,暂停,前一首,后一首的控制。简单音乐播放器的播放,暂停,前一首,后一首的控制。简单音乐播放器的播放,暂停,前一首,后一首...

    android 音乐播放器源码下载

    这个“Android音乐播放器源码”提供了一个完整的实现,从用户界面设计到音频处理,涵盖了多个关键知识点。 1. **媒体播放库(MediaPlayer)**:Android系统的MediaPlayer类是音频和视频播放的核心组件。源码中会...

    Android音乐播放器demo

    这个"Android音乐播放器demo"项目可能包括了以下重要知识点: 1. **媒体库API**:Android提供了MediaStore类,允许开发者访问设备上的音频文件。通过ContentResolver查询MediaStore.Audio Media URI,可以获取音乐...

    Android音乐播放器源码

    Android Studio工程,音乐播放器,实现递归扫描SD根目录歌曲文件,切换播放模式、查看歌曲详细信息等基本功能,相应博文地址http://blog.csdn.net/djstavaV/article/details/47726675

    android音乐播放器源码

    【Android音乐播放器源码解析】 ...以上是基于“android音乐播放器源码”项目的分析,涵盖了Android开发中的多个重要知识点。通过学习和理解这些技术,开发者可以构建出更具有特色的音乐播放应用,提升用户体验。

    android音乐播放器service学习案例

    本案例“android音乐播放器service学习案例”着重讲解如何利用Service来实现一个音乐播放器,使音乐能够在后台持续播放。 首先,我们需要了解Android Service的基础知识。Service分为两种类型:标准服务...

    android音乐播放器源码(改进版)

    android音乐播放器源码(改进版)。这个版本已经放在了service中,在服务中控制播放音乐,通过BroadcastReceiver传递一些数据,并且实现了在电话打过来时,停止播放音乐,打完电话继续播放。当然还有上一个版本的甩...

    Android 音乐播放器图标

    在Android应用开发中,设计和使用合适的图标是至关重要的,因为它们不仅提升应用程序的视觉吸引力,还能帮助用户快速识别和理解...在实际应用中,结合Android开发的最佳实践,可以创建出用户体验优秀的音乐播放器应用。

    Android 音乐播放器源码

    Android 音乐播放器,实现递归扫描SD根目录歌曲文件,切换播放模式、查看歌曲详细信息等基本功能,源码打包给大家,需要的下载哈 参考:http://blog.csdn.net/linmiansheng/article/details/18455593

    android 毕业论文音乐播放器

    在本篇毕业论文中,我们将探讨如何开发一个基于Android手机平台的音乐播放器。这个项目旨在为用户提供一个功能完备、用户友好的音乐播放体验。在接下来的章节中,我们将深入研究该系统的各个层面,从需求分析到...

    Android 音乐播放器简单实现源码实例下载

    在Android平台上开发一款音乐播放器是一项常见的任务,它涉及到多媒体处理、用户界面设计以及系统服务的集成等多个技术领域。下面将详细阐述如何基于Android实现一个简单的音乐播放器,并结合提供的资源进行讨论。 ...

    基于Android的简易音乐播放器源码

    总的来说,这个“基于Android的简易音乐播放器源码”项目是一个很好的学习起点,它涵盖了Android应用开发的基本流程和关键知识点,包括多媒体处理、UI设计、文件操作以及服务的使用。通过研究这个项目,开发者不仅...

    单曲循环音乐播放器

    在Android平台上,开发这样一款音乐播放器涉及到多个技术知识点: 1. **媒体播放器(MediaPlayer)API**:Android系统提供了MediaPlayer类,用于播放音频和视频文件。开发者需要熟悉如何初始化MediaPlayer对象,...

    Android实现音乐播放器——课程设计报告,优秀课设

    【Android实现音乐播放器——课程设计报告,优秀课设】是一个关于移动应用开发的课程设计项目,主要目标是让学生熟练掌握Android程序开发的各种技术,包括基础的UI界面设计、数据存储、Activity、Service、SQLite...

    Android studio音乐播放器

    总结来说,创建一个Android Studio音乐播放器项目涉及了Android开发中的多个关键知识点,包括`MediaPlayer`的使用、UI设计、Service的绑定与通信、ListView的实现、SeekBar的控制以及网络下载管理。通过实践这些功能...

    Android手机平台音乐播放器毕业论文

    本文是关于在Android手机平台上构建音乐播放器的毕业论文,主要涵盖了从项目背景、系统需求分析到具体功能设计和数据库设计等多个方面。以下是对这些内容的详细解释: **第一章 引言** 1.1 项目背景:随着智能手机...

    android 后台音乐播放器

    在Android平台上开发一个后台音乐播放器是相当复杂的任务,涉及到多个关键组件和技术。在这个场景中,"android 后台音乐播放器"项目可能是一个实现能够持续播放音乐,即使用户离开应用或者屏幕关闭的解决方案。接...

Global site tag (gtag.js) - Google Analytics