【Android】多媒体编程——MediaPlayer音频播放

在动手写这篇学习笔记的时候其实我是沮丧的,因为此前的两天时间我都在折腾ANDROID多媒体编程这块,所谓多媒体编程就是指调用Android提供的api对文本、图片、音频、视频等做相应的处理,比如图片的的旋转、平移等基本的操作,音频、视频的播放、录制等操作。

在这篇文章中,我主要总结多媒体编程中的音频播放的解决方案。参考了很多本书,包括传智播客高教部的《Android移动应用基础教程》以及清华大学出版社的《精通Android应用开发》,还有我最初接触Android的第一本书,郭霖大神的《第一行代码—Android》等三本书。

Android多媒体编程一个不容忽视的api就是MediaPlayer。它在底层很好地封装了对音频、视频播放的reset()start()pause()prepare()setDataSource()stop()等方法,他们的具体用法如下

setDataSource()----把播放的音频文件以字符串作为参数
prepare()----播放前调用此方法完成播放的准备工作
start()----开始播放、或者继续播放
pause()----暂停播放
reset()----将MediaPlayer对象重置到刚刚创建时的状态
release()----停止播放前由MediaPlayer对象调用此方法,释放底层多媒体资源
stop()----停止播放,此时MediaPlayer对象将会被销毁
seekTo()----从指定位置开始播放,接收一个currentPosition的时间参数
isPlaying()----判断当前是否正在播放,若正在播放返回true
getDuration()----获取音频文件的总时长

另外组要格外注意,我在这个地方就踩过一次坑。设置播放的数据源有三种方式

MediaPlayer.create(this, R.raw.文件名);    // 播放应用res/raw目录下的音频文件
mediaPlayer.setDataSource("sdcard/文件名.mp3");    // 播放sd卡中的音频文件
mediaPlayer.setDataSource("http://www.xxx.mp3");    // 播放网络上的音频文件

下面贴出一个完整的案例,具体代码如下。布局文件如下

<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" >

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/_play"
        android:onClick="play_music"
        />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/_pause"
        android:onClick="pause_music"
        />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/_stop"
        android:onClick="stop_music"
        />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/_contin"
        android:onClick="continue_music"
        />


</LinearLayout>

MusicInterface接口中抽取了四个方法,具体如下

package com.example.musicplayer.service;

public interface MusicInterface {

    void play_music();
    void pause_music();
    void continue_music();
    void stop_music();

}

MusicService类如下

package com.example.musicplayer.service;

import com.example.musicplayer.R;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Binder;
import android.os.IBinder;

public class MusicService extends Service {

    MediaPlayer player;


    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return new MusicBinder();
    }

    @Override
    public void onCreate() {
        // TODO Auto-generated method stub
        super.onCreate();
        player = new MediaPlayer();
//      player.setAudioStreamType(AudioManager.STREAM_MUSIC);


    }

    @Override
    public void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        // 此方法调用,player就会被释放资源然后销毁
        player.release();
        player = null;
    }



    class MusicBinder extends Binder implements MusicInterface {

        @Override
        public void play_music() {
            // TODO Auto-generated method stub
            MusicService.this.play_music();
        }

        @Override
        public void pause_music() {
            // TODO Auto-generated method stub
            MusicService.this.pause_music();
        }

        @Override
        public void continue_music() {
            // TODO Auto-generated method stub
            MusicService.this.continue_music();
        }

        @Override
        public void stop_music() {
            // TODO Auto-generated method stub
            MusicService.this.stop_music();
        }
    }

    private void play_music() {
        // TODO Auto-generated method stub
        player.reset();
        try {
            // 播放sd卡上的MP3
//          player.setDataSource("sdcard/ykzzldx.mp3");
            // 播放资源文件的MP3
            player.create(this, R.raw.wdgsl);
            player.prepare();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        player.start();

    }

    private void pause_music() {
        // TODO Auto-generated method stub
        player.pause();
    }

    private void continue_music() {
        // TODO Auto-generated method stub
        player.start();
    }

    private void stop_music() {
        // TODO Auto-generated method stub
        player.stop();
    }

}

MainAvtivity代码如下

package com.example.musicplayer;

import com.example.musicplayer.service.MusicInterface;
import com.example.musicplayer.service.MusicService;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.view.View;

public class MainActivity extends Activity {

    MusicInterface mi;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Intent intent = new Intent(this, MusicService.class);
        startService(intent);
        bindService(intent, new MyServiceConn(), BIND_AUTO_CREATE);
    }

    class MyServiceConn implements ServiceConnection {

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            // TODO Auto-generated method stub
            mi = (MusicInterface) service;
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            // TODO Auto-generated method stub

        }

    }

    public void play_music(View v) {
        mi.play_music();
    }
    public void pause_music(View v) {
        mi.pause_music();
    }
    public void continue_music(View v) {
        mi.continue_music();
    }
    public void stop_music(View v) {
        mi.stop_music();
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值