Android简易实战教程--第四十一话《vitamio网络收音机》
在Android初级教程专栏里面,介绍了Android原生的VideoView和vitamio框架Android视频媒体相关,VideoView和开源框架vitamio。并演示了播放网络视频的对应的Demo,本篇以小案例的方式,使用vitamio完成播放网络的收音机频道。
集成vitamio过程如下(回忆):
ViewView的集成过程:
- 下载lib包.demo:
https://github.com/yixia/VitamioBundle - 新建工程,引入lib包
是否修改androidmanifest.xml
权限
<uses-permission android:name="android.permission.INTERNET" />
添加activity
<!-- vitamio add -->
<activity
android:name="io.vov.vitamio.activity.InitActivity"
android:configChanges="orientation|screenSize|smallestScreenSize|keyboard|keyboardHidden|navigation"
android:launchMode="singleTop"
android:theme="@android:style/Theme.NoTitleBar"
android:windowSoftInputMode="stateAlwaysHidden" />
写代码
//使用vitamio需要初始化引擎,引擎的检查
/**---------------需要注意 begin---------------**/
if (!LibsChecker.checkVitamioLibs(this))
return;
/**---------------需要注意 end---------------**/ mVitamio_vv = (VideoView) findViewById(R.id.vitamio_vv);
/**---------------设置监听---------------**/
mVitamio_vv.setOnPreparedListener(this);
mVitamio_vv.setOnErrorListener(this);
mVitamio_vv.setOnCompletionListener(this);
//设置路径
mVitamio_vv.setVideoPath("storage/emulated/0/Download/5.mkv");
//设置控制条
mVitamio_vv.setMediaController(new MediaController(this));
//开始播放
mVitamio_vv.start();
本案例Demo:
布局文件代码:
<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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" > <Button
android:layout_width="wrap_content"
android:onClick="click"
android:layout_height="wrap_content"
android:text="播放mms网络收音机" /> </RelativeLayout>
只有一个按钮,给这个按钮xml的方式添加点击事件。作用是播放mms网络收音机
配置文件中的代码如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.vitamiodemo_mediaplay"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" /> <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.vitamiodemo_mediaplay.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>
<!-- vitamio add -->
<activity
android:name="io.vov.vitamio.activity.InitActivity"
android:configChanges="orientation|screenSize|smallestScreenSize|keyboard|keyboardHidden|navigation"
android:launchMode="singleTop"
android:theme="@android:style/Theme.NoTitleBar"
android:windowSoftInputMode="stateAlwaysHidden" />
</application> <uses-permission android:name="android.permission.INTERNET" /> </manifest>
权限
<uses-permission android:name="android.permission.INTERNET" />
添加activity
<!-- vitamio add -->
<activity
android:name="io.vov.vitamio.activity.InitActivity"
android:configChanges="orientation|screenSize|smallestScreenSize|keyboard|keyboardHidden|navigation"
android:launchMode="singleTop"
android:theme="@android:style/Theme.NoTitleBar"
android:windowSoftInputMode="stateAlwaysHidden" />
活动中的代码:
package com.example.vitamiodemo_mediaplay; import io.vov.vitamio.LibsChecker;
import io.vov.vitamio.MediaPlayer;
import io.vov.vitamio.MediaPlayer.OnCompletionListener;
import io.vov.vitamio.MediaPlayer.OnErrorListener;
import io.vov.vitamio.MediaPlayer.OnPreparedListener;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast; public class MainActivity extends Activity implements OnErrorListener, OnPreparedListener, OnCompletionListener { private MediaPlayer mMediaPlayer; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//使用vitamio需要初始化引擎,引擎的检查
/**---------------需要注意 begin---------------**/
if (!LibsChecker.checkVitamioLibs(this))
return;
/**---------------需要注意 end---------------**/ } public void click(View v) {
try {
mMediaPlayer = new MediaPlayer(this);
//设置监听器
mMediaPlayer.setOnErrorListener(this);
mMediaPlayer.setOnPreparedListener(this);
mMediaPlayer.setOnCompletionListener(this);
//准备播放
mMediaPlayer.reset();//重置MediaPlayer
//设置播放来源
mMediaPlayer.setDataSource("mms://mediasrv2.iptv.xmg.com.cn/yinyue");
mMediaPlayer.prepareAsync();//网络,所以使用异步加载。真正的播放去对应的监听器里面开启(onPrepared)
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } @Override
public void onCompletion(MediaPlayer mp) {
Toast.makeText(getApplicationContext(), "播放完了", 0).show();
} @Override
public void onPrepared(MediaPlayer mp) {
Toast.makeText(getApplicationContext(), "准备好了", 0).show();
mMediaPlayer.start(); } @Override
public boolean onError(MediaPlayer mp, int what, int extra) {
Toast.makeText(getApplicationContext(), "资源有问题", 0).show();
// TODO
return true;
} @Override
protected void onDestroy() {
if (mMediaPlayer != null) {
//销毁活动,释放资源
mMediaPlayer.release();
mMediaPlayer = null;
}
super.onDestroy();
} }
还是老规矩,代码中加入详细的注释,相信没有什么问题。赶快运行点击按钮,去播放mms://mediasrv2.iptv.xmg.com.cn/yinyue频道下边的实时音频信息吧~
PS:您的网络最好好一点,在网络较差的时候,可能找不到这个频道。网络较好是没有问题的。
喜欢的朋友可以关注我哦,不定期更新简单有趣的安卓小文~
Android简易实战教程--第四十一话《vitamio网络收音机》的更多相关文章
- Android简易实战教程--第一话《最简单的计算器》
转载请注明出处:http://blog.csdn.net/qq_32059827/article/details/51707931 从今天开始,本专栏持续更新Android简易实战类博客文章.和以往专 ...
- Android简易实战教程--第九话《短信备份~二》
这一篇,承接地八话.使用高效的方式备份短信--xml序列化器. 存储短信,要以对象的方式存储.首先创建javabean: package com.itydl.createxml.domain; pub ...
- Android简易实战教程--第二话《两种进度条》
点击按钮模拟进度条下载进度,"下载"完成进度条消失. 代码如下: xml: <?xml version="1.0" encoding="utf- ...
- Android简易实战教程--第五十话《动画扫描》
祝新年快乐!2017(一起)前行. 转载博客请注明出处:道龙的博客 本篇简答的小案例,使用动画知识,完成一个类似雷达扫描效果,并且加入自定义进度条.对于自定义进度条前面有很详细的解析和案例了,本篇就结 ...
- Android简易实战教程--第十六话《SharedPreferences保存用户名和密码》
之前在Android简易实战教程--第七话<在内存中存储用户名和密码> 那里是把用户名和密码保存到了内存中,这一篇把用户名和密码保存至SharedPreferences文件.为了引起误导, ...
- Android简易实战教程--第五十一话《使用Handler实现增加、减少、暂停计数》
转载博客请注明出处:道龙的博客 之前,写过一篇使用异步任务AysncTask实现倒计时的小案例,喜欢的话可以参考博客:Android简易实战教程--第三十三话< AsyncTask异步倒计时&g ...
- Android简易实战教程--第四十八话《Android - Timer、TimerTask和Handler实现倒计时》
之前本专栏文章中的小案例有写到:第三十九话<Chronometer实现倒计时> 以及使用异步实现倒计时:第三十三话< AsyncTask异步倒计时> 本篇文章 结合Timer. ...
- Android简易实战教程--第四十六话《RecyclerView竖向和横向滚动》
Android5.X后,引入了RecyclerView,这个控件使用起来非常的方便,不但可以完成listView的效果,而且还可以实现ListView无法实现的效果.当然,在新能方便也做了大大的提高. ...
- Android简易实战教程--第三十六话《电话录音》
今天完成一个简单的电话录音功能,即接通电话后,立即录下自己打电话的声音.实现起来比较简单:一个服务,一个TelephonyManager.一个MediaRecorder就够了. 1.布局提供一个开启录 ...
随机推荐
- 学习HTML的第三次课
浏览器的地址栏中有字数限制,大约为200个字符. 1.表单:<form action="" method=""></form> 属性: ...
- 机器学习基石:02 Learning to Answer Yes/No
Perceptron Learning Algorithm 感知器算法, 本质是二元线性分类算法,即用一条线/一个面/一个超平面将1,2维/3维/4维及以上数据集根据标签的不同一分为二. 算法确定后, ...
- luogu2252 取石子游戏
题目描述 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后把石子全部取完 ...
- codeforces Gym - 100633J Ceizenpok’s formula
拓展Lucas #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring ...
- Codeforces 802L Send the Fool Further! (hard)
Description 题面 题目大意:求从根节点出发,每次随机走一个相邻的点,问走到任意一个叶子节点经过的路径长度的期望(走到就停止) Solution 树上高斯消元,复杂度是 \(O(n)\) 的 ...
- 网络编程基础API
1.预备知识 网络字节序 1.TCP/IP协议规定,网络数据流应采用大端字节序 0x12345678 小端存储:78存储在低地址 大端存储:12存储在低地址 网络字节序和主机字节序的转换 #inclu ...
- hdu 5700区间交(线段树)
区间交 Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submiss ...
- poj2449 (第k条最短路)
题意:求n个点中,a到b的第k条最短路 思路: 用最短路求出估价函数的h,再在搜索过程中记录g,利用A*求出 最开始想到的便是A*和最短路,但是脑子抽了,居然一个一个去求- -,TL了后才发现可以倒着 ...
- [bzoj省选十连测推广赛2]T2七彩树
抄自:http://blog.csdn.net/coldef/article/details/61412577 当时看了就不会,看了别人的题解不懂怎么维护,最后抄了个代码....... 给定一棵n个点 ...
- 在confluence中出现Handshake failed due to invalid Upgrade header: null
在confluence中出现Handshake failed due to invalid Upgrade header: null 昨天晚上同事说confluence写完日志保存不了,然后我登陆co ...