android MediaPlayer 播放各种来源的音频

来源:互联网 发布:优化发展环境表态发言 编辑:程序博客网 时间:2024/05/21 15:42

一.MediaPlayer的基本使用步骤和方式

 

 通过上面的生命周期:总结三点1.只有prepare后的才可以调用start ‘stop等,注意reset后进入初始状态,要重新创建mediaplayer实例并prepare

                                            2.播放完成后要调用release释放资源

                                            3.暂停播放的控制查看IsPlaying的值

                                            4.调用seekto后重新调用start,显示当前进度可启用线程

如上图:我们总结其使用步骤

            1).获得MediaPlayer实例:

               a. 可以使用直接new的方式:

                MediaPlayermp = new MediaPlayer();

                b.也可以使用create的方式,如:

                MediaPlayer mp = MediaPlayer.create(this, R.raw.test);//这时就不用调用setDataSource

         

          2) 如何设置要播放的文件:

             MediaPlayer要播放的文件主要包括3个来源:

             a. 用户在应用中事先自带的resource资源

                例如:MediaPlayer.create(this, R.raw.test);

             b. 存储在SD卡或其他文件路径下的媒体文件

               例如:mp.setDataSource("/sdcard/test.mp3");

             c. 网络上的媒体文件

              例如:mp.setDataSource("http://www.citynorth.cn/music/confucius.mp3");

 

                   MediaPlayersetDataSource一共四个方法:

                   setDataSource (String path)

                   setDataSource (FileDescriptor fd)

                   setDataSource (Context context, Uri uri)

                   setDataSource (FileDescriptor fd, long offset, long length)

        3)播放器的主要控制方法:

                    Android通过控制播放器的状态的方式来控制媒体文件的播放,其中:

                    prepare()prepareAsync() 提供了同步和异步两种方式设置播放器进入prepare状态,需要注意的是,如果MediaPlayer实例是由create方法创建 的,那么第一次启动播放前不需要再调用prepare()了,因为create方法里已经调用过了。

                   start()是真正启动文件播放的方法,

                   pause()stop()比较简单,起到暂停和停止播放的作用,

                  seekTo()是定位方法,可以让播放器从指定的位置开始播放,需要注意的是该方法是个异步方法,也就是说该方法返回时并不意味着定位完成,尤其是播放的网络文件,真正定位完成时会触发OnSeekComplete.onSeekComplete(),如果需要是可以调用setOnSeekCompleteListener(OnSeekCompleteListener)设置监听器来处理的。

                  release()可以释放播放器占用的资源,一旦确定不再使用播放器时应当尽早调用它释放资源。

                  reset()可以使播放器从Error状态中恢复过来,重新会到Idle状态。

 

下面直接上例子

activity_main.xml

<LinearLayout   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"    android:orientation="vertical"    android:gravity="center_vertical" ><LinearLayout      android:layout_width="match_parent"     android:layout_height="wrap_content"     android:orientation="horizontal"     android:gravity="center_vertical"    >        <Button        android:id="@+id/start"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="播放"         android:onClick="click"/>   <Button        android:id="@+id/pause"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="暂停"         android:onClick="click"/>   <Button        android:id="@+id/reset"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="重置"         android:onClick="click"/>   <Button        android:id="@+id/stop"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="停止"        android:onClick="click" />    </LinearLayout>   <SeekBar        android:id="@+id/seekbar"        android:layout_width="match_parent"         android:layout_height="wrap_content"        android:max="100"                android:progress="50"       />  <!--  android:progressDrawable="@drawable/seekbar_img"         android:thumb="@drawable/thumb"  --><RelativeLayout    android:id="@+id/progress"        android:layout_width="match_parent"         android:layout_height="wrap_content"       android:gravity="center" >        <TextView         android:id="@+id/currentpro"        android:layout_width="wrap_content"         android:layout_height="wrap_content"        android:layout_alignParentLeft="true"        android:text="04:30"/>    <TextView         android:id="@+id/currentpro"        android:layout_width="wrap_content"         android:layout_height="wrap_content"        android:layout_alignParentRight="true"        android:text="04:30"/></RelativeLayout></LinearLayout>

这里测试了分别读取不同来源文件的例子

MainActivity

public class MainActivity extends Activity{MediaPlayer mediaPlayer=null;SeekBar seekBar;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);try {/*//使用android.media.MediaPlayer类可以包房音频资源,这些音频资源可以包含在apk文件中,也可以保存在sd卡或手机内存中//1.播放嵌入到apk文件(res/raw目录)中的音频资源,首先使用下面的代码创建MediaPlayer对象,通过MediaPlayer.create的第二个参数指定音频资源mediaPlayer= MediaPlayer.create(MainActivity.this, R.raw.l41);*///2.从网络播放   通过URI的方式:/*String path="http://3g.westcn.com/1.mp3";     //这里给一个歌曲的网络地址就行了    Uri  uri  =  Uri.parse(path);    mediaPlayer=MediaPlayer.create(MainActivity.this,uri);*//*//3.网络播放   通过设置数据源的方式:    mediaPlayer=new MediaPlayer();            String path="http://3g.westcn.com/1.mp3";          //这里给一个歌曲的网络地址就行了            mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);            mediaPlayer.setDataSource(path);*///3.播放assets目录下的音频AssetManager assetManager = this.getAssets();AssetFileDescriptor fileDescriptor = assetManager.openFd("l41.mp3");mediaPlayer = new MediaPlayer();mediaPlayer.setDataSource(fileDescriptor.getFileDescriptor(),fileDescriptor.getStartOffset(),fileDescriptor.getLength());mediaPlayer.prepare();/*//4.播放sd卡中的音频文件,可以直接使用new关键字创建MediaPlayer对象,//并使用MediaPlayer.setDataSource方法指定sd卡中的音频文件mediaPlayer=new MediaPlayer();String path="sdcard/MC/music.mp3";System.out.println(path);mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);mediaPlayer.setDataSource(path);mediaPlayer.prepare();*/} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}}public void click(View view){try {switch (view.getId()) {case R.id.start:mediaPlayer.start();break;case R.id.pause:if (mediaPlayer.isPlaying()) {mediaPlayer.pause();}else {return;}break;case R.id.reset:mediaPlayer.reset();String pathstr="sdcard/MC/music.mp3";System.out.println(pathstr);mediaPlayer=new MediaPlayer();mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);mediaPlayer.setDataSource(pathstr);mediaPlayer.prepare();//加载必要的音频资源 mediaPlayer.start();break;case R.id.stop:mediaPlayer.stop();mediaPlayer.prepare();//加载必要的音频资源 break;default:break;}} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}}public boolean onKeyDown(int keyCode, android.view.KeyEvent event) {if (keyCode==KeyEvent.KEYCODE_BACK) {if (mediaPlayer.isPlaying()) {mediaPlayer.release();//播放结束释放资源}}return true;}}

配置文件中必须添加允许网络和读写SD卡的权限
AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.example.test"    android:versionCode="1"    android:versionName="1.0" >    <uses-sdk        android:minSdkVersion="8"        android:targetSdkVersion="18" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/><uses-permission android:name="android.permission.INTERNET"/>    <application        android:allowBackup="true"        android:icon="@drawable/ic_launcher"        android:label="@string/app_name"        android:theme="@style/AppTheme" >        <activity            android:name="com.example.test.MainActivity"            android:label="@string/app_name" >            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>    </application></manifest>


获取源码点击下载

0 0
原创粉丝点击