安卓菜鸟开发笔记(10-8)多媒体播放器api

进去安卓api文档里查了一下MediaPlayer类


IDle状态理解为空闲状态、就相当于我创建了一个MediaPlayer的对象,这时对象还不用去做什么事

reset()MediaPlayer对象调用该方法后就会进入空闲状态

release()是释放MediaPlayer 调用此方法后进入END状态 

具体比较详细的MediaPlayer状态: http://blog.csdn.net/thl789/article/details/7370438

setDataSource("/storage/emulated/0/yy.mp3")设置数据源 这个方法需要传入一个String类型的数据源路径  比如我手机的某一首歌的路径是"/storage/emulated/0/yy.mp3"

Prepare()  准备 如果没有准备好就会停在这个方法不会往下执行 在下面的2G网络去听一首网上的音乐就会体现出这个方法的作用

seekTo(1000)里面传入的参数是一个int类型 指定想要从音频的第几秒开始播放 1000 = 1秒

start();开始播放音频

setLooping(true)设置是否要循环播放 true为循环反之为不循环

setOnCompletionListener()实现该方法后    音频播放完毕会调用该方法中的逻辑 就是我们想这首歌播放之后要 做什么事情

setOnErrorListener()实现该方法后 传入的数据源为这个类不认识的其他格式 就会调用该方法的处理逻辑

pause()暂停播放

Stop()停止播放

还有一个异步准备跟同步准备的问题下面用代码实践一下

同步准备:

写一个按钮用来加载网上的音乐和随便一个选择框


布局文件

<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" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context="com.example.szh.day10.PlayInternetMp3">


    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="播放网上的音频"
        android:id="@+id/button2"
        android:onClick="player"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />
    <CheckBox
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="选择题"
        android:id="@+id/checkBox"
        android:layout_below="@+id/button2"
        android:layout_alignRight="@+id/pb"
        android:layout_alignEnd="@+id/pb"
        android:checked="false" />

</RelativeLayout>



Activity实现

package com.example.szh.day10;

import android.media.MediaPlayer;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;

import java.io.IOException;


public class PlayInternetMp3 extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_play_internet_mp3);
    }
    public void player(View view){

        MediaPlayer mediaPlayer = new MediaPlayer();
        mediaPlayer.reset();
        try {
            mediaPlayer.setDataSource("http://www.abv.cn/music/光辉岁月.mp3");
            mediaPlayer.prepare();//同步的准备
            mediaPlayer.start();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}
第一次我手机是在wifi模式下点击该按钮 只出现了小时间 的卡顿

第二次我使用2G网络点击后 按钮停挂了好久 才播放音乐 加载时界面上的选择框不能点击 整个应用会阻塞  甚至挂掉

一般同步准备用在播放本地音乐  要播放网上音乐需要用到异步准备 

其原理就是开启一个子线程去完成这个耗时的操作 不会导致向同步准备一样的主线程阻塞

异步准备:

先在原来的布局文件中加入ProgressBar进度条

<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" android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        android:paddingBottom="@dimen/activity_vertical_margin"
        tools:context="com.example.szh.day10.PlayInternetMp3">


        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="播放网上的音频"
            android:id="@+id/button2"
            android:onClick="player"
            android:layout_alignParentTop="true"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true" />

        <ProgressBar
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/pb"
            android:visibility="invisible"
            android:layout_centerVertical="true"
            android:layout_centerHorizontal="true" />

        <CheckBox
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="选择题"
            android:id="@+id/checkBox"
            android:layout_below="@+id/button2"
            android:layout_alignRight="@+id/pb"
            android:layout_alignEnd="@+id/pb"
            android:checked="false" />

    </RelativeLayout>

这里使用默认的进度条 不去计算要下载的文件的大小计算出进度这些比较复杂的操作 这里单单就想实验用异步的好处.。下面是Activity的实现

package com.example.szh.day10;

import android.media.MediaPlayer;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ProgressBar;

import java.io.IOException;


public class PlayInternetMp3 extends ActionBarActivity {
    private ProgressBar pb;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_play_internet_mp3);
        pb = (ProgressBar) findViewById(R.id.pb);
    }
    public void player(View view){

        final MediaPlayer mediaPlayer = new MediaPlayer();
        //设置加载圈为可见
        pb.setVisibility(View.VISIBLE);
        mediaPlayer.reset();
        try {
            mediaPlayer.setDataSource("http://www.abv.cn/music/光辉岁月.mp3");
            mediaPlayer.prepareAsync();//同步的准备
            //该监听事件用来监听mediaPlayer对象是否已经准备好
            mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    //准备完毕
                    mediaPlayer.start();
                    //设置加载圈为隐藏
                    pb.setVisibility(View.INVISIBLE);
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

总结:

要搞懂整个流程怎么实现的,同步异步的使用场景,异步用在需要网络去访问服务器下载数据源的时候使用,同步使用在数据源为本机的储存,


 




参与评论 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页

打赏作者

昼夜星云

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值