Mp3实验报告一、实验目的1、掌握本地服务的管理方法;2、掌握服务的隐式启动和显式启动方法;3、掌握远程服务的绑定和调用方法;4、了解AIDL语言的用途和语法。二、实验内容开发简易音乐播放程序,实现音乐播放、暂停、切换等基本功能。要求分别以启动方式和绑定方式管理后台服务。三、安卓应用程序开发环境安装配置了安卓组件的windows操作系统JDKEclipseAndriodAndriodSDKADTApachTomcat四、需求分析五、实验过程及调试1、将项目直接运行在手机上Target选择Alwaysprompttopickdevices,表示运行项目时会弹出真机提示框“Androiddevicechoonser”MP3播放器更新下载列表分析MP3歌词文件根据客户的选择,下载指定的MP3和LRC文件在播放MP3文件的同时,实现更新歌词MP3文件读取远程服务器当中的XML文件2、运行项目弹出设备选择窗口:这里选择真机“huawei-y511_u00”点击“OK”开始启动运行3、很抱歉,程序已停止运行。错误提示INSTALL_FAILED_SHARED_USER_INCOMPATIBLE:可能原因:apk的AndroidManifest.xml中声明了android:sharedUserId=android.uid.system,但没有相应的签名。Installationerror:INSTALL_FAILED_SHARED_USER_INCOMPATIBLEPleasechecklogcatoutputformoredetails.Launchcanceled!解决办法:1、找到编译目标系统时的签名证书platform.pk8和platform.x509.pem,在android源码目录build\target\product\security下;2、将android:sharedUserId=android.uid.system先注释起来。4、应用程序未运行,提示:FailedtoinstallFloatActivity.apkondevice'20120208':timeoutLaunchcanceled!解决办法:模拟器(或真机)超时,重启模拟器,如果是真机则先断开数据线再重新连接。5、应用程序运行错误,提示:可能原因:AndroidManifest.xml配置文件配置信息错误。6、如何读取Android模拟器中的文件?选中文件,点击下图中第一个图标,将Android模拟器中的文件复制到其它地方就可以打开了,注意:Android模拟器中的sdcard在mnt目录下:7、很抱歉,程序已停止运行。错误提示:Causedby:可能原因:尝试在一个Service中放置一个对话框。解决办法:将此对话框设置为系统级提示框(即全局性质的提示框):mDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);相应的需要在Android配置文件中添加权限声明:uses-permissionandroid:name=android.permission.SYSTEM_ALERT_WINDOW/8、无法运行程序,提示java.net.ConnectException:Connectionrefused:connect.可能原因:模拟器端的ADB出问题了。解决办法:打开CMD,输入adbkill-server,再输入adbdevices如下,提示ADBserverdidn'tACK:9、在AndroidManifest.xml中添加某些权限时错误,提示Permissionisonlygrantedtosystemapp.解决办法:点击Window→Preferences→Android→LintErrorChecking.更改ID=ProtectedPermission项的Security。六、实验小结①根据理论知识对所得到的实验数据或结果进行解释、分析。②对实验结果所作的一般性的判断、归纳、概括,实验的心得体会、建议等。后台服务是通过启动方式或者绑定方式开启的。在启动方式中,启动Service的组件不能够获取Service的对象实例而在绑定方式中,可以调用Service中实现的函数。七、实验代码FileUtils.javapackagemars.download;importjava.io.File;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.InputStream;importjava.io.OutputStream;importjava.util.ArrayList;importjava.util.List;importmars.model.Mp3Info;importandroid.os.Environment;publicclassFileUtils{privateStringSDCardRoot;publicFileUtils(){//得到当前外部储存设备的目录,File.separator是文件分隔符,比如在window下是\SDCardRoot=Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator;}/***在SD卡上创建文件*@paramfileName*@return*@throwsIOException*/publicFilecreateSDFile(StringfileName,Stringdir)throwsIOException{Filefile=newFile(SDCardRoot+dir+File.separator+fileName);System.out.println(file--+file);file.createNewFile();returnfile;}/***在SD卡上创建目录*/publicFilecreateSDDir(Stringdir){FiledirFile=newFile(SDCardRoot+dir+File.separator);System.out.println(createdir+dirFile.mkdir());returndirFile;}/***判断SD卡上的文件夹是否存在*/publicbooleanisFileExist(StringfileName,Stringpath){Filefile=newFile(SDCardRoot+path+File.separator+fileName);returnfile.exists();}/***将一个InputSream里面的数据写入到SD卡上*/publicFilewrite2SDFromInput(Stringpath,StringfileName,InputStreaminput){Filefile=null;OutputStreamoutput=null;try{createSDDir(path);file=createSDFile(fileName,path);output=newFileOutputStream(file);bytebuffer[]=newbyte[4*1024];inttemp;while((temp=(input.read(buffer)))!=-1){output.write(buffer,0,temp);}output.flush();}catch(Exceptione){e.printStackTrace();}finally{try{output.close();}catch(Exceptione){e.printStackTrace();}}returnfile;}/***读取目录中mp3文件的名字和大小+lrc文件*/publicListMp3InfogetMp3Files(Stringpath){ListMp3Infomp3Infos=newArrayListMp3Info();Filefile=newFile(SDCardRoot+path+File.separator);File[]files=file.listFiles();for(inti=0;ifiles.length;i++){if(files[i].getName().endsWith(mp3)){Mp3Infomp3Info=newMp3Info();mp3Info.setMp3Name(files[i].getName());mp3Info.setMp3Size(files[i].length()+);Stringlrcname[]=files[i].getName().split(\\.);Stringlrc=lrcname[0]+.lrc;if(isFileExist(lrc,/mp3)){mp3Info.setLrcName(lrc);}mp3Infos.add(mp3Info);}}returnmp3Infos;}}HttpDownloader.javapackagemars.download;importjava.io.BufferedReader;importjava.io.File;importjava.io.IOException;importjava.io.InputStream;importjava.io.InputStreamReader;importjava.net.HttpURLConnection;importjava.net.MalformedURLException;importjava.net.URL;publicclassHttpDownloader{privateURLurl=null;/***根据URL下载文件,前提是这个文件是文本的,函数的返回值就是文件当中的内容*1.创建一个URL对象*2.通过URL对象,创建一个HttpURLConnection对象*3.得到InputStream*4.从InputStream得到数据*/publicStringdownload(StringurlStr){StringBuffersb=newStringBuffer();Stringline=null;BufferedReaderbuffer=null;try{//创建一个url连接url=newURL(urlStr);//创建一个http连接HttpURLConnectionurlConn=(HttpURLConnection)url.openConnection();//使用IO读取数据buffer=newBufferedReader(newInputStreamReader(urlConn.getInputStream()));while((line=buffer.readLine())!=null){sb.append(line);}}catch(Exceptione){e.printStackTrace();}finally{try{buffer.close();}catch(Exceptione){e.printStackTrace();}}returnsb.toString();}/***该函数返回整形,-1代表下载文件出错,0代表下载文件成功,1代表文件已经存在*/publicintdownFile(StringurlStr,Stringpath,StringfileName){InputStreaminputStream=null;try{FileUtilsfu=newFileUtils();if(fu.isFileExist(fileName,path)){return1;}else{inputStream=getInputStreamFromUrl(u