zoukankan      html  css  js  c++  java
  • 【总结】关于MediaPlayer中的getCurrentPosition()和seekTo(int)的总结

             在使用音频时,需要用到MediaPlayer,除了一些基础的方法之外,比较难掌握的就是设计播放点的调转的地方,进过反复调试,我最终找到一个可以让getCurrentPosition()和seekTo(int)发挥作用的方法。

            一、 布局代码如下:

    <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"
        tools:context=".MainActivity" >
    
        <RelativeLayout android:id="@+id/adcontainer"
    		android:layout_width="fill_parent" android:layout_height="wrap_content"
    		android:layout_alignParentTop="true">
    	</RelativeLayout>
        <Button 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/play"
            android:id="@+id/play"
            android:layout_alignParentTop="true"
            />
        <EditText
            android:id="@+id/seek"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/play"
            android:layout_alignParentLeft="true"
            android:textColor="#ff000000"
            android:ems="7"
            android:hint="" 
            />
        <Button 
            android:id="@+id/go"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@+id/seek"
            android:text="@string/go"
            />
        <TextView
            android:layout_below="@+id/seek"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/hello_world" 
            android:id="@+id/text"
            />
    
    </RelativeLayout>

            上述布局主要有以下几个部件:“播放/停止”按钮Play,“调整”按钮Go,跳转时间(毫秒)输入框,相关提示信息显示界面。

            二、MainActivity代码

    package com.kavinapps.androidk.audio;
    
    import java.io.IOException;
    
    import android.app.Activity;
    import android.media.MediaPlayer;
    import android.os.Bundle;
    import android.text.InputType;
    import android.util.Log;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;
    
    public class MainActivity extends Activity {
    
    	private static final String TAG = "AudioPlayActivity";
    	private MediaPlayer mMediaPlayer;//定义音频控件
    	private int mPosition;//记录音频文件播放的位置
    	private TextView mTextView;
    	private EditText mEditText;
    	
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		setTitle("音频测试V0.0.3");
    		
    		mTextView = (TextView)findViewById(R.id.text);
    		mEditText = (EditText)findViewById(R.id.seek);
    		
    		mMediaPlayer = new MediaPlayer();
    		mMediaPlayer = MediaPlayer.create(this, R.raw.music);//将音频文件放到里面
    		mMediaPlayer.setLooping(false);//不循环播放
    		
    		mPosition = mMediaPlayer.getCurrentPosition();//保存当前播放点
    		//mMediaPlayer.seekTo(mPosition);
    		mTextView.setText("开始处:" + mPosition +'
    '+'
    ');
    		mEditText.setInputType(InputType.TYPE_CLASS_NUMBER);//输入类型为数字
    		
    		
    		Button playButton = (Button)this.findViewById(R.id.play);
    		Button goButton = (Button)this.findViewById(R.id.go);
    		ButtonClickListener listener = new ButtonClickListener();//定义按键监听器
    		playButton.setOnClickListener(listener);
    		goButton.setOnClickListener(listener);
    		
    	}
    	
    	private final class ButtonClickListener implements View.OnClickListener{
    
    		@Override
    		public void onClick(View v) {
    			// TODO Auto-generated method stub
    			
    			Button button = (Button) v;//得到button
    			try{
    				switch(v.getId()){//通过传过来的button,可以判断button的类型
    				case R.id.play://播放
    					if(mMediaPlayer.isPlaying()){
    						stop();
    						mPosition = mMediaPlayer.getCurrentPosition();//保存当前播放点
    						mTextView.setText(mTextView.getText()+"段落:" + mPosition +'
    '+'
    ');
    					}else{
    						play();
    					}
    					break;
    				case R.id.go://进入预设的时间
    					play();//必须先用play()初始化,不然会有错误产生,而是也无法调到设定的时间
    					stop();
    					Log.i(TAG,"按下Go键");
    					Log.i(TAG,"设定的跳转位置是mPosition= "+mPosition);
    					mTextView.setText(mTextView.getText()+"设定点:" +(mEditText.getText().toString()) +'
    '+'
    ');
    					mMediaPlayer.seekTo(Integer.parseInt((mEditText.getText().toString())));
    					//mMediaPlayer.seekTo(mPosition);
    					//mMediaPlayer.seekTo(30000);//调到30s
    					Log.i(TAG,"跳转到的位置是mPosition= "+mMediaPlayer.getCurrentPosition());
    					play();
    				}
    			}catch (Exception e){
    				Log.e(TAG,e.toString());
    			}
    		}
    	}
    	private void play() throws IOException{	//此过程可能抛出异常
    		// TODO Auto-generated method stub
    		mMediaPlayer.start();//播放
    	}
    	private void stop() throws IOException{	//此过程可能抛出异常
    		// TODO Auto-generated method stub
    		mMediaPlayer.pause();
    	}
    	//关于播放位置的确定
    	/*
    	 * mPosition = mMediaPlayer.getCurrentPosition();//保存当前播放点
    	 * mMediaPlay.seekTo(mPosition);
    	 * */
    	
    	@Override
    	public boolean onCreateOptionsMenu(Menu menu) {
    		// Inflate the menu; this adds items to the action bar if it is present.
    		///getMenuInflater().inflate(R.menu.activity_main, menu);
    		///return true;
    			super.onCreateOptionsMenu(menu);
    			Log.i(TAG,"创建菜单");
    			menu.add(0,1,1,"播放音频");
    			menu.add(0,2,2,"目录");
    		
    		return super.onCreateOptionsMenu(menu);
    	}
    	@Override
    	public boolean onPrepareOptionsMenu(Menu menu){
    		super.onPrepareOptionsMenu(menu);
    		Log.i(TAG,"准备菜单");
    		menu.clear();
    		if(mMediaPlayer.isPlaying()){
    			menu.add(0,1,1,"暂停音频");
    			menu.add(0,2,2,"目录");
    		}else{
    			menu.add(0,1,1,"播放音频");
    			menu.add(0,2,2,"目录1");
    		}
    		
    		return true;
    		
    	}
    	@Override
    	public boolean onOptionsItemSelected(MenuItem item){
    		if(item.getItemId() == 1){	//选择“播放音频”
    			Log.i(TAG,"菜单选择");
    			try{
    				//Log.i(TAG,mMediaPlayer.isPlaying()+"");
    				if(mMediaPlayer.isPlaying()){
    					stop();	
    					Log.i(TAG,"菜单选择");
    				}else
    					play();
    				
    			}catch (Exception e){
    				Log.e(TAG,e.toString());
    			}
    			
    		}else if(item.getItemId() == 2){ //选择“目录”
    			
    		}
    		return false;		
    	}
    	
    	@Override
    	protected void onDestroy(){
    		mMediaPlayer.release();
    		super.onDestroy();
    		Log.i(TAG,"OnDestroy");
    	}
    
    }



    上述程序成功的关键是下面的一点:

    (1)确保在进行音频调转seekTo(int)或者stop()之前,要确保之前已经进行过play(),不然会报错;

    三、应用截图


  • 相关阅读:
    [最优化理论与技术]线性规划
    [吴恩达深度学习]神经网络和深度学习
    Linux系统级性能分析工具perf的介绍与使用
    Oracle表变化趋势追踪记录 & 表 历史统计信息查看
    delete noprompt archivelog
    DEPLOYING ORACLE RAC DATABASE 12C RELEASE 2 ON RED HAT ENTERPRISE LINUX 7
    How to Modify SCAN Setting or SCAN Listener Port after Installation (Doc ID 972500.1)
    How to create a RAC Database Service With Physical Standby Role Option? (Doc ID 1129143.1)
    Oracle级联备库0数据丢失--重建控制文件并应用主库online redo logfile的激活方法
    Handling ORL and SRL (Resize) on Primary and Physical Standby in Data Guard Environment (Doc ID 1532566.1)
  • 原文地址:https://www.cnblogs.com/pangblog/p/3424063.html
Copyright © 2011-2022 走看看