首先,附上程序执行后的效果。例如以下图所看到的:

一.部署一个web项目到tomcatserver上:

1.这个小程序是结合网络来播放一首音乐的,首先,把我们搞好的一个web项目放置在tomcat安装文件夹下的webapps文件夹底下。当中这个web项目名为music,文件夹结构例如以下:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast">

当中我们的音乐放置在例如以下图的文件夹底下:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast">

2.接着我们开启tomcat 7.0server。我安装的tomcat是exe格式的,所以我在计算机—管理——服务和应用程序—服务 下有一个tomcat 7.0的服务,开启后例如以下图所看到的:

注:假设你安装tomcat的格式是以压缩包的格式。能够打开tomcat解压文件夹后的bin文件夹下的startup.bat批处理文件开启这个服务。

3.开启完tomcatserver。此时就把music这个web项目部署到tomcatserver上了,此时就能够開始编写我们的安卓代码了。

二.在我们写安卓代码之前,还须要一个小小的步骤,就是我们安卓要怎样訪问我们部署到tomcatserver上的项目,在web项目中,我们訪问一个网页能够在地址栏输入:http://localhost:8083/music/index.jsp 这样来訪问index.jsp页面,当中localhost也能够改为127.0.0.1,即代表本机,当中8083为一个port号,可是在安卓中訪问一个web项目有一些差别,当中有以下这几个小步骤:

1.首先,必须知道我们自己计算机上的IP地址,我们能够打开cmd命令行窗体。输入命令ipconfig,例如以下图所看到的:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast">

当中选择你已经连上的网络的IPv4地址,这个IP地址是安卓和web项目进行网络连接所须要的。

2.接着,我们必需要知道我们tomcat服务器上的port号是多少,我的是8083,我们要怎么查看tomcat的port号呢,能够打开tomcat安装文件夹下的conf文件夹下的server.xml文件。看下port号。例如以下图所看到的:

当中假设port号占用的话。能够通过改动server.xml文件来改动port号,即上图中的红色框起来的地方中的port值。

3.此时,在我们安卓中要訪问部署在tomcatserver上的web项目里的文件。能够使用以下的地址:http://192.168.1.1:8083/BBS/index.jsp,这样就能够訪问web项目了,当中192.168.1.1为本机的IP地址。8083为server的port号,当中我们能够直接在浏览器中输入http://192.168.1.1:8083/BBS/index.jsp 訪问这个index.jsp页面。

三.接下来就能够编写安卓代码了:

1.首先,新建一个android项目,打开layout文件夹下的activity_main.xml布局文件,代码例如以下:

<LinearLayout 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:orientation="vertical" > <RelativeLayout
android:layout_width="match_parent"
android:layout_height="44dp"
android:background="@drawable/title_bar1" > <ImageView
android:id="@+id/finish"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="click"
android:src="@drawable/finish1" /> <TextView
android:id="@+id/music_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="5dp"
android:text="@string/text"
android:textSize="23sp" /> </RelativeLayout> <ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_weight="1.05"
android:src="@drawable/img2" /> <RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical|center_horizontal" > <Button
android:id="@+id/play"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="click"
android:text="@string/play" /> <Button
android:id="@+id/pause"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/play"
android:onClick="click"
android:text="@string/pause" /> <Button
android:id="@+id/stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/pause"
android:onClick="click"
android:text="@string/stop" />
</RelativeLayout> </LinearLayout>

当中的一个id为finish的ImageView(图片视图)和底下的三个Button(button)都有一个android:onClick属性,都为click,所以在MainActivity类就要写一个click()方法,这种方法为ImageView和Button点击时触发的方法,这样就能够降低代码量,不用使用findViewById和设置事件监听了。

2.当中activity_main.xml布局文件所需的文字我都放在strings.xml文件中,代码例如以下:

<?xml version="1.0" encoding="utf-8"?

>
<resources> <string name="app_name">通过网络播放音乐</string>
<string name="hello_world">Hello world!</string>
<string name="menu_settings">Settings</string>
<string name="text">金海心—那么骄傲</string>
<string name="play">播放</string>
<string name="pause">暂停</string>
<string name="stop">停止</string>
<string name="exit">退出</string>
</resources>

3.接着附上MainActivity.java文件的代码。代码例如以下:

