Android之通过网络播放一首简单的音乐

时间:2023-03-09 05:07:38
Android之通过网络播放一首简单的音乐

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

Android之通过网络播放一首简单的音乐

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

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

Android之通过网络播放一首简单的音乐

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

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

Android之通过网络播放一首简单的音乐

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

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

Android之通过网络播放一首简单的音乐

注:假设你安装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,例如以下图所看到的:

Android之通过网络播放一首简单的音乐

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号。例如以下图所看到的:

Android之通过网络播放一首简单的音乐

当中假设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对象。

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

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