android小应用,只能播放一首歌的应用

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u012561176/article/details/46343987

1.上学期,选修课为安卓,要求我们做一个小应用作为安卓的大作业,我就做了一个小小的音乐播放器,实现的功能很少,就是使用Service服务来播放一首音乐,其中用了很多菜单效果,然后主界面实现了一个画廊的效果,使用Gallery这个过时的控件来做,并有三个图片按钮,功能为暂停,播放,停止音乐,下面有个滑动条实现了控制音量的功能,主页面如下所示:



2.布局文件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" >

    <Gallery
        android:id="@+id/gallery1"
        android:layout_width="match_parent"
        android:layout_height="330dp"
        android:spacing="10px"
        android:unselectedAlpha="0.8" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/dzp"
        android:orientation="vertical"
        android:padding="10dp" >

        <RelativeLayout
            android:id="@+id/relativeLayout1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom"
            android:gravity="center_vertical|center_horizontal" >

            <ImageButton
                android:id="@+id/play"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:onClick="click"
                android:padding="10dp"
                android:src="@drawable/play" />

            <ImageButton
                android:id="@+id/pause"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_toRightOf="@id/play"
                android:onClick="click"
                android:padding="10dp"
                android:src="@drawable/pause" />

            <ImageButton
                android:id="@+id/stop"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_toRightOf="@id/pause"
                android:onClick="click"
                android:padding="10dp"
                android:src="@drawable/stop" />
        </RelativeLayout>

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/relativeLayout1" >

            <SeekBar
                android:id="@+id/seekBar1"
                android:layout_width="321dp"
                android:layout_height="wrap_content" />
        </LinearLayout>
    </LinearLayout>

</LinearLayout>



3.MainActivity.java文件代码如下:

package com.music;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.content.res.TypedArray;
import android.media.AudioManager;
import android.net.Uri;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.Gallery;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.Toast;

import com.service.MusicService;

