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

首先,附上程序运行后的效果,如下图所示:

Android之通过网络播放一首简单的音乐_第1张图片



一.部署一个web项目到tomcat服务器上:

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

Android之通过网络播放一首简单的音乐_第2张图片

其中我们的音乐放置在如下图的目录底下:

Android之通过网络播放一首简单的音乐_第3张图片

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

Android之通过网络播放一首简单的音乐_第4张图片

注:如果你安装tomcat的格式是以压缩包的格式,可以打开tomcat解压目录后的bin目录下的startup.bat批处理文件开启这个服务。

3.开启完tomcat服务器,此时就把music这个web项目部署到tomcat服务器上了,此时就可以开始编写我们的安卓代码了。



二.在我们写安卓代码之前,还需要一个小小的步骤,就是我们安卓要如何访问我们部署到tomcat服务器上的项目,在web项目中,我们访问一个网页可以在地址栏输入:http://localhost:8083/music/index.jsp 这样来访问index.jsp页面,其中localhost也可以改为127.0.0.1,即代表本机,其中8083为一个端口号,但是在安卓中访问一个web项目有一些区别,其中有下面这几个小步骤:

1.首先,必须知道我们自己计算机上的IP地址,我们可以打开cmd命令行窗口,输入命令ipconfig,如下图所示:

Android之通过网络播放一首简单的音乐_第5张图片

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

2.接着,我们必须要知道我们tomcat服务器上的端口号是多少,我的是8083,我们要怎么查看tomcat的端口号呢,可以打开tomcat安装目录下的conf目录下的server.xml文件,看下端口号,如下图所示:

Android之通过网络播放一首简单的音乐_第6张图片

其中如果端口号占用的话,可以通过修改server.xml文件来修改端口号,即上图中的红色框起来的地方中的port值。

3.此时,在我们安卓中要访问部署在tomcat服务器上的web项目里的文件,可以使用下面的地址:http://192.168.1.1:8083/BBS/index.jsp,这样就可以访问web项目了,其中192.168.1.1为本机的IP地址,8083为服务器的端口号,其中我们可以直接在浏览器中输入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(按钮)都有一个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://当点击的为播放按钮时
			op = 1;
			break;
		case R.id.pause://当点击暂停按钮时
			op = 2;
			break;
		case R.id.stop://当点击停止按钮时
			op = 3;
			break;
		case R.id.finish://当点击返回图片按钮
			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语句来判断点击的是哪个按钮,并通过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"));//实例化对象,通过播放本机服务器上的一首音乐
			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时,即点击播放按钮时
			play();//调用play()方法
			break;
		case 2://当op为2时,即点击暂停按钮时
			pause();//调用pause()方法
			break;
		case 3://当op为3时,即点击停止按钮时
			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>"));
这样就可以访问部署在tomcat服务器上的music项目底下的mp3文件。

5.最后,不要忘了两件事,第一,我们必须要将MusicService类在AndroidManifest.xml文件里声明这个service。第二,因为我们是通过网络来访问本机服务器中的web项目,所以我们必须要在AndroidManifest.xml文件里指定一个允许访问网络资源的权限。

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

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

(2).此程序需要访问网络资源,所以需要在AndroidManifest.xml文件指定允许访问网络资源的权限,具体代码如下:

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



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

其中,上述代码中没有关闭服务,如果想要停止服务的话,可以调用stopService(intent)这个方法,其中intent指的是在MainActivity类中实例化的Intent对象。

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


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




你可能感兴趣的:(android,音乐,通过网络播放一首简单的音乐)