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.布局提供一个开启录 ...
随机推荐
- Spring(3)——装配 Spring Bean 详解
装配 Bean 的概述 前面已经介绍了 Spring IoC 的理念和设计,这一篇文章将介绍的是如何将自己开发的 Bean 装配到 Spring IoC 容器中. 大部分场景下,我们都会使用 Appl ...
- cogs 619. [金陵中学2007] 传话
提交地址:http://cojs.tk/cogs/problem/problem.php?pid=619 619. [金陵中学2007] 传话 ★☆ 输入文件:messagez.in 输出文件 ...
- [Codeforces 235B]Let's Play Osu!
Description 题库链接 有一个长度为 \(n\) 的 "XO" 序列,其中第 \(i\) 个位置 "O" 出现的概率为 \(p_i\) .一个序列的价 ...
- [AHOI 2012]树屋阶梯
Description 暑假期间,小龙报名了一个模拟野外生存作战训练班来锻炼体魄,训练的第一个晚上,教官就给他们出了个难题.由于地上露营湿气重,必须选择在高处的树屋露营.小龙分配的树屋建立在一颗高度为 ...
- C++Primer学习——动态内存
静态内存:用来保存static 栈内存:保存非static 智能指针: shared_ptr:允许多个指针指向一个对象 unique_ptr:独占所指对象 weak_ptr:一种弱引用,指向share ...
- hdu 5112 (2014北京 水)
题意:有个人在跑步,一直每个时间他所在的位置,求最大速度 #include <iostream> #include <cstring> #include <cstdio& ...
- 关于快速沃尔什变换(FWT)的一点学习和思考
最近在学FWT,抽点时间出来把这个算法总结一下. 快速沃尔什变换(Fast Walsh-Hadamard Transform),简称FWT.是快速完成集合卷积运算的一种算法. 主要功能是求:,其中为集 ...
- hdu5601 BestCoder Round #67 (div.2)
N*M bulbs Accepts: 94 Submissions: 717 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 655 ...
- python raise和assert的区别
python中raise和assert的区别 一.使用raise抛出异常 python可以自动触发异常,raise(内置函数)的定义为显示的抛出异常,用户可以使用raise进行判断,显式的引发异常,r ...
- P2P技术详解(三):P2P技术之STUN、TURN、ICE详解
1.内容概述 在现实Internet网络环境中,大多数计算机主机都位于防火墙或NAT之后,只有少部分主机能够直接接入Internet.很多时候,我们希望网络中的两台主机能够直接进行通信,即所谓的P2P ...