package com.example.android_intent_playmusic;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
} public void click(View v){
Intent intent = new Intent(MainActivity.this, MusicService.class);//实例化一个Intent对象
int op = -1;//设置中间变量op
switch (v.getId()) {
case R.id.play://当点击的为播放button时
op = 1;
break;
case R.id.pause://当点击暂停button时
op = 2;
break;
case R.id.stop://当点击停止button时
op = 3;
break;
case R.id.finish://当点击返回图片button
finish();//返回上一个界面
break;
default:
break;
} Bundle bundle = new Bundle();//实例化一个Bundle对象
bundle.putInt("msg", op);//把op的值放入到bundle对象中
intent.putExtras(bundle);//再把bundle对象放入intent对象中
startService(intent);//开启这个服务
}
}

当中的click()方法里的switch case语句来推断点击的是哪个button,并通过op这个中间变量传递给MusicService服务类,在MainActivity中开启MusicService这个服务。

4. 接下来附上MusicService这个服务类,这个类继承了Service类。代码例如以下:

package com.example.android_intent_playmusic;

import java.io.IOException;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.os.IBinder; public class MusicService extends Service { private MediaPlayer player;//声明一个MediaPlayer对象 @Override
public IBinder onBind(Intent arg0) {
// TODO 自己主动生成的方法存根
return null;
} //创建服务
@Override
public void onCreate() {
// 当player对象为空时
if (player == null) {
player = MediaPlayer.create(MusicService.this, Uri
.parse("http://192.168.1.110:8083/music/music/music2.mp3"));//实例化对象,通过播放本机server上的一首音乐
player.setLooping(false);//设置不循环播放
}
super.onCreate();
} //销毁服务
@Override
public void onDestroy() {
//当对象不为空时
if (player != null) {
player.stop();//停止播放
player.release();//释放资源
player = null;//把player对象设置为null
}
super.onDestroy();
} //開始服务
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO 自己主动生成的方法存根
Bundle b = intent.getExtras();//获取到从MainActivity类中传递过来的Bundle对象
int op = b.getInt("msg");//再获取到MainActivity类中op的值
switch (op) {
case 1://当op为1时。即点击播放button时
play();//调用play()方法
break;
case 2://当op为2时,即点击暂停button时
pause();//调用pause()方法
break;
case 3://当op为3时。即点击停止button时
stop();//调用stop()方法
break;
default:
break;
}
return super.onStartCommand(intent, flags, startId);
} //停止播放音乐方法
private void stop() {
// 当player对象不为空时
if (player != null) {
player.seekTo(0);//设置从头開始
player.stop();//停止播放
try {
player.prepare();//预载入音乐
} catch (IllegalStateException e) {
// TODO 自己主动生成的 catch 块
e.printStackTrace();
} catch (IOException e) {
// TODO 自己主动生成的 catch 块
e.printStackTrace();
}
}
} //暂停播放音乐方法
private void pause() {
// 当player对象正在播放时而且player对象不为空时
if (player.isPlaying() && player != null) {
player.pause();//暂停播放音乐
}
} //播放音乐方法
private void play() {
// 当player对象不为空而且player不是正在播放时
if (player != null && !player.isPlaying()) {
player.start();//開始播放音乐
}
} }
</pre></p><p></p><p>当中通过例如以下代码:<pre class="java" name="code">player = MediaPlayer.create(MusicService.this, Uri.parse("<a target=_blank href="http://192.168.1.115:8083/music/music/music2.mp3">http://192.168.1.115:8083/music/music/music2.mp3</a>"));

这样就能够訪问部署在tomcatserver上的music项目底下的mp3文件。

5.最后,不要忘了两件事。第一,我们必需要将MusicService类在AndroidManifest.xml文件中声明这个service。

第二。由于我们是通过网络来訪问本机server中的web项目,所以我们必需要在AndroidManifest.xml文件中指定一个同意訪问网络资源的权限。

(1).声明service。放在<application></application>标记下,代码例如以下:

<service android:name=".MusicService"></service>

(2).此程序须要訪问网络资源,所以须要在AndroidManifest.xml文件指定同意訪问网络资源的权限,详细代码例如以下:

<uses-permission android:name="android.permission.INTERNET"/>

四.执行此android项目,效果如上面的效果图。点击播放button,開始播放音乐。点击暂停button,暂停播放,再次点击播放button,继续播放。点击停止button。停止播放。再次点击播放button。从头開始播放;点击上面的返回图片。返回到上一个页面。

当中,上述代码中没有关闭服务。假设想要停止服务的话,能够调用stopService(intent)这种方法,当中intent指的是在MainActivity类中实例化的Intent对象。

上述代码下载地址:源代码下载

五.以上内容仅供大家学习參考。写得不好。请见谅,如有错误,请指出。谢谢!



Android之通过网络播放一首简单的音乐的更多相关文章

  1. Android开发学习之路--MediaPlayer之简单音乐播放器初体验

    很多时候我们都会用手机来播放音乐,播放视频,那么具体地要怎么实现呢,其实主要是MediaPlayer类来完成的.下面通过简单的例子来实现一首歌曲的播放吧.新建工程MediaPlayerStudy,这里 ...

  2. 使用Service组件实现简单的音乐播放器功能 --Android基础

    1.本例利用Service实现简单的音乐播放功能,下面是效果图.(点击开始播放开启服务,音乐播放,点击“停止播放”关闭服务,音乐停止播放.) 2.核心代码: MusicService.java: pa ...

  3. Android Service AIDL 远程调用服务 【简单音乐播放实例】

    Android Service是分为两种: 本地服务(Local Service): 同一个apk内被调用 远程服务(Remote Service):被另一个apk调用 远程服务需要借助AIDL来完成 ...

  4. 开源框架】Android之史上最全最简单最有用的第三方开源库收集整理,有助于快速开发

    [原][开源框架]Android之史上最全最简单最有用的第三方开源库收集整理,有助于快速开发,欢迎各位... 时间 2015-01-05 10:08:18 我是程序猿,我为自己代言 原文  http: ...

  5. Android系列之网络(一)----使用HttpClient发送HTTP请求(通过get方法获取数据)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  6. Android ListView从网络获取图片及文字显示

    上一篇文章说的是ListView展示本地的图片以及文本,这一篇说一下如何从网络获取图片以及文本来显示.事实上,一般是先获取Josn或sml数据,然后解释显示.我们先从网上获取xml,然后对其进行解析, ...

  7. Android直播实现 Android端推流、播放

    最近想实现一个Android直播,但是对于这方面的资料都比较零碎,一开始是打算用ffmpeg来实现编码推流,在搜集资料期间,找到了几个强大的开源库,直接避免了jni的代码,集成后只用少量的java代码 ...

  8. nginx android app 慢网络请求超时

    最近遇到了android 在慢网络下面请求服务器报 java.net.SocketException: recvfrom failed: ECONNRESET (Connection reset by ...

  9. 5、android ConnectivityManager获取网络状态

    ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 ...

随机推荐

  1. 逆向课程第二讲,寻找main入口点

    逆向课程第二讲,寻找main入口点 一丶识别各个程序的入口点 入门知识,识别各个应用程序的入口点 (举例识别VC 编译器生成,以及VS编译生成的Debug版本以及Release版本) 1.识别VC6. ...

  2. Javascript下IE与Firefox下的差异兼容写法总结

    http://www.jb51.net/article/23923.htm     总结一部分IE和Firefox的javascript差异写法,对于像书写多浏览器兼容性更好的代码,可以参考下.   ...

  3. ruby 异常处理 begin rescue end

    begin 代码1 rescue 代码 end 如果执行 代码1 发生异常 则转至 代码2 若正常,则执行完跳出

  4. Python丨Python 性能分析大全

    虽然运行速度慢是 Python 与生俱来的特点,大多数时候我们用 Python 就意味着放弃对性能的追求.但是,就算是用纯 Python 完成同一个任务,老手写出来的代码可能会比菜鸟写的代码块几倍,甚 ...

  5. 阿里云centos配置postfix

    1. 为了防止垃圾邮件,先到域名控制面板设置好. MX A 记录及TXT记录 其中TXT记录如下  @  spf1 a mx ~all 意思就是使用spf1协议,允许a记录和MX记录对应的IP,不允许 ...

  6. QT中槽的使用

    一.建立槽和按钮之间的连接 connect(信号发送者,发送的信号,信号接收者,信号接收者的槽函数) 1.例子 connect(ui->pushButton,SIGNAL(clicked(boo ...

  7. struts2+spring3+hibernate3+mysql简单登录实现

    1.导入相关的jar包 2.建立数据库 1 create table account( 2 id int(10), 3 user varchar(50), 4 paw varchar(50) 5 ); ...

  8. hadoop的webUI查看Live Nodes为1

    开起了两个节点,而且jps查看确实开启了,但是用web端50070查看却一直显示为1 经过排查,将虚拟机直接copy一份,但是之前配置好hadoop环境的namenode格式化(format)生成的文 ...

  9. spring @Autowired和jdk的@Resource区别

    当一个接口只有一个实例时,使用这两个注解的效果是一样的. 当含有两个实例时,非得使用 @Autowired 那么定义的引用类型必须和service实现类定义的名字相同,参照下图 定义第一个servic ...

  10. JDBC数据库编程

    常识名词:ODBC ,JDBC,JDBC API ,JDBC Driver API  数据准备,续上节:   JDBC编程流程 最基本的JDBC操作 本段内容主要完成JDBC的增删查改操作 packa ...