android播放网络音频,很简单的技术,但是可以学习下

很简单的一个获取网络音频播放器,有进度条,播放,暂停,停止,重新播放,支持缓存,以下是源码,希望可以帮到大家

android播放网络音频_第1张图片

布局文件很简单,就几个按钮,TextView,和SeekBar。
activity_audio_palyer.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" >    <LinearLayout  android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="top" android:orientation="vertical" >        <TextView  android:id="@+id/tips" android:layout_width="wrap_content" android:layout_height="40dp" android:text="文件地址" />        <EditText  android:id="@+id/file_name" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="http://sc1.111ttt.com/2016/1/02/23/195231349486.mp3" />        <LinearLayout  android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="4.0dip" android:orientation="horizontal" >            <Button  android:id="@+id/btnPlayUrl" android:layout_width="80dip" android:layout_height="wrap_content" android:text="播放" >            </Button>            <Button  android:id="@+id/btnPause" android:layout_width="80dip" android:layout_height="wrap_content" android:text="暂停" >            </Button>            <Button  android:id="@+id/btnStop" android:layout_width="80dip" android:layout_height="wrap_content" android:text="停止" >            </Button>            <Button  android:id="@+id/btnReplay" android:layout_width="80dip" android:layout_height="wrap_content" android:text="重播" >            </Button>        </LinearLayout>        <LinearLayout  android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginBottom="20dip" android:orientation="horizontal" >            <SeekBar  android:id="@+id/skbProgress" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_weight="1.0" android:max="100" android:paddingLeft="10dip" android:paddingRight="10dip" >            </SeekBar>        </LinearLayout>    </LinearLayout></FrameLayout>

Player.java文件

