Android网络收音机--使用Vitamio解码(二)

在前面提到Android网络收音机--使用Vitamio解码(一)实现了播放流媒体文件,但只能播放一次,在这里可以随机点击左边的menu来播放,但Vitamio还是不是很稳定,有的uri已经过期无法播放了,我下载了一个PC版的网络收音机来对比,如果PC上能播放,在这里也是能播放的,使用了网上的一些图片,先看下修改后的界面

由于当前没有网络,所以只显示了Name

程序目录结构

关键代码选择一个流媒体播放的流程

private void playSelectItem(String url) {
		if (mPlayer == null)
			vplayerInit(false);
		mPlayer.reset();
		Uri uri = Uri.parse(url);
		try {
			mPlayer.setDataSource(PlayService.this, uri); // 设置流媒体的数据源
			mPlayer.prepareAsync(); // 需要缓冲的不能使用prepare是阻塞的,prepareAsync是异步
		} catch (Exception e) {
			// TODO: handle exception
		}

		GlobalConstants.print_i("PlayService", "playSelectItem url = " + url);
	}

private void vplayerInit(boolean isHWCodec) {
		try {
			mPlayer = new MediaPlayer(this.getApplicationContext(), isHWCodec);// 播放流媒体的对象
			mPlayer.setOnBufferingUpdateListener(this); // 在网络视频流缓冲变化时调用
			mPlayer.setOnCompletionListener(this); // 视频播放完成后调用
			mPlayer.setOnPreparedListener(this); // 在视频预处理完成后调用
			mPlayer.setOnErrorListener(this); // 在异步操作调用过程中发生错误时调用。例如视频打开失败
			mPlayer.setOnInfoListener(this); // 在有警告或错误信息时调用。例如:开始缓冲、缓冲结束、下载速度变化
		} catch (Exception e) {
			// TODO: handle exception
		}
	}

在这里也处理了来电的广播

/**
	 * 处理来电广播
	 *
	 * @author Administrator
	 *
	 */
	class PhoneStateReceiver extends BroadcastReceiver {

		@Override
		public void onReceive(Context context, Intent intent) {
			// TODO Auto-generated method stub
			final String action = intent.getAction();

			if (action
					.equalsIgnoreCase(TelephonyManager.ACTION_PHONE_STATE_CHANGED)) {
				final String state = intent
						.getStringExtra(TelephonyManager.EXTRA_STATE);
				GlobalConstants.print_i("PhoneStateReceiver",
						"onReceive state = " + state);
				if (state
						.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_RINGING)
						|| state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_OFFHOOK)) {
					// 接听会收到EXTRA_STATE_OFFHOOK
					pause();
				} else if (state
						.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_IDLE)) {
					// 挂断会收到EXTRA_STATE_IDLE
					startPlay();
				}
			}
		}
	}

监听网络状态改变,如果没有网络,会显示一个Wifi的图标

class ConnectionChangeReceiver extends BroadcastReceiver {

		@Override
		public void onReceive(Context context, Intent intent) {
			// TODO Auto-generated method stub
			final String action = intent.getAction();
			if (action.equalsIgnoreCase(CONNECTIVITY_CHANGE_ACTION)) {
				State wifiState = null;
				State mobileState = null;
				ConnectivityManager cm = (ConnectivityManager) context
						.getSystemService(Context.CONNECTIVITY_SERVICE);
				wifiState = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI)
						.getState();
				mobileState = cm
						.getNetworkInfo(ConnectivityManager.TYPE_MOBILE)
						.getState();
				if (wifiState != null && mobileState != null
						&& State.CONNECTED != wifiState
						&& State.CONNECTED == mobileState) {
					// 手机网络连接成功
					ToastUtils.show(getApplicationContext(), "已连接到网络");
					mIvIcon.setVisibility(View.VISIBLE);
					mIvWifi.setVisibility(View.GONE);
				} else if (wifiState != null && mobileState != null
						&& State.CONNECTED != wifiState
						&& State.CONNECTED != mobileState) {
					// 手机没有任何的网络
					ToastUtils.show(getApplicationContext(), "当前网络不可用");
					mIvIcon.setVisibility(View.GONE);
					mIvWifi.setVisibility(View.VISIBLE);
				} else if (wifiState != null && State.CONNECTED == wifiState) {
					// 无线网络连接成功
					ToastUtils.show(getApplicationContext(), "已连接到网络");
					mIvIcon.setVisibility(View.VISIBLE);
					mIvWifi.setVisibility(View.GONE);
				}
			}
		}
	}