public class MainActivity extends Activity {
	private int[] imageId = new int[] { R.drawable.img01, R.drawable.img02,
			R.drawable.img03, R.drawable.img04, R.drawable.img05,
			R.drawable.img06, R.drawable.img07, R.drawable.img08,
			R.drawable.img09, R.drawable.img10, R.drawable.img11,
			R.drawable.img12, }; // 定义并初始化保存图片id的数组
	Intent intent;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		Gallery gallery = (Gallery) findViewById(R.id.gallery1); // 获取Gallery组件
		/* 使用BaseAdapter指定要显示的内容 */
		BaseAdapter adapter = new BaseAdapter() {

			@Override
			public View getView(int position, View convertView, ViewGroup parent) {
				ImageView imageview; // 声明ImageView的对象
				if (convertView == null) {
					imageview = new ImageView(MainActivity.this); // 实例化ImageView的对象
					imageview.setScaleType(ImageView.ScaleType.FIT_XY); // 设置缩放方式
					imageview
							.setLayoutParams(new Gallery.LayoutParams(265, 220));
					TypedArray typedArray = obtainStyledAttributes(R.styleable.Gallery);
					imageview.setBackgroundResource(typedArray.getResourceId(
							R.styleable.Gallery_android_galleryItemBackground,
							0));
					imageview.setPadding(5, 0, 5, 0); // 设置ImageView的内边距
				} else {
					imageview = (ImageView) convertView;
				}
				imageview.setImageResource(imageId[position]); // 为ImageView设置要显示的图片
				return imageview; // 返回ImageView
			}

			/*
			 * 功能:获得当前选项的ID (non-Javadoc)
			 * 
			 * @see android.widget.Adapter#getItemId(int)
			 */
			@Override
			public long getItemId(int position) {
				return position;
			}

			/*
			 * 功能:获得当前选项 (non-Javadoc)
			 * 
			 * @see android.widget.Adapter#getItem(int)
			 */
			@Override
			public Object getItem(int position) {
				return position;
			}

			/*
			 * 获得数量 (non-Javadoc)
			 * 
			 * @see android.widget.Adapter#getCount()
			 */
			@Override
			public int getCount() {
				return imageId.length;
			}
		};
		gallery.setAdapter(adapter); // 将适配器与Gallery关联
		gallery.setSelection(imageId.length / 2); // 让中间的图片选中
		gallery.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				Toast.makeText(MainActivity.this,
						"您选择了第" + String.valueOf(position+1) + "张图片",
						Toast.LENGTH_SHORT).show();
			}
		});

		/* 调整音量 */
		final AudioManager am = (AudioManager) MainActivity.this
				.getSystemService(Context.AUDIO_SERVICE); // 获取音频管理类的对象
		// 设置当前调整音量大小只是针对媒体音乐
		MainActivity.this.setVolumeControlStream(AudioManager.STREAM_MUSIC);
		SeekBar seekbar = (SeekBar) findViewById(R.id.seekBar1); // 获取拖动条
		seekbar.setMax(am.getStreamMaxVolume(AudioManager.STREAM_MUSIC));// 设置拖动条的最大值
		int progress = am.getStreamVolume(AudioManager.STREAM_MUSIC); // 获取当前的音量
		seekbar.setProgress(progress); // 设置拖动条的默认值为当前音量
		// 为拖动条组件添加OnSeekBarChangeListener监听器
		seekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
			@Override
			public void onStopTrackingTouch(SeekBar seekBar) {
			}

			@Override
			public void onStartTrackingTouch(SeekBar seekBar) {
			}

			@Override
			public void onProgressChanged(SeekBar seekBar, int progress,
					boolean fromUser) {
				am.setStreamVolume(AudioManager.STREAM_MUSIC, progress,
						AudioManager.FLAG_PLAY_SOUND); // 设置改变后的音量
			}
		});

	}

	public void click(View v) {
		intent = new Intent(MainActivity.this, MusicService.class);
		int op = -1; // 定义一个中间变量
		switch (v.getId()) {
		case R.id.play: // 播放按钮
			op = 1;
			break;
		case R.id.pause:// 暂停按钮
			op = 2;
			break;
		case R.id.stop: // 停止按钮
			op = 3;
			break;
		default:
			break;
		}

		Bundle bundle = new Bundle();
		bundle.putInt("msg", op);
		intent.putExtras(bundle);
		startService(intent);// 开始服务
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {

		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return super.onCreateOptionsMenu(menu);
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// Handle action bar item clicks here. The action bar will
		// automatically handle clicks on the Home/Up button, so long
		// as you specify a parent activity in AndroidManifest.xml.
		switch (item.getItemId()) {
		case R.id.call:
			Intent intent1 = new Intent(MainActivity.this, LookActivity.class);
			startActivity(intent1);
			break;
		case R.id.about:
			openDialog();
			break;
		case R.id.blog:
			openDialog1();
			break;
		case R.id.exit:// 退出按钮
			if(intent!=null){
				stopService(intent);// 停止服务
				finish();// 退出本界面
			}else{
				finish();
			}
			break;
		default:
			break;
		}
		return super.onOptionsItemSelected(item);
	}

	protected void openDialog() {
		AlertDialog.Builder builder = new Builder(MainActivity.this);
		builder.setTitle("关于作者");
		final View view1 = LayoutInflater.from(MainActivity.this).inflate(
				R.layout.item, null);
		builder.setView(view1);
		builder.setPositiveButton("返回上个界面", new OnClickListener() {

			@Override
			public void onClick(DialogInterface arg0, int arg1) {
				// TODO Auto-generated method stub
				finishActivity(R.layout.activity_main);
			}

		});
		builder.create().show();
	}

	protected void openDialog1() {
		AlertDialog.Builder builder = new Builder(MainActivity.this);
		builder.setTitle("作者博客");
		final View view1 = LayoutInflater.from(MainActivity.this).inflate(
				R.layout.blogitem, null);
		builder.setView(view1);
		builder.setPositiveButton("打开我的博客", new OnClickListener() {

			@Override
			public void onClick(DialogInterface arg0, int arg1) {
				// TODO Auto-generated method stub
				Intent intent2 = new Intent();// 创建Intent对象
				intent2.setAction(Intent.ACTION_VIEW);// 为Intent设置动作
				intent2.setData(Uri.parse("http://blog.csdn.net/u012561176"));// 为Intent设置数据
				startActivity(intent2);

			}

		});
		builder.create().show();
	}
}

