android 播放音频文件 IllegalStateException

xiaobai77 2013-02-14 03:31:45
private void playMusic(String path){
System.out.println("path:"+path);
try {
//重置MediaPlayer
myMediaPlayer.reset();
//设置要播放的文件的路径
myMediaPlayer.setDataSource(path);
System.out.println("setDataSource");
if(myMediaPlayer!=null){
System.out.println("myMediaPlayer!=null");
myMediaPlayer.stop();
}
myMediaPlayer.prepare();
System.out.println("prepare");
myMediaPlayer.start();
System.out.println("start");
SBHandler.sendEmptyMessage(1);
System.out.println("path:"+path);
myMediaPlayer.setOnCompletionListener(new OnCompletionListener(){

public void onCompletion(MediaPlayer mp) {
//播放完一首后停止
myMediaPlayer.reset();
SBHandler.removeCallbacks(null);
}

});
} catch (IllegalArgumentException e) {
System.out.println("IllegalArgumentException");
e.printStackTrace();
} catch (IllegalStateException e) {
System.out.println("IllegalStateException");
e.printStackTrace();
} catch (IOException e) {
System.out.println("IOException");
e.printStackTrace();
}
}

执行这段代码的时候直接跳入
catch (IllegalStateException e) {
System.out.println("IllegalStateException");
e.printStackTrace();
}
应该是停在myMediaPlayer.prepare();这里了
sos
...全文
196 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaobai77 2013-02-18
  • 打赏
  • 举报