其它相关的代码,感兴趣的可以下载源码

代码下载:http://download.csdn.net/detail/deng0zhaotai/7964051

如果要在Eclipse下编译需要把这三个工程都导入,有两个是以库的形式

时间: 2024-10-13 10:08:52

Android网络收音机--使用Vitamio解码(二)的相关文章

Android网络收音机--使用Vitamio解码(一)

前面讲到Vitamio可以支持一些流媒体,在这里就用Vitamio来播放网络上的一些流媒体,如:mms.rtsp.http,参考前辈的一些文章来写一个网络收音机程序,对于界面的要求不高,要求实现一些实用的功能 程序目录结构 初期界面,左边是用开源项目SlidingMenu,不清楚的可以参考:Android开源项目SlidingMenu的学习笔记 电台信息是通过XML来保存channel.xml,这里只添加一部分,更详细的可以参考文章最后的链接,自行添加 <?xml version="1.0

Android性能优化方法(二)

在Android应用里,最耗费内存的就是图片资源.而且在Android系统中,读取位图Bitmap时,分给虚拟机中的图片的堆栈大小只有8M,如果超出了,就会出现OutOfMemory异常.所以,对于图片的内存优化,是Android应用开发中比较重要的内容. 1) 要及时回收Bitmap的内存 Bitmap类有一个方法recycle(),从方法名可以看出意思是回收.这里就有疑问了,Android系统有自己的垃圾回收机制,可以不定期的回收掉不使用的内存空间,当然也包括Bitmap的空间.那为什么还需

Android开发之大位图二次采样压缩处理(源代码分享)

图片有各种形状和大小.在许多情况下这些图片是远远大于我们的用户界面(UI)且占据着极大的内存空间,如果我们不对位图进行压缩处理,我们的程序会发生内存泄露的错误. MainActivity的代码 package com.example.g08_bitmap; import android.os.Bundle; import android.app.Activity; import android.content.res.Resources; import android.graphics.Bitm

H.264视频在android手机端的解码与播放(转)

随着无线网络和智能手机的发展,智能手机与人们日常生活联系越来越紧密,娱乐.商务应用.金融应用.交通出行各种功能的软件大批涌现,使得人们的生活丰富多彩.快捷便利,也让它成为人们生活中不可取代的一部分.其中,多媒体由于其直观性和实时性,应用范围越来越广,视频的解码与播放也就成为研究的热点. H.264标准技术日渐成熟,采用了统一的VLC符号编码,高精度.多模式的位移估计,基于4×4块的整数变换.分层的编码语法等.这些措施使得H.264算法具有很高的编码效率,在相同的重建图像质量下,能够比H.263节

从零开始学android&lt;android事件的处理方式.二十四.&gt;

在android中一共有 多种事件,每种事件都有自己相对应的处理机制 如以下几种 1 单击事件 View.OnClickListener public abstract void onClick (View v) 单击组件时触发 2 单击事件 View.OnLongClickListener public abstract boolean onLongClick (View v) 长按组件时触发 3 键盘事件 View.OnKeyListener public abstract boolean

密西西比河谷州立大学:Android应用程序开发(二)

第二讲 Hello World 密西西比河谷州立大学:Android应用程序开发(二),码迷,mamicode.com

Android Touch系统简介(二):实例详解onInterceptTouchEvent与onTouchEvent的调用过程

上一篇文章主要讲述了Android的TouchEvent的分发过程,其中有两个重要的函数:onInterceptTouchEvent和onTouchEvent,这两个函数可被重装以完成特定的逻辑.onInterceptTouchEvent的定义为于ViewGroup中,默认返回值为false,表示不拦截TouchEvent.onTouchEvent的定义位于View中,当ViewGroup要调用onTouchEvent时,会利用super.onTouchEvent.ViewGroup调用onTo

Android短信监听(二)——利用ContentObserver实现短信监听

MainActivity如下: package cc.testsmslistener; import cc.testsmslistener.SMSContentObserver.MessageListener; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.widget.TextView; import android.app.Activity; /** *

[Android]Volley源码分析(二)Cache

Cache作为Volley最为核心的一部分,Volley花了重彩来实现它.本章我们顺着Volley的源码思路往下,来看下Volley对Cache的处理逻辑. 我们回想一下昨天的简单代码,我们的入口是从构造一个Request队列开始的,而我们并不直接调用new来构造,而是将控制权反转给Volley这个静态工厂来构造. com.android.volley.toolbox.Volley: public static RequestQueue newRequestQueue(Context conte