这个类主要实现了 画廊的效果和滑动条控制音量的功能,以及一些菜单的实现,把播放音乐的功能放到服务里实现,所以接下来要附上服务类的代码。



4.MusicService.java文件代码如下:

package com.service;

import java.io.IOException;



import com.music.R;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.IBinder;
import android.widget.Toast;


public class MusicService extends Service {

	public static  MediaPlayer player;// 创建player对象
	
	@Override
	public IBinder onBind(Intent arg0) {
		// TODO Auto-generated method stub
		return null;
	}

	// 创建服务
	@Override
	public void onCreate() {
		// TODO Auto-generated method stub
		if (player == null) {
			player=player.create(MusicService.this, R.raw.woman);//设置音乐资源并实例化player
			player.setLooping(false);//音乐不能循环
		}
		super.onCreate();
	}
	
	//服务销毁
		@Override
		public void onDestroy() {
			// TODO Auto-generated method stub
			player.release();//释放资源
			super.onDestroy();
		}

		//服务开始
		@Override
		public int onStartCommand(Intent intent, int flags, int startId) {
			// TODO Auto-generated method stub
			Bundle bundle=intent.getExtras();
			int op=bundle.getInt("msg");//获得从MainActivity.java里传递过来的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 play() {
			// TODO Auto-generated method stub
			if(!player.isPlaying()){
				player.start();//开始播放音乐
				Toast.makeText(MusicService.this, "正在播放音乐...", Toast.LENGTH_SHORT).show();
			}
		}


		private void pause() {
			// TODO Auto-generated method stub
			if(player.isPlaying()&&player!=null){
				player.pause();//暂停播放音乐
				Toast.makeText(MusicService.this, "暂停播放音乐...", Toast.LENGTH_SHORT).show();
				try {
					player.prepare();
				} catch (IllegalStateException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		
		private void stop() {
			// TODO Auto-generated method stub
			if(player!=null){
				player.pause();//停止播放音乐
				player.seekTo(0);
				Toast.makeText(MusicService.this, "停止播放音乐...", Toast.LENGTH_SHORT).show();
			}
		}

}

这个服务类实现了播放一首歌的功能,其中我们可以把一首音乐放入res包下的raw文件夹下。



5.主要的类的代码已经给出,还有其它类和布局文件代码这里就不附上了,最后实现效果如上图主页面所示,还有其它的功能我也一一截图了,只附上截图,后面我会附上源代码下载地址:


点击浏览网页菜单的话,弹出下图的界面:

点击浏览你输入的网页地址按钮即可访问网络,其中你的主机必须要有网络!


如果点击关于作者按钮,就会弹出一个对话框,即下图所示:


如果点击作者博客的话,就出现下图的对话框:

点击打开我的博客按钮的话,就可以打开我的博客地址。


点击退出应用菜单的话,就可以退出当前界面,并把存放在后台运行的程序关闭。



6.其中这个小项目有点小bug,请大家见谅!



7.以上内容仅供大家学习参考,写得不好,请见谅,谢谢!

源码下载地址:http://download.csdn.net/detail/u012561176/8769235 ,仅供大家学习参考,自认为做得不太好,毕竟只能播放一首音乐!


展开阅读全文

没有更多推荐了,返回首页