/*
分享自己的学习成果。
附源码。希望此文能帮助到一些新手。也希望更多的人在网络上
*/
1、 开发环境
Android 是一种基于 Linux® V2.6 核的综合操作环境。最初,Android 的部署目标是移动领域,包括智能和更廉价的翻盖手机。Android 全面的计算效劳和丰富的功能支持完全有能力扩展到移动市场以外。Android 也可以用于其他的平台和应用程序。下面搭建Android的开发环境。
1.1 JDK安装
1、首先把所有要安装文件放在Android_software文件夹中; 2、安装jdk-6u10-rc2-bin-b32-windows-i586-p-12_sep_2008文件; 3、配置环境变量:
〔1〕新建一个用户变量,变量名是JAVA_HOME,变量值为:JDK的安装路径;
〔2〕查看系统变量Path,如果有显示路径加\\bin,没有那么加%JAVA_HOME%\\bin;
〔3〕查看class,如果有显示路径加\\lib,没有那么加%JAVA_HOME%\\lib; 4、解压eclipse-jee-juno-win32文件,运行eclipse.exe,在workspace launcher窗口中,设置工程保存路径;
1.2 Android SDK安装以及系统设置
在eclipse菜单栏的window子菜单下点击perferences,选择android,在右边的对话框中选择按钮Browse,找到SDK源文件,自动出来SDK包含的Android版
- - word.zl-
- -
本,点击Apply按钮,完成安装;
在用户变量里面,新建一个JAVA_SDK变量,值设置的值为SDK安装的路径;
在系统变量里面加%JAVA_HOME%\\bin,%JAVA_SDK%\ools,%JAVA_SDK%\\platform-tools。
参
图1.设置环境变量
1.3 Eclipse安装以及ADT工具的安装 ADT插件的安装:
〔1〕解压ADT文件;
〔2〕翻开eclipse菜单上help 子目录下的Install new software; 〔3〕在弹出的Install窗口中点击Add,在弹出的窗口中,name:ADT
Location:点击location按钮找到解压的ADT源文件;
- - word.zl-
- -
〔4〕安装成功后,重新启动eclipse;
1.4 模拟器的配置
1、 运行eclipse,在window子菜单下点击AVD Manager开场配置模拟器; 2、 在Android Virtual Device Manager 下点击NEW,开场创立模拟器;
3、 在create new Android Virtual Manager窗口中,输入模拟器的名称、版本、
存储卡大小,手机屏幕的分辨率,输入完后,点击Create AVD,创立完成; 4、 在Android Virtual Device Manager窗口中,选中模拟器后,点击start,启
动模拟器。
图2 启动模拟器
2、功能说明
2.1 软件构造与布局
- - word.zl-
- -
设计布局框架分为三个局部:
图形菜单主界面menu_main.xml ,对应类文件MediaPlay.java
媒体功能实现界面menu_main.xml menuForMain.java
媒体列表界面 mylist.xml以及listview.xml样式布局listtype.xml MediaList.java
逻辑架构如下:
- - word.zl-
- -
2.2图像菜单功能
- - word.zl-
- -
主要控件及功能
Gallery MyGallery:用于显示图形菜单,双击图片进入相应的功能界面 TextView menuTv:用于显示菜单项选择项信息
- - word.zl-
- -
使用说明:
1、双击MyGallery中装载的一组图片〔屏幕底部〕中的其中任何一图片进入相应的功能面 板
2、通过在MyGallery滑动来到达更改菜单项选择项的功能 3、menuTv会实时显示当前选中的菜单项的详细说明
2.3 音频文件播放
- - word.zl-
- -
主要控件及功能
ImageButton ibtnPlayAndPuase 开场/暂停 ImageButton ibtnStop 停顿
- - word.zl-
- -
ImageButton ibtnLast,上一曲 ImageButton ibtnNext;下一曲 SeekBar MySeekBar; 进度条
TextView MytvScreen;信息显示
TextView tbTimer ;用于显示当前播放时间进度
使用说明:
1、当进入音乐播放界面时,后台读取保存在本地的音乐列表文件,假设不存在列表文件那么自动扫描/sdcard/Music/目录下音频文件
2、播放和暂停键复用,当第一次点击播放按钮,再次点击那么为暂停,再次点击那么继续之前的位置播放;停顿按钮那么是将当前播放进度设置为0并暂停播放;上一曲、下一曲按钮那么实现歌曲切换功能
3、进度条和tbTimer控件那么实时显示当前播放音乐的时间进度,MytvScreen会显示当前正在播放歌曲的详细信息
2.4 视频文件播放
- - word.zl-
- -
主要控件及功能
ImageButton ibtnPlayAndPuase 开场/暂停 ImageButton ibtnStop 停顿 ImageButton ibtnLast,上一曲
- - word.zl-
- -
ImageButton ibtnNext;下一曲 SeekBar MySeekBar; 进度条
VideoView MyVideoView; 用于播放视频的组件
使用说明:
1、当进入视频播放界面时,后台读取保存在本地的视频列表文件,假设不存在列表文件那么自动扫描/sdcard/Video/目录下音频文件
2、播放、暂停、上一部、下一步、停顿以及进度条、时间显示条皆复用音乐界面的按钮,功能也与其一致,这里不赘述。
2.5 录音
- - word.zl-
- -
主要控件及功能
ImageButton ibtnPlayAndPuase 开场/暂停 ImageButton ibtnStop 停顿 ImageButton ibtnLast,上一曲 ImageButton ibtnNext;下一曲
- - word.zl-
- -
SeekBar MySeekBar; 进度条 Button btnRecording; 录音开关
使用说明:
1、当进入录音界面时,后台读取保存在本地的视频列表文件,假设不存在列表文件那么自动扫描/sdcard/MyRecords/目录下录音文件
2、播放、暂停、上一部、下一步、停顿以及进度条、时间显示条皆复用音乐界面的按钮,功能也与其一致,这里不赘述。
3、点击开场录音按钮,那么按钮显示为“录音中...〞,此时播放等按钮无法使用,进度条中间会显示当前的录音时间。在次点击此按钮那么停顿录音。此时可点击播放按钮试听刚刚的录音。
4、以上所有操作在主显示区域都会有文字描述
3、软件设计与调试
3.1软件在虚拟机上调试及分析
3.1.1图形菜单
核心代码: //图片装载
int MenuImages[]={R.drawable.menu4,R.drawable.menu1,R.drawable.menu2, R.drawable.menu3,R.drawable.menu5};
MyGallery.setAdapter(new ImageAdapter(this)); publicclass ImageAdapter extends BaseAdapter {Override
public View getView(int arg0, View arg1, ViewGroup arg2) {
- - word.zl-
- -
// TODO Auto-generated method stub ImageView i = new ImageView(mContext); i.setImageResource(MenuImages[arg0]); i.setAdjustViewBounds(true);
i.setLayoutParams(newGallery.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); // i.setBackgroundResource(R.drawable.e); return i;}} //页面跳转
Override
publicboolean onDoubleTap(MotionEvent arg0) { // TODO Auto-generated method stub Intent MyIntent=new Intent();
MyIntent.setClass(menuForMain.this,MediaPlay.class); Bundle MyBundle=new Bundle();
MyBundle.putInt(\"name\", MyGallery.getSelectedItemPosition()); MyIntent.putExtras(MyBundle); startActivity(MyIntent); returnfalse;}
3.1.2音乐播放
播放:
MyMediaPlayer.setDataSource(MusicList.get(Mediasp));
MyMediaPlayer.prepare();MyMediaPlayer.start();//播放 MyMediaPlayer.pause();//暂停
MyMediaPlayer.pause();MyMediaPlayer.seekTo(0);//停顿(为了能使点击播放按钮能在此播放,这里不调用MyMediaPlayer.stop()方法)
- - word.zl-
- -
3.1.3视频播放器
MyVideoView.setVideoURI(Uri.parse(VideoList.get(Mediasp)));//设置视频源 MyVideoView.start();//播放 MyMediaPlayer.pause();//暂停
MyVideoView.pause();MyVideoView.seekTo(0);//停顿
3.1.4录音
//播放
new DateFormat(); file=new
File(\"/sdcard/MyRecords/\"+\"bear\"+DateFormat.format(\"yyyyMMdd_hhmmss\",Calendar.getInstance(Locale.CHINA))+\".amr\");
File destDir = new File(\"/sdcard/MyRecords/\"); if (!destDir.exists()){ destDir.mkdirs();}
- - word.zl-
- -
MyMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);MyMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
MyMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); file.createNewFile();
MyMediaRecorder.setOutputFile(file.getAbsolutePath()); MyMediaRecorder.prepare(); MyMediaRecorder.start();
//停顿录音
MyMediaRecorder.reset();
须加一个权限开发,在AndroidManifest.xml:
3.1.5、公共方法 //1、滑动屏幕改变媒体音量 //设置音量 MyAudioManager = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE); //2、添加屏幕触发事件 MyGestureDetector =new GestureDetector(this,new MyGestureDetectorListener()); MytvScreen.setOnTouchListener(new OnTouchListener(){ Override public boolean onTouch(View arg0, MotionEvent arg1) { return MyGestureDetector.onTouchEvent(arg1);} }); Private class MyGestureDetectorListener implements OnDoubleTapListener{ Override// 滚动,触摸屏按下后移动 public boolean onScroll(MotionEvent arg0, MotionEvent arg1, float arg2, float arg3) { if(AudioManagerFlag==0){ AudioManagerY=arg0.getY(); AudioManagerX=arg0.getX();} int IsSound=0; if(AudioManagerFlag>5){ AudioManagerFlag=0; if(((AudioManagerY-arg1.getY())<1)||(arg1.getY()-AudioManagerY<1)){ if(arg0.getX()>arg1.getX())//左滑动调小音量{MyAudioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,AudioManager.ADJUST_LOWER, AudioManager.FX_FOCUS_NAVIGATION_UP);} else//右滑动调大音量{MyAudioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,AudioManager.ADJUST_RAISE,AudioManager.FX_FOCUS_NAVIGATION_UP); }}} else{ - - word.zl- - - AudioManagerFlag++;} return false;} 3、长按调整至列表界面 Override// 长按,触摸屏按下后既不抬起也不移动,过一段时间后触发 public void onLongPress(MotionEvent arg0) { AudioManagerFlag=0; if(MyVideoView.isPlaying()){ MyVideoView.pause(); ibtnPlayAndPuase.setImageResource(R.drawable.ibtnplay); ibtnPlayAndPuase.setTag(\"play\");} Intent i=new Intent(); i.setClass(MediaPlay.this,MediaList.class); Bundle data=new Bundle(); //调出菜单,第一个参数是列表的类型,第二个参数是当前歌曲在播放离别中的位置 data.putInt(\"sp\",Mediasp); data.putInt(\"Type\",MyRadioGroup.getCheckedRadioButtonId()); i.putExtras(data); startActivityForResult(i,MyRadioGroup.getCheckedRadioButtonId());}} 3、列表显示 //接收来自功能面板的列表请求 Bundle MyBundle=this.getIntent().getExtras(); try{int rbtnId=0; rbtnId=MyBundle.getInt(\"Type\"); //intMediasp=MyBundle.getInt(\"sp\"); switch(rbtnId){ case R.id.rbtnMusic: - - word.zl- - - //MyMediaList=sp.getMusicList(); //createList(MyMediaList,0); resultCode=1; getFiles(Filepath+\"kugou/\",\".mp3\",MyMediaList,true); Filepath+=\"Music/\"; getFiles(Filepath,\".mp3\",MyMediaList,false); sp.setMusicList(MyMediaList); break; case R.id.rbtnVideo: //MyMediaList=sp.getVideoList(); //createList(MyMediaList,1); resultCode=2; Filepath+=\"Videos\"; getFiles(Filepath,\".mp4\",MyMediaList,false); getFiles(Filepath,\".3gp\",MyMediaList,false); sp.setVideoList(MyMediaList); break; case R.id.rbtnRecord: //MyMediaList=sp.getRecordList(); //createList(MyMediaList,2); resultCode=3; Filepath+=\"MyRecords\"; getFiles(Filepath,\".amr\",MyMediaList,false); sp.setRecordList(MyMediaList); break; default: break;}} //获取列表 privatevoid getFiles(String dirpath,String fileType,ArrayList File[] files = new File(dirpath).listFiles(); File f; if(files == null) { return; } for (int i = 0; i < files.length; i++) { f = files[i]; if(!f.canRead()) { continue; } if (f.isFile()) { if (f.getName().contains(fileType)) //判断扩展名 { List.add(f.getPath()); } } elseif (f.isDirectory()&&IsIterative==true) getFiles(f.getPath(), fileType,List, IsIterative); }} //listview长按监听事件 - - word.zl- - - mylist.setOnItemLongClickListener(new OnItemLongClickListener(){ SuppressLint(\"ShowToast\") Override publicboolean onItemLongClick(AdapterView> arg0, View arg1, int arg2, long arg3) { // TODO Auto-generated method stub setTitle(\"你点击了第\"+arg2+\"项\"); MediaList.this.setResult(resultCode); sp.setMediasp(arg2);//通过全局变量传递参数 finish(); returnfalse;}}); 3.2 软件在手机上的测试 - - word.zl- - - - - word.zl- - - - - word.zl- - - - - word.zl- - - - - word.zl- - - - - word.zl- - - 4、设计总结 经过一个多星期的开发,使我从对android从一无所知到现在初入android门 - - word.zl- - - 槛,这是一个艰辛的过程。但还好之前对C#有一定的功底,使得java语言中关于面向对象的局部都能轻易的理解。只是欠于了解android开发独有的机制以及对eclipce这个软件操作环境的熟识上。 这次课设的要做出一个音乐播放、视频播放、录音三个功能于一体的手机软件出来。功能算是比拟简单。但在课设的第一步,控件布局上就屡屡出现问题,最好花了大量的时间才调整好布局,也渐渐找到了elipce关于控件布局操作的规律。 当我终于完成了软件的外观布局后,更多的问题接踵而来。比方按钮事件的监听,这里面涉及android的类的继承等,曾一度让我的逻辑出现混沌。后来通过比照C#事件触发机制以及查阅了网络资料才理解了这个东西。 关于功能的编程实现上,根本上比拟轻松。除了满足课设根本要求外,我还增加了音量调节、进度条、媒体列表、文件信息显示等功能。但是实现这些功能虽然有完善的逻辑思想,但是比拟对java语法还不甚了解,以至于出现逻辑上没错误,语法出现错误的现象。不过这些问题在之后随着对网络资料的大量查阅一个接着一个解决了。 到了课设的最后一天,我的软件根本实现了自己所附加的功能,但通过这次课设,使我深刻的认识到,课设虽然完结,但我的android开发并不会止步。在以后的日子里我还会继续做下去,比方加上歌词同步显示的功能、网络自动搜索歌词的功能。我想,我对android软件开发已经拥有了浓厚的兴趣。这里也确实要感同学以及网络上那些无私奉献的人。 - - word.zl- - - 5.附录 源代码下载:vdisk.weibo./s/z45_CkcauTkKm - - word.zl-
因篇幅问题不能全部显示,请点此查看更多更全内容