2.2我们需要做的是:
在main.xml设置页面的布局
在string.xml里定义我们会用到的文本类型的数据(如按钮上的显示的字)
在src下的java文件里写业务逻辑,android里的就是一个activity到另一个activity,但是,简单的就是一个activity实习的
每个activity都有自己的生命周期,每个生命周期会触发不同的方法。
#############################
下面是main.xml的数据
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/filename" />
<EditText
android:id="@+id/filename"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Lindsey Ray - Better Off.mp3" />
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<Button
android:id="@+id/button_play"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button_play" />
<Button
android:id="@+id/button_pause"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button_pause" />
<Button
android:id="@+id/button_reset"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button_reset" />
<Button
android:id="@+id/button_stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button_stop" />
</LinearLayout>
</LinearLayout>
#############################
下面是string.xml的数据
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello World, MainActivity!</string>
<string name="app_name">AudioPlayer</string>
<string name="filename">请输入音乐文件名:</string>
<string name="filenoexist">音乐文件不存在</string>
<string name="button_play">播放</string>
<string name="button_pause">暂停</string>
<string name="button_continue">继续</string>
<string name="button_reset">重播</string>
<string name="button_stop">停止</string>
</resources>
最后是音乐播放器的代码:
package mymusicplay.aubergine;
import java.io.File;
import android.app.Activity;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnPreparedListener;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MyMusicPlayerActivity extends Activity {
private EditText filenameText;
private MediaPlayer mediaPlayer;
private String path;
private boolean pause;
private int position;
@Override
public void onCreate(Bundle savedInstanceState) {
// 程序自动生成
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 获得activity中的对象
filenameText = (EditText) this.findViewById(R.id.filename);
Button playButton = (Button) this.findViewById(R.id.button_play);
Button pauseButton = (Button) this.findViewById(R.id.button_pause);
Button resetButton = (Button) this.findViewById(R.id.button_reset);
Button stopButton = (Button) this.findViewById(R.id.button_stop);
// 创建音乐播放器
mediaPlayer = new MediaPlayer();
// 创建按钮点击事件的监听
ButtonClickListener listener = new ButtonClickListener();
// 将监听事件放上去
playButton.setOnClickListener(listener);
pauseButton.setOnClickListener(listener);
resetButton.setOnClickListener(listener);
stopButton.setOnClickListener(listener);
}
/**
* 当播放器处于后台时会触发此生命周期方法
*/
@Override
protected void onPause() {
if (mediaPlayer.isPlaying()) {
position = mediaPlayer.getCurrentPosition();// 记录当前音乐播放器播放到的位置
mediaPlayer.stop();// 停止播放(其实是暂停)
}
super.onPause();
}
/**
* 当播放器重新回到前台时会触发此生命周期方法
*/
@Override
protected void onResume() {
if (path != null && position > 0) {
play(position);// 从暂停的位置开始接着播放
position = 0;// 并将位置设置为开始
}
super.onResume();
}
/**
* 当播放器关闭时触发此生命周期方法
*/
@Override
protected void onDestroy() {
// 释放资源
mediaPlayer.release();
super.onDestroy();
}
private final class ButtonClickListener implements OnClickListener {
// 需要覆盖的方法
public void onClick(View v) {
switch (v.getId()) {
// 播放按钮
case R.id.button_play:
String filename = filenameText.getText().toString();
File file = new File(Environment.getExternalStorageDirectory(),
filename);// 正在播放的音乐文件
if (file.exists()) {
path = file.getAbsolutePath();
play(0);
} else {
path = null;
Toast.makeText(getApplicationContext(),
R.string.filenoexist, Toast.LENGTH_LONG).show();
}
break;
case R.id.button_pause:
if (mediaPlayer.isPlaying()) {
mediaPlayer.pause();
((Button) v).setText(R.string.button_continue);
pause = true;
} else {
((Button) v).setText(R.string.button_pause);
if (pause) {
mediaPlayer.start();
pause = false;
}
}
break;
case R.id.button_reset:
if (mediaPlayer.isPlaying()) {
mediaPlayer.seekTo(0);
} else {
if (path != null) {
play(0);
}
}
break;
case R.id.button_stop:
if (mediaPlayer.isPlaying()) {
mediaPlayer.stop();
}
break;
}
}
}
/**
* 播放音乐
*
* @param pos
*/
public void play(int pos) {
try {
mediaPlayer.reset();
mediaPlayer.setDataSource(path);
mediaPlayer.setOnPreparedListener(new PreparedListener(pos));
mediaPlayer.prepare();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 监听音乐文件缓冲完成的监听
*
* @author k
*
*/
private final class PreparedListener implements OnPreparedListener {
private int pos;
public PreparedListener(int pos) {
this.pos = pos;
}
public void onPrepared(MediaPlayer mp) {
mediaPlayer.start(); // 开始播放音乐
if (pos > 0) {
mediaPlayer.seekTo(pos);
}
}
}
}
注意:
这样我们在工程上选择=》run android application就会将我们的工程部署上去,然后,
弹出界面,在点击主菜单在主菜单就看到了我们的应用名称为“AudioPlayer”的应用图标,上面的string.xml中的appname可以配置其他名称。
相关推荐
通过学习和分析"原创android小计算器"项目,初学者不仅可以掌握Android应用的基本开发流程,还能深入理解UI设计、事件驱动编程以及简单的数学逻辑实现。这是一个很好的起点,为进一步探索Android开发的复杂功能和...
在本资源中,我们主要探讨的是一个原创的Android计算器应用的源代码。这个计算器虽然功能相对简单,但设计时充分考虑了各种细节,因此对于学习Android开发,尤其是初学者而言,是一个很好的实例。 首先,我们要了解...
深入理解Android:卷I(51CTO网站“2011年度最受读者喜爱的原创IT技术图书”) 基本信息 作者: 邓凡平 出版社:机械工业出版社 ISBN:9787111357629 上架时间:2011-9-13 出版日期:2011 年9月 开本:16开 页码:488...
通过分析这个源码,我们可以深入理解Android应用的开发流程和技术要点。 首先,Android Studio是Google官方推出的集成开发环境(IDE),它为Android应用开发者提供了便捷的开发工具。使用Android Studio,开发者...
通过深入研究这个源码,你可以掌握Android游戏的基本架构,理解游戏逻辑和图形渲染的结合,以及如何处理用户输入。同时,也可以了解到如何在Android平台上实现游戏的生命周期管理和资源管理。这是一个很好的起点,...
- SharedPreferences:了解SharedPreferences的基本用法,用于存储简单的键值对数据。 5. **网络编程**: - HTTP请求:学习使用HttpURLConnection、OkHttp等库发送GET、POST请求。 - JSON解析:掌握JSON数据格式...
本教程将深入探讨如何使用ksoap2制作一个天气预报应用,这是一个基于Android的原创项目,非常适合初学者进行实践。ksoap2是一个轻量级的开源库,专门用于在移动设备上处理SOAP(Simple Object Access Protocol)消息...
理解这些概念有助于你在开发过程中更加灵活地运用Android的各种特性。 #### 实践与理论相结合 学习任何一门技术都不能仅仅停留在理论层面,必须通过大量的实践来加深理解和记忆。你可以从简单的Hello World程序...
这篇原创博客探讨了如何在Android应用中创建这样一个功能,下面将详细介绍这个过程。 首先,我们需要理解气泡式ListView的基本概念。气泡通常是指一种半透明、形状类似水泡的UI元素,它包含了特定的内容,如文本或...
这一阶段的学习重点在于理解如何使用Android提供的工具来辅助开发过程。 #### 三、Android基础与布局 - **RelativeLayout**:一种常见的布局方式,允许子视图基于父视图或其他子视图的位置进行相对定位。 - **...
本文将深入探讨如何开发一个基于Android的原创音乐播放器,特别是在实现豆瓣第三方客户端时所涉及的关键技术与知识点。 【网络音频流处理】 在"原创 Android 音乐播放器(豆瓣第三方客户端)"中,主要的功能是通过...
1. **专业能力**:聚焦于掌握面向对象编程的核心理念,并能够熟练编制简易的Android应用程序,实现个人应用的移植或原创开发。 2. **社会能力**:强调培养良好的职业素养、创新意识和团队协作精神,鼓励学生面对...
根据给定的文件信息,以下是对“[DevDiv原创]Android学习系列教程实例”的关键知识点的详细解析: ### 一、Android系统结构与初始化流程 #### 1.1 Android的发展历史回顾 Android操作系统是由Google公司主导开发...
从描述来看,这是一个原创的代码实现,对于学习Android应用开发,尤其是想了解如何构建一个简单的财务管理系统的人来说,是一个很好的参考资料。项目能够正常运行,意味着它已经过测试,并且具备实际功能。 首先,...
这些组件是Android应用的基本构件,开发者需要理解它们的工作原理和如何相互协作。 5. 本书还介绍了如何支持不同版本的Android OS,包括处理多种屏幕尺寸和其他特定于设备的特性。这保证了开发者能够开发出适配各种...
本实例是作者初次接触Android开发时完成的一个简易备忘录应用,旨在帮助初学者理解Android应用的基本架构和核心组件。 【描述】: 这个备忘录应用虽然功能简单,但它涵盖了Android开发的基础知识,包括用户界面...
总之,Android RTSP播放器的实现涉及到对RTSP协议的理解、Android多媒体框架的使用,以及可能的第三方库选择。通过不断优化和调试,我们可以创建一个高效且稳定的RTSP视频播放解决方案,满足用户观看网络摄像头等...
这部分内容帮助开发者理解Android生态系统的背景,以及为什么选择Android作为开发平台。 - **安装Android开发工具**:详细讲解了如何设置开发环境,包括下载和配置Android Studio,以及安装必要的软件包如JDK和SDK...