播放音频

来源:互联网 发布:幂法求矩阵特征值例子 编辑:程序博客网 时间:2024/04/29 23:45
http://www.jianshu.com/p/32a67329307e
raw下的
MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1);mediaPlayer.start(); // no need to callprepare();create() does that for you

存储到文件系统里的语音文件可以播放
MediaPlayer player = new MediaPlayer();String path = "/sdcard/example.mp3";player.setAudioStreamType(AudioManager.STREAM_MUSIC);`player.setDataSource(path);player.prepare();player.start();
通过URL也可以对网络语音资源进行播放,有两种方式:
  • 通过URI方式:
    String url = "http://........"; // your URL hereUri uri = Uri.parse(url);MediaPlayer player = new MediaPlayer();player.setAudioStreamType(AudioManager.STREAM_MUSIC);player.setDataSource(getApplicationContext(), uri);player.prepare();player.start();
  • 直接通过URL方式:
    String url = "http://........"; // your URL hereMediaPlayer mediaPlayer = new MediaPlayer();mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);mediaPlayer.setDataSource(url);mediaPlayer.prepare(); // might take long! (for buffering, etc)mediaPlayer.start();

    异步prepare

    在调用start函数前,需要调用prepare,主要进行获取并解析资源的操作,可能耗时比较长,如果运行上UI主线程,有可能会造成ANR,因此需要异步进行prepare操作。MediaPlayer提供了非常简单的方法来实现异步prepare —— prepareAsync。prepareAsync是异步操作,直接返回,当操作完成后,会调用OnPreparedListeneronPrepared函数,通过MediaPlayersetOnPreparedListener方法来自定义onPrepared函数,举例如下:

    MediaPlayer player = new MediaPlayer();mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);player.setDataSource("http://....."); // 网络资源文件// 自定义onPreparedListener接口player.setOnPreparedListener(new OnPreparedListener() {    /**     * prepare工作完成之后,会回调该函数     */    @Override    publicvoidonPrepared(MediaPlayer mp) {        mp.start();    }});player.prepareAsync();

    在Service中使用MediaPlayer

    如果需要在后台继续使用MediaPlayer播放,那么就需要使用Service,并且在Service中管理MediaPlayer对象。

    异步执行

    Activity一样,Service是运行默认运行在主线程的,因此,Service需要快速处理传入的intent,响应的时候不能做复杂的运算。如果需要做大量运算,则应该异步执行(启动子线程来执行运算)。
    当在Service中使用MediaPlayer时,则应该使用prepareAsync()来执行准备工作而不是prepare(),并且实现MediaPlayer.OnPreparedListener接口,在完成准备工作时,触发处理逻辑。举个例子:

    publicclassMyServiceextendsServiceimplementsMediaPlayer.OnPreparedListener{    privatestaticfinal String ACTION_PLAY = "com.example.action.PLAY";    MediaPlayer mMediaPlayer = null;    publicintonStartCommand(Intent intent, int flags, int startId){        // ...if (intent.getAction().equals(ACTION_PLAY)) {            mMediaPlayer = ... // initialize it here            mMediaPlayer.setOnPreparedListener(this);            mMediaPlayer.prepareAsync(); // prepare async to not block main thread        }        // ...    }    /** prepare工作完成之后会回调该函数 */publicvoidonPrepared(MediaPlayer player){        player.start();    }}


  • 0 0
    原创粉丝点击