回复
package cn.hsb; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FilenameFilter; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.graphics.drawable.ClipDrawable; import android.media.MediaRecorder; import android.media.MediaRecorder.AudioSource; import android.media.MediaRecorder.OutputFormat; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.Gravity; import android.view.View; import android.view.View.OnClickListener; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.TextView; import android.widget.ImageView.ScaleType; public class RecordActivity extends Activity { //音乐存储路径 static String MUSIC_PATH=new String("/sdcard/Record/"); File file=new File("/sdcard/Record/"); //播放列表 Recording Record=new Recording(); ImageButton list,menu,start,stop; TextView record; TextView timeView; private ImageView volumeView,microphone; private TextView minText; private TextView secText; private boolean paused = false; private String timeUsed; private int timeUsedInSec; private static int vusize; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); if(file.exists()) {file.mkdirs();} // musicAdapter=new SimpleAdapter(this, rList,R.layout.listview, // new String[]{"DAY","TIME","SIZE"}, // new int[]{R.id.DAY,R.id.TIME,R.id.SIZE}); // musicAdapter.notifyDataSetChanged(); list=(ImageButton) findViewById(R.id.list); menu=(ImageButton) findViewById(R.id.menu); microphone=(ImageView) findViewById(R.id.microphone); start=(ImageButton) findViewById(R.id.start); stop=(ImageButton) findViewById(R.id.stop); minText = (TextView) this.findViewById(R.id.min); secText = (TextView) this.findViewById(R.id.sec); minText.setText("00:"); secText.setText("00"); list.setOnClickListener(new View.OnClickListener(){ public void onClick(View v) { //Activity之间的跳转 Intent i = new Intent(); i.setClass(RecordActivity.this,recordList.class); startActivity(i); RecordActivity.this.finish(); } }); volumeView = new ImageView(this) {{ setImageResource(R.layout.background); setBackgroundResource(R.layout.font); final ClipDrawable cd = (ClipDrawable)getDrawable(); cd.setLevel(500); mHandler.sendEmptyMessageDelayed(1, 500); setOnClickListener(new OnClickListener() { public void onClick(View v) { if (cd.getLevel() >= 10000) { cd.setLevel(0); } cd.setLevel(vusize); } }); }}; ((LinearLayout)findViewById(R.id.self_layout)).addView(volumeView); start.setOnClickListener(new View.OnClickListener(){ public void onClick(View v) { mHandler.sendEmptyMessageDelayed(1,1000); //计时器 timerHandler.removeMessages(1); startGame(); paused = false; //录音 Record.startRecord(); }}); stop.setOnClickListener(new View.OnClickListener(){ public void onClick(View v) { //计时器 paused = true; timeUsedInSec=0; //停止录音 try{ Record.stopRecord(); }catch(Exception e){} }}); } //计时器更新线程 Handler timerHandler=new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 1: if (!paused) { addTimeUsed(); updateClockUI(); } timerHandler.sendEmptyMessageDelayed(1, 1000); break; default: break; } } }; //音量条更新线程 private final Handler mHandler = new Handler() { public void handleMessage(android.os.Message msg) { if (volumeView != null) { volumeView.performClick(); sourceSize(); //System.out.println("vusize:"+vusize); //sendEmptyMessageDelayed(1,vusize); } }; }; private void sourceSize(){ //vusize = (int)10 * Record.getMyMediaRecorder().getMaxAmplitude()/32768; vusize+=500; } private void updateClockUI() { minText.setText(getMin()+":"); secText.setText(getSec()); } public void addTimeUsed() { timeUsedInSec=timeUsedInSec+1; timeUsed = this.getMin() + ":" + this.getSec(); } public CharSequence getMin() { int min=timeUsedInSec/60; return min<10?"0"+min:String.valueOf(min); } public CharSequence getSec() { int sec = timeUsedInSec%60; return sec < 10?"0"+sec:String.valueOf(sec); } private void startGame() { timerHandler.sendEmptyMessageDelayed(1, 1000); } class MusicFilter implements FilenameFilter{ public boolean accept(File dir, String name) { return (name.endsWith(".amr")); } } public class Recording { private MediaRecorder myMediaRecorder; // HashMap<String,Object> map=new HashMap<String,Object>(); //设置获取系统当前时间的格式 String Day,Time; Date curDate=new Date(System.currentTimeMillis()); SimpleDateFormat formatDay=new SimpleDateFormat("yyyy年MM月dd日"); SimpleDateFormat formatTime=new SimpleDateFormat("HH:mm:ss"); public MediaRecorder getMyMediaRecorder() { return myMediaRecorder; } public void setMyMediaRecorder(MediaRecorder myMediaRecorder) { this.myMediaRecorder = myMediaRecorder; } public Recording() { super(); Time=formatTime.format(curDate); Day=formatDay.format(curDate); myMediaRecorder=new MediaRecorder(); //设置录音源为麦克风 myMediaRecorder.setAudioSource(AudioSource.MIC); myMediaRecorder.setOutputFormat(OutputFormat.DEFAULT); myMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); } public void startRecord(){ myMediaRecorder.setOutputFile(MUSIC_PATH+Day+" "+Time+".amr"); try { myMediaRecorder.prepare(); myMediaRecorder.start(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } // try { // map.put("DAY",Day); // map.put("TIME",Time); // map.put("SIZE",new FileInputStream(file).available()+"K"); // // } catch (FileNotFoundException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } catch (IOException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } // rList.add(map); } //停止录音 public void stopRecord(){ myMediaRecorder.stop(); myMediaRecorder.release(); } } }
xiaobai77 2013-02-18
  • 打赏
  • 举报
回复
package cn.hsb; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FilenameFilter; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import android.accounts.OnAccountsUpdateListener; import android.app.Activity; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.media.MediaPlayer; import android.media.MediaPlayer.OnCompletionListener; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.View; import android.view.View.OnClickListener; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.SeekBar; import android.widget.SimpleAdapter; import android.widget.Toast; import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView.OnItemLongClickListener; public class recordList extends Activity implements OnItemLongClickListener{ private String Day=""; private String Time=""; SimpleAdapter musicAdapter; static ArrayList<HashMap<String, Object>> rList=new ArrayList<HashMap<String, Object>>(); int currenListItme; //public SeekBar seekBar; public ListView lv; public MediaPlayer myMediaPlayer=null; Handler SBHandler=null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.recordlist); rList.clear(); myMediaPlayer=new MediaPlayer(); lv=(ListView) findViewById(R.id.recordlist); musicAdapter=new SimpleAdapter(this, rList,R.layout.listview, new String[]{"DAY","TIME","SIZE"}, new int[]{R.id.DAY,R.id.TIME,R.id.SIZE}); //musicAdapter.notifyDataSetChanged(); musicList(); //短按列表监听器(方式一;此外还可以继承ListActivity;但都需要实现OnItemLongClickListener接口) lv.setOnItemClickListener(new OnItemClickListener(){ public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) { currenListItme=position; playMusic(RecordActivity.MUSIC_PATH+rList.get(currenListItme).get("DAY")+" "+rList.get(currenListItme).get("TIME")); System.out.println("短按"); } }); //长按需要注册,短按则不需要 lv.setOnItemLongClickListener(this); // seekBar=(SeekBar) findViewById(R.id.seekBar); // //设置进度条最大值;获取文件的时长 // seekBar.setMax(myMediaPlayer.getDuration()); // //进度条改变时触发监听器 // seekBar.setOnSeekBarChangeListener( // new SeekBar.OnSeekBarChangeListener(){ // public void onProgressChanged(SeekBar seekBar, // int progress, boolean fromUser) { // // fromUser判断是用户改变的滑块的值 // if(fromUser==true){ // myMediaPlayer.seekTo(progress); // } // // } // public void onStartTrackingTouch(SeekBar seekBar) { // // } // public void onStopTrackingTouch(SeekBar seekBar) { // // } // }); // SBHandler=new Handler(){ // public void run(){ // while(true){ // //获得歌曲现在播放位置并设置成播放进度条的值 // seekBar.setProgress(myMediaPlayer.getCurrentPosition()); // this.sendEmptyMessageAtTime(1,100); // } // } // // }; } //长按监听器(方式二) public boolean onItemLongClick(AdapterView arg0, View arg1, int position, long arg3) { System.out.println("长按了"+position); currenListItme=position; //实现一个弹出对话框 new AlertDialog.Builder(this) .setTitle("请选择") .setItems(new String[] {"播放","重命名","删除"}, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { if(which==1){ System.out.println("重命名"); }else if(which==2){ System.out.println("删除"); }else{ System.out.println("播放"); playMusic(RecordActivity.MUSIC_PATH+rList.get(currenListItme).get("DAY")+" "+rList.get(currenListItme).get("TIME")); System.out.println("path"+RecordActivity.MUSIC_PATH+rList.get(currenListItme).get("DAY")+" "+rList.get(currenListItme).get("TIME")); System.out.println("path"+RecordActivity.MUSIC_PATH+rList.get(currenListItme)); } } }) .setNegativeButton("取消", null) .show(); return false; } private void playMusic(String path){ System.out.println("path:"+path); try { //重置MediaPlayer myMediaPlayer.reset(); //设置要播放的文件的路径 myMediaPlayer.setDataSource(path); System.out.println("setDataSource"); if(myMediaPlayer!=null){ System.out.println("myMediaPlayer!=null"); myMediaPlayer.stop(); } myMediaPlayer.prepare(); System.out.println("prepare"); myMediaPlayer.start(); System.out.println("start"); SBHandler.sendEmptyMessage(1); System.out.println("path:"+path); myMediaPlayer.setOnCompletionListener(new OnCompletionListener(){ public void onCompletion(MediaPlayer mp) { //播放完一首后停止 myMediaPlayer.reset(); SBHandler.removeCallbacks(null); } }); } catch (IllegalArgumentException e) { System.out.println("IllegalArgumentException"); e.printStackTrace(); } catch (IllegalStateException e) { System.out.println("IllegalStateException"); e.printStackTrace(); } catch (IOException e) { System.out.println("IOException"); e.printStackTrace(); } } public void musicList(){ //取得指定位置的文件设置显示到播放列表 File file=new File(RecordActivity.MUSIC_PATH); File[] fileList=file.listFiles(); for(File mFile:fileList){ System.out.println("file:"+mFile.getName()); if(mFile.getPath().endsWith(".amr")){ HashMap<String,Object> map=new HashMap<String,Object>(); long size = mFile.length(); addListName(mFile.getName()); map.put("DAY",Day); map.put("TIME",Time); map.put("SIZE",size+"K"); rList.add(map); } } lv.setAdapter(musicAdapter); } private void addListName(String name){ try{ String[] str=name.split(" "); System.out.println("str:"+str[0]+str[1]); Day=str[0]; Time=str[1]; }catch(Exception e){ } } }
xiaobai77 2013-02-18
  • 打赏
  • 举报
回复
引用
多谢哈
引用 2 楼 zyc13701469860 的回复:
Java code?1234if(myMediaPlayer!=null){System.out.println("myMediaPlayer!=null");myMediaPlayer.stop();//stop???看下MediaPlayer状态图吧} 这是我自己做的播放器的代码 Java code?123456789101112131415161718192……
状态图我看过了 本来是没有stop的 后来百度后有人说加个stop就ok了 然后我就试了下 结果好像也一样 没有啥改变 我还有另一段代码 播放没问题 两段的区别在于 列表 成功的那段列表就一个list 一个adapter 失败的这段 arrayList listview Adapter HashMap 这样 然后每行列表都可以显示时间长度啊之类的 通过位置获得的路径的文件名是数组 我修正了 路径ok但是就是不行 我把代码都贴上来吧
  • 打赏
  • 举报
回复


import java.io.File;

import android.app.Activity;
import android.content.Context;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnPreparedListener;
import android.os.Bundle;
import android.os.Environment;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {
    private EditText nameText;
    private String path;
    private MediaPlayer mediaPlayer;
    private boolean pause;
    private int position;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        mediaPlayer = new MediaPlayer();
        nameText = (EditText) this.findViewById(R.id.filename);
        
        TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        telephonyManager.listen(new MyPhoneListener(), PhoneStateListener.LISTEN_CALL_STATE);
    }
    
    private final class MyPhoneListener extends PhoneStateListener{
		public void onCallStateChanged(int state, String incomingNumber) {
			switch (state) {
			case TelephonyManager.CALL_STATE_RINGING://来电
				if(mediaPlayer.isPlaying()) {
					position = mediaPlayer.getCurrentPosition();
					mediaPlayer.stop();
				}
				break;

			case TelephonyManager.CALL_STATE_IDLE:
				if(position>0 && path!=null){
					play(position);
					position = 0;
				}
				break;
			}
		}
    }
    /*
    @Override
	protected void onPause() {
		if(mediaPlayer.isPlaying()) {
			position = mediaPlayer.getCurrentPosition();
			mediaPlayer.stop();
		}
		super.onPause();
	}

	@Override
	protected void onResume() {
		if(position>0 && path!=null){
			play(position);
			position = 0;
		}
		super.onResume();
	}
*/
	@Override
	protected void onDestroy() {
    	mediaPlayer.release();
    	mediaPlayer = null;
		super.onDestroy();
	}

	public void mediaplay(View v){
    	switch (v.getId()) {
		case R.id.playbutton:
			String filename = nameText.getText().toString();
			File audio = new File(Environment.getExternalStorageDirectory(), filename);
			if(audio.exists()){
				path = audio.getAbsolutePath();
				play(0);
			}else{
				path = null;
				Toast.makeText(getApplicationContext(), R.string.filenoexist, 1).show();
			}
			break;
			
		case R.id.pausebutton:
			if(mediaPlayer.isPlaying()){
				mediaPlayer.pause();//暂停
				pause = true;
				((Button)v).setText(R.string.continues);
			}else{
				if(pause){
					mediaPlayer.start();//继续播放
					pause = false;
					((Button)v).setText(R.string.pausebutton);
				}
			}
			break;
		case R.id.resetbutton:
			if(mediaPlayer.isPlaying()){
				mediaPlayer.seekTo(0);//从开始位置播放音乐
			}else{
				if(path!=null){
					play(0);
				}
			}
			break;
		case R.id.stopbutton:	
			if(mediaPlayer.isPlaying()) mediaPlayer.stop();
			break;
		}
    }

	private void play(int position) {
		try {
			mediaPlayer.reset();//把各项参数恢复到初始状态
			mediaPlayer.setDataSource(path);
			mediaPlayer.prepare();//进行缓冲
			mediaPlayer.setOnPreparedListener(new PrepareListener(position));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	private final class PrepareListener implements OnPreparedListener{
		private int position;
		public PrepareListener(int position) {
			this.position = position;
		}

		public void onPrepared(MediaPlayer mp) {
			mediaPlayer.start();//开始播放
			if(position>0) mediaPlayer.seekTo(position);
		}
	}
}

请参看
Mourinho 2013-02-17
  • 打赏
  • 举报
回复
忘记说了 在OnPreparedListener里调用start()
Mourinho 2013-02-17
  • 打赏
  • 举报
回复

if(myMediaPlayer!=null){
System.out.println("myMediaPlayer!=null");
myMediaPlayer.stop();//stop???看下MediaPlayer状态图吧
}
这是我自己做的播放器的代码

	public void play(MediaListItem item) {
		resetMediaPlayer();
		String path = item.getMediaPath();
		if (!SystemUtil.isMediaFileExisted(path)) {
			// 删除该文件,播放下一首
		}
		/** 设置当前播放的媒体文件资源 */
		try {
			mediaPlayer.setDataSource(path);
			mediaPlayer.prepare();
		} catch (IllegalArgumentException e) {
			CLog.d(String.format("播放%s失败", item.getMediaDisplayName()));
			e.printStackTrace();
		} catch (SecurityException e) {
			CLog.d(String.format("播放%s失败", item.getMediaDisplayName()));
			e.printStackTrace();
		} catch (IllegalStateException e) {
			CLog.d(String.format("播放%s失败", item.getMediaDisplayName()));
			e.printStackTrace();
		} catch (IOException e) {
			CLog.d(String.format("播放%s失败", item.getMediaDisplayName()));
			e.printStackTrace();
		}

	}

	/**
	 * 重置播放器
	 */
	private void resetMediaPlayer() {
		/* 如果MediaPlayer不为空,将其停止,释放资源并强制置为null */
		releaseMediaPlayer();
		mediaPlayer = new MediaPlayer();
		/* 设置监听事件 */
		setMediaPlayerListener();
	}

	private void setMediaPlayerListener() {
		mediaPlayer.setOnErrorListener(this);
		mediaPlayer.setOnPreparedListener(this);
		mediaPlayer.setOnCompletionListener(this);
	}

	public void releaseMediaPlayer() {
		if (mediaPlayer != null) {
			mediaPlayer.stop();
			mediaPlayer.release();
			mediaPlayer = null;
		}
	}
dracularking 2013-02-14
  • 打赏
  • 举报
回复
myMediaPlayer的状态前置条件没满足吧

50,528

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