public class Player implements OnBufferingUpdateListener, OnCompletionListener, MediaPlayer.OnPreparedListener {    public MediaPlayer mediaPlayer;    private SeekBar skbProgress;    private Timer mTimer = new Timer();    private String videoUrl;    private boolean pause;    private int playPosition;    public Player(String videoUrl, SeekBar skbProgress) {        this.skbProgress = skbProgress;        this.videoUrl = videoUrl;        try {            mediaPlayer = new MediaPlayer();            mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);            mediaPlayer.setOnBufferingUpdateListener(this);            mediaPlayer.setOnPreparedListener(this);        } catch (Exception e) {            Log.e("mediaPlayer", "error", e);        }        mTimer.schedule(mTimerTask, 0, 1000);    }    /******************************************************* * 通过定时器和Handler来更新进度条 ******************************************************/    TimerTask mTimerTask = new TimerTask() {        @Override        public void run() {            if (mediaPlayer == null)                return;            if (mediaPlayer.isPlaying() && skbProgress.isPressed() == false) {                handleProgress.sendEmptyMessage(0);            }        }    };    Handler handleProgress = new Handler() {        public void handleMessage(Message msg) {            int position = mediaPlayer.getCurrentPosition();            int duration = mediaPlayer.getDuration();            if (duration > 0) {                long pos = skbProgress.getMax() * position / duration;                skbProgress.setProgress((int) pos);            }        };    };    /** * 来电话了 */    public void callIsComing() {        if (mediaPlayer.isPlaying()) {            playPosition = mediaPlayer.getCurrentPosition();// 获得当前播放位置            mediaPlayer.stop();        }    }    /** * 通话结束 */    public void callIsDown() {        if (playPosition > 0) {            playNet(playPosition);            playPosition = 0;        }    }    /** * 播放 */    public void play() {        playNet(0);    }    /** * 重播 */    public void replay() {        if (mediaPlayer.isPlaying()) {            mediaPlayer.seekTo(0);// 从开始位置开始播放音乐        } else {            playNet(0);        }    }    /** * 暂停 */    public boolean pause() {        if (mediaPlayer.isPlaying()) {// 如果正在播放            mediaPlayer.pause();// 暂停            pause = true;        } else {            if (pause) {// 如果处于暂停状态                mediaPlayer.start();// 继续播放                pause = false;            }        }        return pause;    }    /** * 停止 */    public void stop() {        if (mediaPlayer != null && mediaPlayer.isPlaying()) {            mediaPlayer.stop();        }    }    @Override    /** * 通过onPrepared播放 */    public void onPrepared(MediaPlayer arg0) {        arg0.start();        Log.e("mediaPlayer", "onPrepared");    }    @Override    public void onCompletion(MediaPlayer arg0) {        Log.e("mediaPlayer", "onCompletion");    }    @Override    public void onBufferingUpdate(MediaPlayer arg0, int bufferingProgress) {        skbProgress.setSecondaryProgress(bufferingProgress);        int currentProgress = skbProgress.getMax()                * mediaPlayer.getCurrentPosition() / mediaPlayer.getDuration();        Log.e(currentProgress + "% play", bufferingProgress + "% buffer");    }    /** * 播放音乐 * * @param playPosition */    private void playNet(int playPosition) {        try {            mediaPlayer.reset();// 把各项参数恢复到初始状态            mediaPlayer.setDataSource(videoUrl);            mediaPlayer.prepare();// 进行缓冲            mediaPlayer.setOnPreparedListener(new MyPreparedListener(                    playPosition));        } catch (Exception e) {            e.printStackTrace();        }    }    private final class MyPreparedListener implements android.media.MediaPlayer.OnPreparedListener {        private int playPosition;        public MyPreparedListener(int playPosition) {            this.playPosition = playPosition;        }        @Override        public void onPrepared(MediaPlayer mp) {            mediaPlayer.start();// 开始播放            if (playPosition > 0) {                mediaPlayer.seekTo(playPosition);            }        }    }}

MainActivity.java文件

public class MainActivity extends Activity {    private Button btnPause, btnPlayUrl, btnStop,btnReplay;    private SeekBar skbProgress;    private Player player;    private EditText file_name_text;    private TextView tipsView;    /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_audio_palyer);        this.setTitle("在线音乐播放---ouyangpeng编写");          btnPlayUrl = (Button) this.findViewById(R.id.btnPlayUrl);          btnPlayUrl.setOnClickListener(new ClickEvent());          btnPause = (Button) this.findViewById(R.id.btnPause);          btnPause.setOnClickListener(new ClickEvent());          btnStop = (Button) this.findViewById(R.id.btnStop);          btnStop.setOnClickListener(new ClickEvent());          btnReplay = (Button) this.findViewById(R.id.btnReplay);          btnReplay.setOnClickListener(new ClickEvent());          file_name_text=(EditText) this.findViewById(R.id.file_name);        tipsView=(TextView) this.findViewById(R.id.tips);        skbProgress = (SeekBar) this.findViewById(R.id.skbProgress);          skbProgress.setOnSeekBarChangeListener(new SeekBarChangeEvent());          String url=file_name_text.getText().toString();        player = new Player(url,skbProgress);          TelephonyManager telephonyManager=(TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);        telephonyManager.listen(new MyPhoneListener(), PhoneStateListener.LISTEN_CALL_STATE);    }    /** * 只有电话来了之后才暂停音乐的播放 */    private final class MyPhoneListener extends android.telephony.PhoneStateListener{        @Override        public void onCallStateChanged(int state, String incomingNumber) {            switch (state) {            case TelephonyManager.CALL_STATE_RINGING://电话来了                player.callIsComing();                break;            case TelephonyManager.CALL_STATE_IDLE: //通话结束                player.callIsDown();                break;            }        }    }    class ClickEvent implements OnClickListener {          @Override          public void onClick(View arg0) {              if (arg0 == btnPause) {                  boolean pause=player.pause();                  if (pause) {                    btnPause.setText("继续");                    tipsView.setText("暂停播放...");                  }else{                    btnPause.setText("暂停");                    tipsView.setText("继续播放...");                  }            } else if (arg0 == btnPlayUrl) {                  player.play();                tipsView.setText("开始播放...");            } else if (arg0 == btnStop) {                  player.stop();                  tipsView.setText("停止播放...");              } else if (arg0==btnReplay) {                player.replay();                tipsView.setText("重新播放...");              }        }      }      class SeekBarChangeEvent implements SeekBar.OnSeekBarChangeListener {          int progress;          @Override          public void onProgressChanged(SeekBar seekBar, int progress,                  boolean fromUser) {              // 原本是(progress/seekBar.getMax())*player.mediaPlayer.getDuration()             this.progress = progress * player.mediaPlayer.getDuration()                      / seekBar.getMax();          }          @Override          public void onStartTrackingTouch(SeekBar seekBar) {          }          @Override          public void onStopTrackingTouch(SeekBar seekBar) {              // seekTo()的参数是相对与影片时间的数字,而不是与seekBar.getMax()相对的数字             player.mediaPlayer.seekTo(progress);          }      }  }

OK,在项目文件AndroidManifest.xml里面添加权限

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.netmusic" android:versionCode="1" android:versionName="1.0" >    <uses-sdk  android:minSdkVersion="8" android:targetSdkVersion="18" />    <uses-permission android:name="android.permission.INTERNET" />    <!-- 注意:这里要加入一个监听电话的权限 -->    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>    <application  android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" >        <activity  android:name="com.example.netmusic.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>

这样做出来的就很原始了,1毛钱特效都没有的那种。
android播放网络音频_第2张图片
按钮这些可以自己定义背景,有专门的媒体按钮,去http://www.iconfont.cn/上找,很多的。
最主要的是咱们的进度条SeekBar,,原始是不是太丑了?来,我们加个样式吧。
在style文件里面:

 </style>    <style name="Widget.SeekBar.Normal" parent="@android:style/Widget.SeekBar">          <item name="android:maxHeight">8.0dip</item>          <item name="android:indeterminateOnly">false</item>          <item name="android:indeterminateDrawable">@android:drawable/progress_indeterminate_horizontal</item>          <item name="android:progressDrawable">@drawable/seekbar_horizontal</item>          <item name="android:minHeight">8.0dip</item>          <item name="android:thumb">@drawable/seek_thumb</item>          <item name="android:thumbOffset">10.0dip</item>      </style> 

新建seekbar_horizontal.xml,drawable里面的

<?xml version="1.0" encoding="UTF-8"?>  <layer-list  xmlns:android="http://schemas.android.com/apk/res/android">      <item android:id="@android:id/background" android:drawable="@drawable/seek_bkg" />      <item android:id="@android:id/secondaryProgress">          <clip>              <shape>                  <corners android:radius="2.0dip" />                  <gradient android:startColor="#80ffd300" android:endColor="#a0ffcb00" android:angle="270.0" android:centerY="0.75" android:centerColor="#80ffb600" />              </shape>          </clip>    </item>      <item android:id="@android:id/progress">          <clip android:drawable="@drawable/seek" />      </item>  </layer-list> 

ok,还有几个图片素材
seek.9.png seek.9.png

这里写图片描述 seek_bkg.9.png

这里写图片描述 seek_thumb.png

代码里面引用:

            <SeekBar  android:id="@+id/skbProgress" style="@style/Widget.SeekBar.Normal" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_weight="1.0" android:max="100" android:paddingLeft="10dip" android:paddingRight="10dip" >            </SeekBar>

这样就可以了,看下效果:
android播放网络音频_第3张图片
比原来的是不是好看很多?
希望可以帮到大家
有什么问题可以加我QQ问我:1453022932

更多相关文章

  1. android 打开预览不同类型文件
  2. Android中使用PULL方式解析XML文件深入介绍
  3. Android使用文件管理器打开指定文件夹,浏览里面的内容
  4. android 播放视频 Android 播放音频
  5. android 向serverGet和Post请求的两种方式,android向server发送
  6. android使用webview加载flash文件
  7. Android仿人人客户端(v5.7.1)——网络模块时序图

随机推荐

  1. 9. android Gallery(画廊)以及BaseAdapte
  2. android app内存使用限制
  3. 为什么Android的AsyncTask不适合执行长时
  4. Android实现拨打电话功能
  5. Android(安卓)Service Messenger & AIDL
  6. 下载CyanogenMod 7.2 for Motorola Defy
  7. 27、android log日志
  8. android内存溢出处理方式之一
  9. strcpy函数在android中的实现
  10. 浅谈android手机客户端开发