======================帖子内容===================================
最近喜欢听广播,但是搜索了一下,苦于网上没有Android的网络收音机项目的例子,于是自己动手实现了Android网络收音机项目。 
前言,由于很多网络广播使用的协议是mms,来自微软,但是android并不支持这种流媒体协议,我的解决办法是使用Vitamio插件+Vitamio库的方式解决。这样在安装app本身的apk同时还要安装对应你手机的Vitamio插件,这个插件是老外开发的还免费,支持很多媒体格式,安上一个也挺好的,大概3M多。有一点要注意的是这个插件跟硬件有关,所以...所以如果你可以一个一个的试,看哪个适应你的手机硬件,这个插件有4个版本: 
ARMv6: for some low end devices (Market, VOV) 
VFP: for some low end devices with VFP support (Market, VOV) 
ARMv7: for ARMv7 devices without NEON support, such as Tegra 2 powered  devices(Market, VOV) 
NEON: for ARMv7 devices with NEON support (Market, VOV) 
具体可以上http://vov.io/vitamio/看一下,我的烂手机是VFP这个版本的。 
开始前的准备,你最好在上面的官网上下载一份API看看:Vitamio-SDK.7z。SDK里面还有vitamio.jar这个jar文件,里面有流媒体的控制类。OK废话不多说,上代码(导jar包相信大家都了然,这里不作介绍):

AndroidManifest文件

  1. <?xml version="1.0" encoding="utf-8"?
  2. <manifest xmlns:android="[url=http://schemas.android.com/apk/res/android]http://schemas.android.com/apk/res/android[/url]"
  3. package="com.netradiodemo"
  4. android:versionCode="1"
  5. android:versionName="1.0">
  6. <uses-sdk android:minSdkVersion="10" />
  7. <uses-permission android:name="android.permission.INTERNET"></uses-permission>
  8. <application android:icon="@drawable/icon" android:label="@string/app_name"
  9. android:theme="@android:style/Theme.Black">
  10. <activity android:name=".NetRadioDemoActivity"
  11. android:label="@string/app_name">
  12. <intent-filter>
  13. <action android:name="android.intent.action.MAIN" />
  14. <category android:name="android.intent.category.LAUNCHER" />
  15. </intent-filter>
  16. </activity>
  17. <activity android:name=".compnents.PlayerActivity"></activity>
  18. </application>
  19. </manifest>

复制代码

主页面布局文件main未修改,播放页面布局文件如下play_page

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="[url=http://schemas.android.com/apk/res/android]http://schemas.android.com/apk/res/android[/url]"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. >
  7. <Button
  8. android:id="@+id/btn_start"
  9. android:layout_gravity="center_horizontal"
  10. android:layout_width="match_parent"
  11. android:layout_height="wrap_content"
  12. android:text="听猫扑"
  13. android:textSize="30sp"
  14. android:onClick="doStart"
  15. />
  16. <Button
  17. android:id="@+id/btn_stop"
  18. android:layout_gravity="center_horizontal"
  19. android:layout_width="match_parent"
  20. android:layout_height="wrap_content"
  21. android:text="不听猫扑"
  22. android:textSize="30sp"
  23. android:onClick="doStop"
  24. />
  25. </LinearLayout>

复制代码

