`
woshizn
  • 浏览: 210212 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

播放MP3的小应用(边写边学Android 一)

阅读更多
"在信息时代,客观障碍已不复存在,所谓障碍都是主观上的。如果你想研发什么新的技术,你不需要几百万美元的资金,你只需要在冰箱里放满比萨和可乐,再有一 台便宜的计算机,和与之献身的决心,你即可拥有任何你想拥有的编程境界!- John Carmack

实现非常简单
1、用ContentResolver查询到话机中的MP3歌曲信息
2、用ListView展示出来
3、用一个Service中的MediaPlayer播放歌曲
4、用触摸手势,向右,向左滑动来播放,停止歌曲

下面是代码,我写了很详细的注释,希望大家看了后有什么优化意见,和改进建议都可以告诉我,欢迎讨论。

K_musicActivity.java 用来呈现和控制
package com.kennan.k_music;

import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Color;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.GestureDetector.OnGestureListener;
import android.view.View.OnTouchListener;
import android.widget.AdapterView;
import android.widget.LinearLayout;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;

public class K_musicActivity extends Activity implements OnTouchListener,
		OnGestureListener {

	private LinearLayout m_LinearLayout;
	private ListView m_ListView;
	private Intent i;
	private Cursor cur;
	private GestureDetector mGestureDetector;
	private static final int FLING_MIN_DISTANCE = 50;
	private static final int FLING_MIN_VELOCITY = 100;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		// UI最底层的LinearLayout
		m_LinearLayout = new LinearLayout(this);
		// 设置内部元素排列方式
		m_LinearLayout.setOrientation(LinearLayout.VERTICAL);
		// 背景颜色
		m_LinearLayout.setBackgroundColor(Color.GREEN);
		
		// listView,用来存放歌曲列表
		m_ListView = new ListView(this);
		
		// 设置listView元素layout参数
		LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(
				LinearLayout.LayoutParams.FILL_PARENT,
				LinearLayout.LayoutParams.WRAP_CONTENT);
		m_ListView.setBackgroundColor(Color.BLUE);
		m_LinearLayout.addView(m_ListView, param);
		
		// 将此activity的ContentView设置为m_LinearLayout
		this.setContentView(m_LinearLayout);
		
		// 查询媒体信息
		cur = this.getContentResolver().query(
				MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null,
				MediaStore.Audio.Media.DEFAULT_SORT_ORDER);

		this.startManagingCursor(cur);
		
		// 用listAdapter将歌曲信息添加至ListView
		ListAdapter adapter = new SimpleCursorAdapter(this,
				android.R.layout.simple_expandable_list_item_2, cur,
				new String[] { MediaStore.Audio.Media.TITLE,
						MediaStore.Audio.Media.ARTIST }, new int[] {
						android.R.id.text1, android.R.id.text2 });
		m_ListView.setAdapter(adapter);
		
		// 播放歌曲的Service,这是一个Action路径
		i = new Intent("com.kennan.music");
		
		// 添加点击单条歌曲监听,用于选择播放歌曲
		m_ListView.setOnItemClickListener(clictlistener);
		
		// 手势探测器,用于捕捉手势实现,播放,停止播放
		mGestureDetector = new GestureDetector(this);
		
		// 添加触摸监听,实现手势功能
		m_LinearLayout.setLongClickable(true);
		m_LinearLayout.setOnTouchListener(this);
		m_ListView.setLongClickable(true);
		m_ListView.setOnTouchListener(this);

	}
	
	/**
	 * 点击单条歌曲监听,选择播放歌曲
	 */
	private AdapterView.OnItemClickListener clictlistener = new AdapterView.OnItemClickListener() {

		@Override
		public void onItemClick(AdapterView<?> arg0, View arg1, int position,
				long arg3) {
			
			// 将歌曲信息游标移动到被单击处歌曲
			cur.moveToPosition(position);
			// 得到歌曲的URI
			String data = cur.getString(cur
					.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));
			// 将歌曲URI传说到播放歌曲的Service
			i.putExtra("data", data);

		}
	};
	
	@Override
	public boolean onTouch(View v, MotionEvent event) {
		// OnGestureListener will analyzes the given motion event
		return mGestureDetector.onTouchEvent(event);
	}
	
	/**
	 * 滑动事件,向右活动开始播放歌曲,向左播放停止播放歌曲
	 */
	@Override
	public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
			float velocityY) {
		// 参数解释:
		// e1:第1个ACTION_DOWN MotionEvent
		// e2:最后一个ACTION_MOVE MotionEvent
		// velocityX:X轴上的移动速度,像素/秒
		// velocityY:Y轴上的移动速度,像素/秒

		// 触发条件 :
		// X轴的坐标位移大于FLING_MIN_DISTANCE,且移动速度大于FLING_MIN_VELOCITY个像素/秒

		if (e1.getX() - e2.getX() > FLING_MIN_DISTANCE
				&& Math.abs(velocityX) > FLING_MIN_VELOCITY) {
			// Fling left

			K_musicActivity.this.stopService(i);
		} else if (e2.getX() - e1.getX() > FLING_MIN_DISTANCE
				&& Math.abs(velocityX) > FLING_MIN_VELOCITY) {
			// Fling right
			
			// 先关闭正在播放的service,避免多个service同时播放
			K_musicActivity.this.stopService(i);
			K_musicActivity.this.startService(i);
		}

		return false;
	}
	
	
	// 用户轻触触摸屏,由1个MotionEvent ACTION_DOWN触发
	@Override
	public boolean onDown(MotionEvent e) {

		return false;
	}

	// 用户轻触触摸屏,尚未松开或拖动,由一个1个MotionEvent ACTION_DOWN触发
	// 注意和onDown()的区别,强调的是没有松开或者拖动的状态
	@Override
	public void onShowPress(MotionEvent e) {
		// TODO Auto-generated method stub
	}

	// 用户(轻触触摸屏后)松开,由一个1个MotionEvent ACTION_UP触发
	@Override
	public boolean onSingleTapUp(MotionEvent e) {
		// TODO Auto-generated method stub
		return false;
	}

	// 用户长按触摸屏,由多个MotionEvent ACTION_DOWN触发
	@Override
	public void onLongPress(MotionEvent e) {
		// TODO Auto-generated method stub

	}

	// 用户按下触摸屏,并拖动,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE触发
	@Override
	public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
			float distanceY) {
		// TODO Auto-generated method stub
		return false;
	}

}


KMusicService 用来播放歌曲
package com.kennan.k_music;

import java.io.IOException;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;

public class KMusicService extends Service {

	private MediaPlayer player;

	public IBinder onBind(Intent arg0) {
		return null;
	}

	public void onStart(Intent intent, int startId) {
		super.onStart(intent, startId);
		
		// 得到从activity传来的歌曲URI
		String uri = intent.getStringExtra("data");
		
		player = new MediaPlayer();
		try {
			player.setDataSource(uri);
			player.prepare();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalStateException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		player.start();
	}
	
	public Service getService(){
		return this;
	}
	
	public void onDestroy() {

		player.stop();
		super.onDestroy();
	}
}


AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.kennan.k_music"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".K_musicActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    <service android:name="KMusicService">
    	<intent-filter>
				<action android:name="com.kennan.music" />
				<category android:name="android.intent.category.DEFAULT" />
		</intent-filter>
    </service>
</application>
    <uses-sdk android:minSdkVersion="7" />


</manifest> 


另外讲一下如何将MP3添加到模拟器中。
打开Eclipse中的DDMS
里面有个FileExplorer
里面有个sdcard就是手机的SD卡
在FileExplorer的右上角有图标,可以将MP3 push入手机模拟器
添加完后,进入模拟器,
进入Dev Tools,里面有个Media Scanner.运行一下。

ok现在进入应用就能看到歌曲列表了,试试吧。

原创,转载请注明出处。
2
0
分享到:
评论
1 楼 琼露露 2011-11-15  
大虾,能不能放源码啊........

相关推荐

    边用边学C语言\边用边学C语言

    边用边学C语言\边用边学C语言,对学习很有用的啊

    边用边学C语言.pdf

    边用边学C语言.pdf边用边学C语言.pdf边用边学C语言.pdf边用边学C语言.pdf边用边学C语言.pdf边用边学C语言.pdf边用边学C语言.pdf边用边学C语言.pdf

    边干边学机器视觉

    ### 边干边学机器视觉:光源选择的重要性 在机器视觉系统中,光源的选择是非常关键的一个环节,它直接影响到后续图像采集的质量以及整个系统的性能。本文将从几个方面详细介绍如何选择合适的光源,包括常见的光源...

    边做边学深度强化学习:PyTorch程序设计实践 迷宫 Sarsa

    边做边学深度强化学习:PyTorch程序设计实践 迷宫 Sarsa

    边用边学JavaScript

    JavaScript,简称JS,是一种轻量级的解释型编程语言,广泛应用于网页和互联网应用开发。它的特点是动态类型、基于原型的对象、函数作为一等公民,以及异步编程的支持,这使得它在创建交互式用户界面、处理数据和实现...

    边干边学linux内核指导-第一版

    这是一本学习Linux内核的指导教材。根据作者在浙江大学计算机学院多年的教学实践,...本书的特点就是边干边学,为此在每章里都安排了实验内容,章节围绕实验目的展开,以求在实验中掌握Linux内容,在实验中融会贯通。

    边干边学labview仪器控制

    总之,"边干边学labview仪器控制"是一个全面学习LabVIEW与硬件交互能力的过程,涉及到虚拟仪器设计、VISA通信、硬件协议理解和实践应用等多个方面。通过深入学习和实践,用户将能够运用LabVIEW有效地控制和监测各类...

    边做边学深度强化学习:PyTorch程序设计实践 倒立摆 Q-Learning

    边做边学深度强化学习:PyTorch程序设计实践 倒立摆 Q-Learning

    《微信小程序开发边做边学》教学大纲.pdf

    "微信小程序开发边做边学"教学大纲.pdf 本教学大纲旨在帮助学生掌握微信小程序开发的知识和技能,通过本课程的学习,使学生具备小程序开发的基础技术和项目实践能力,培养学生独立开发微信小程序加云平台的在线信息...

    边干边学报表生成.zip

    "边干边学报表生成.zip"这个压缩包提供了一个关于LabVIEW报表生成的实例,特别针对LabVIEW 2011版本。报表生成在LabVIEW中的实现通常涉及到以下知识点: 1. **VI(Virtual Instrument)设计**:LabVIEW的核心是通过...

    边做边学深度强化学习:PyTorch程序设计实践 迷宫 Q-Learning

    边做边学深度强化学习:PyTorch程序设计实践 迷宫 Q-Learning

    边用边学C语言

    C语言是一种基础且强大的...通过"边用边学C语言"的学习方法,你可以逐步掌握这些知识点,并通过实践编写小程序来加深理解。不断练习,你将能够熟练运用C语言解决实际问题,为将来深入学习其他编程语言打下坚实的基础。

    边玩边学scratch

    边玩边学scratch边玩边学scratch 自己扫描的,高清的哦。

    边用边学JavaScript,好资料

    "边用边学JavaScript"的标题和描述暗示了这是一个实践性极强的学习资源,旨在帮助用户通过实际操作来掌握这门语言。 JavaScript的基础知识包括变量、数据类型、运算符、控制流程(如条件语句和循环)、函数以及数组...

    边用边学c语言.rar

    《边用边学C语言》是一本以实践为导向的C语言学习资料,旨在帮助读者在实际操作中掌握C语言的基础知识和编程技巧。C语言是一种强大的、通用的、低级的编程语言,广泛应用于系统开发、软件工程、游戏编程等多个领域。...

    代码边用边学

    【标题】"代码边用边学"所涵盖的是一个学习编程和代码实践的过程,强调在实际操作中理解和掌握代码的应用。这种学习方法主张通过动手编写和调试代码来深化理解,而不是仅仅理论学习。在编程领域,实践中遇到的问题...

    边用边学C语言pdf

    清华大学出版的&lt;边用边学C语言&gt;是用PDG转的pdf文件,很清晰的扫描版~

    边干边学系列三合一

    通过详细解析《边干边学系列三合一》中的内容,我们将深入探讨LabVIEW如何简化仪器控制过程,并展示其在自动化测试领域的独特优势。 #### LabVIEW:自动化测试的优选平台 LabVIEW是由National Instruments(NI)...

    边做边学深度强化学习:PyTorch程序设计实践 迷宫 随机实验

    边做边学深度强化学习:PyTorch程序设计实践 迷宫 随机实验代码

    边上班边学英文 study English at work 3 共四部分

    边上班边学英文 study English at work 恐懼英文的人,最容易被密密麻麻的英文字給嚇到,其實只要掌握了訣竅,全 英閱讀就會是一件很輕鬆的事。 《邊上班邊學英文》獨創魔法六步驟,只要按照這六個步驟確實地練習,...

Global site tag (gtag.js) - Google Analytics