您的位置:首页 > 编程语言 > PHP开发

关于MediaPlayer中的getCurrentPosition()和seekTo(int)的总结

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

        一、 布局代码如下:

[html] view
plain copy

<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代码

[java] view
plain copy

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 +'\r'+'\n');  

        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 +'\r'+'\n');  

                    }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()) +'\r'+'\n');  

                    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(),不然会报错;

三、应用截图

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息