第一个activity代码,主要负责检查插件NetRadioDemoActivity 
Java代码

  1. package com.netradiodemo;
  2. import io.vov.vitamio.VitamioInstaller;
  3. import io.vov.vitamio.VitamioInstaller.VitamioNotCompatibleException;
  4. import io.vov.vitamio.VitamioInstaller.VitamioNotFoundException;
  5. import android.app.Activity;
  6. import android.content.Intent;
  7. import android.os.Bundle;
  8. import android.util.Log;
  9. import android.view.View;
  10. import android.view.View.OnClickListener;
  11. import android.widget.Button;
  12. import android.widget.LinearLayout.LayoutParams;
  13. import android.widget.TextView;
  14. import android.widget.Toast;
  15. import com.netradiodemo.compnents.PlayerActivity;
  16. public class NetRadioDemoActivity extends Activity {
  17. Intent intent ;
  18. @Override
  19. public void onCreate(Bundle savedInstanceState) {
  20. super.onCreate(savedInstanceState);
  21. setContentView(R.layout.main);
  22. intent = new Intent(this, PlayerActivity.class);
  23. TextView tvCheck = new TextView(this);
  24. tvCheck.setText("使用前请检查是否安装了Vitamio插件:");
  25. this.addContentView(tvCheck, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
  26. Button btnCheck = new Button(this);
  27. btnCheck.setText("检查");
  28. btnCheck.setOnClickListener(new OnClickListener() {
  29. @Override
  30. public void onClick(View arg0) {
  31. try {
  32. String isInstallerString = VitamioInstaller.checkVitamioInstallation(NetRadioDemoActivity.this);//检查插件是否安装成功,这里是一个费时操作,应该启新线程处理,作为一个demo我就不做了
  33. Log.i("tag",isInstallerString); //插件安装成功后,Log中显示插件名称
  34. if(isInstallerString!=null){
  35. Toast.makeText(NetRadioDemoActivity.this, "已安装正确版本Vitamio!", Toast.LENGTH_LONG).show();
  36. startActivity(intent);//开启收听界面
  37. }else{
  38. Toast.makeText(NetRadioDemoActivity.this, "没有匹配的Vitamio!", Toast.LENGTH_LONG).show();
  39. finish();//没有插件安装失败,则结束程序
  40. }
  41. } catch (VitamioNotCompatibleException e) {
  42. e.printStackTrace();
  43. } catch (VitamioNotFoundException e) {
  44. e.printStackTrace();
  45. }
  46. }
  47. });
  48. this.addContentView(btnCheck, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
  49. }
  50. }

复制代码

第二个activity,主要负责播放PlayerActivity

  1. package com.netradiodemo.compnents;
  2. import io.vov.vitamio.MediaPlayer;
  3. import io.vov.vitamio.VitamioInstaller.VitamioNotCompatibleException;
  4. import io.vov.vitamio.VitamioInstaller.VitamioNotFoundException;
  5. import io.vov.vitamio.widget.MediaController;
  6. import java.io.IOException;
  7. import android.app.Activity;
  8. import android.os.Bundle;
  9. import android.view.View;
  10. import android.widget.LinearLayout.LayoutParams;
  11. import com.netradiodemo.R;
  12. public class PlayerActivity extends Activity {
  13. MediaPlayer mPlayer;
  14. @Override
  15. protected void onCreate(Bundle savedInstanceState) {
  16. setContentView(R.layout.play_page);
  17. MediaController controller = new MediaController(this);//创建控制对象
  18. this.addContentView(controller, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
  19. String path = "mms://ting.mop.com/mopradio";//猫扑电台地址,这里可以添加自己的喜欢的电台地址,mms协议的
  20. try {
  21. mPlayer = new MediaPlayer(this);//播放流媒体的对象
  22. mPlayer.setDataSource(path);//设置流媒体的数据源
  23. mPlayer.prepare();
  24. } catch (VitamioNotCompatibleException e) {
  25. e.printStackTrace();
  26. } catch (VitamioNotFoundException e) {
  27. e.printStackTrace();
  28. } catch (IllegalArgumentException e) {
  29. e.printStackTrace();
  30. } catch (IllegalStateException e) {
  31. e.printStackTrace();
  32. } catch (IOException e) {
  33. e.printStackTrace();
  34. }
  35. super.onCreate(savedInstanceState);
  36. }
  37. public void doStart(View view){
  38. mPlayer.start();//开始播放
  39. }
  40. public void doStop(View view){
  41. mPlayer.stop();//停止播放
  42. }
  43. }

复制代码

完成,猫扑电台悦耳的声音从我的手机里播放出来啦。

[Android实例] Android网络收音机项目(内含源码)的更多相关文章

  1. 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新

    本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...

  2. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  3. 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新

    上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...

  4. [Android实例] Scroll原理-附ScrollView源码分析

    想象一下你拿着放大镜贴很近的看一副巨大的清明上河图, 那放大镜里可以看到的内容是很有限的, 而随着放大镜的上下左右移动,就可以看到不同的内容了 android中手机屏幕就相当于这个放大镜, 而看到的内 ...

  5. [Android实例] Scroll原理-附ScrollView源码分析 (转载)

    想象一下你拿着放大镜贴很近的看一副巨大的清明上河图, 那放大镜里可以看到的内容是很有限的, 而随着放大镜的上下左右移动,就可以看到不同的内容了 android中手机屏幕就相当于这个放大镜, 而看到的内 ...

  6. SSM完整项目(内含源码)

    SSM 电影后台管理项目 概述 通过对数据库中一张表的CRUD,将相应的操作结果渲染到页面上. 笔者通过这篇博客还原了项目(当然有一些隐藏的坑),然后将该项目上传到了Github.Gitee,在末尾会 ...

  7. 开源项目Telegram源码 Telegram for Android Source

    背景介绍 Telegram 是一款跨平台的即时通信软件,它的客户端是自由及开放源代码软件.用户可以相互交换加密与自毁消息,发送照片.影片等所有类型文件.官方提供手机版.桌面版和网页版等多种平台客户端. ...

  8. 50个Android开发人员必备UI效果源码[转载]

    50个Android开发人员必备UI效果源码[转载] http://blog.csdn.net/qq1059458376/article/details/8145497 Android 仿微信之主页面 ...

  9. android浪漫樱花凋零动态壁纸应用源码

    android浪漫樱花凋零动态壁纸应用源码,是从那个安卓教程网拿过来的,本项目是一套基于安卓的樱花动态壁纸项目源码,安装以后桌面没有图标,但是可以在修改壁纸-动态壁纸中找到.我的分辨率是480×854 ...

随机推荐

  1. Java代码三级跳——表达式、语句和代码块

    Java代码三级跳—表达式.语句和代码块 表达式(expression):Java中最基本的一个运算.比如一个加法运算表达式.1+2是一个表达式,a+b也是. 语句(statement):类似于平时说 ...

  2. robotframe常用的类库、对应的方法和属性

    robotframe常用的类库.对应的方法和属性

  3. IIS反向代理配置教程(最终完整版本)

    IIS代理配置教程 插件下载:https://download.csdn.net/download/song_yan_/11996489 一.安装反向代理插件 1.rewrite插件安装 (1) 双击 ...

  4. 一个基础的问题 多个$(function(){})里面的函数 为什么在下一个$(function(){})里没法执行。

    先看下例子 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <tit ...

  5. Django 单元测试笔记

    引言 关于单元测试的基本知识这里不再讲述,简单一句话:单元测试是用一段代码去测试另一段代码.最常用的框架是unittest,这是python的单元测试框架,而django单元测试框架test.Test ...

  6. JavaSE复习~开发环境的搭建 与 HelloWorld

    JDK的下载 访问Oracle官网,下载jdk,目前来说用的最多的是 8 版本 https://www.oracle.com/technetwork/java/javase/downloads/ind ...

  7. 201771010135杨蓉庆 《面对对象程序设计(java)》第九周学习总结

    第7章 异常.日志.断言和调试 1.实验目的与要求 (1) 掌握java异常处理技术: (2) 了解断言的用法: (3) 了解日志的用途: (4) 掌握程序基础调试技巧: 一.理论知识 1.异常:在程 ...

  8. 翻页插件 jquery

    //css <style> * { padding:; margin:; list-style: none; } .wrapper { width: 100%; cursor: point ...

  9. 吴裕雄 python 神经网络——TensorFlow 实现LeNet-5模型处理MNIST手写数据集

    import os import numpy as np import tensorflow as tf from tensorflow.examples.tutorials.mnist import ...

  10. MySQL优化2.索引

    什么是索引: 索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容. 建立索引合适的列 经常用作where条件的列,order by排序的列 数据列不重复而且并不是唯一的几个值 不被经常 ...