Android应用开发实验指导书_第1页
Android应用开发实验指导书_第2页
Android应用开发实验指导书_第3页
Android应用开发实验指导书_第4页
Android应用开发实验指导书_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

...wd......wd......wd...?手机应用开发?实验指导书西南科技大学计算机科学与技术学院2015.11目录?手机应用开发?1实验指导书1实验一:搭建Android开发平台和创立HelloWorld程序-1-实验目的-1-实验要求-1-实验内容-1-一、安装并配置JavaJDK-1-二、下载安装集成ADT〔AndroidDevelopmentTools插件的Eclipse〔即adt-bundle〕-3-三、创立Android虚拟设备〔AVD〕-5-四、创立第一个Android工程工程—HelloWorld-6-实验二:UI设计8实验目的8实验要求8实验内容8一、常用控件8二、界面布局10三、事件处理13实验三:Intent、Activity应用15一、实验目的15二、实验要求15三、实验步骤151、创立工程152、添加布局文件164.修改AndroidManifest.xml文件19实验四:service应用20一、实验目的20二、实验要求20三、实验步骤201、创立工程202、布局文件213、修改AndroidManifest.xml文件24实验五:SQLite和SQLiteDatabase应用25一、实验目的25二、实验要求251、创立工程262、布局文件283、创立Activity29实验六:图形绘制与OpenGLES34一、实验目的34二、实验要求341、了解在屏幕绘图方法342、了解OpenGL34三、实验原理34四、实验过程341、绘制直线、园、曲线等各种图形342、显示字符343、利用OpenGLES方法编程34实验七:网络访问与服务36一、实验目的36二、实验要求361、了解手机WEB网站访问编程362、通过网络进展数据访问363、了解数据库使用36三、实验原理36四、实验过程37实验八硬件访问与传感器38一、实验目的38二、实验要求381、获取手机上、短信等各种功能的编程382、了解手机上各种传感器的功能与使用方法38三、实验原理38四、实验过程381、了解程序使用手机功能的方法382、手机上有多种传感器,可以对这些传感器进展编程。41实验九:综合实验47平时实验报告模板47?综合实验?设计实现报告50报告撰写安排表51注意:平时实验只完成实验一到实验五实验一:搭建Android开发平台和创立HelloWorld程序实验目的本次实验的目的是让同学们熟悉搭建智能手机开发平台的过程,了解Andorid应用程序工程的基本文件目录构造,并实现HelloWorld小例程。实验要求学习Android开发平台的搭建及相关配置创立工程并熟悉文件目录构造实现例程HelloWorld实验内容一、安装并配置JavaJDK下载安装JDK,网址如下。〔://oracle/technetwork/java/javase/downloads/jdk8-downloads-2133151.htm〕了解JDK与JRE的区别。了解JDK不同版本号的区别。了解jdk-8u65-windows-i586.exe与jdk-8u65-windows-x64.exe的区别查看并记录下实验用机上jdk的版本以及安装地址。配置JDK:XP:右键“我的电脑〞“属性〞“高级〞“环境变量〞WIN7:右键“我的电脑〞“高级系统设置〞“环境变量〞新建系统变量:JAVA_HOME,C:\ProgramFiles(x86)\Java\jdk1.6.0_18〔JDK安装目录〕。PATH,%JAVA_HOME%\bin;%JAVA_HOME%\jr\bin。CLASSPATH,.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar〔前面的.;一定要加上〕配置完成后在CMD中输入java–version和javac–version,能看到对应的JDK版本即配置成功,如以以下列图所示。请思考设置这三个环境变量的作用。二、下载安装集成ADT〔AndroidDevelopmentTools插件的Eclipse〔即adt-bundle〕认识开发工具根据桌面的eclipse(adt)快捷找到本机上的adt-bundle,翻开并了解其目录构造。认识、使用SDK管理器工具在adt-bundle文件目录里找到并启动SDKManager.exe,查看本机目前安装的AndroidSDK插件情况。启动Eclipse在adt-bundle文件目录里找到并启动eclipse.exe,启动后查看本机上eclipse配置的工作区位置〔工程源代码存放的位置〕。请思考若何使代码编辑区的代码显示行号,如果修改代码区字符的大小。三、创立Android虚拟设备〔AVD〕启动AVD〔AndroidVirtualDevice〕管理器在adt-bundle的sdk目录下找到并启动AVDManager.exe尝试创立一台虚拟的目标调试设备,注意物理内存不要设置太大。四、创立第一个Android工程工程—HelloWorld翻开Eclipse。点击“File〞“New〞“Project〞“AndroidProject〞,创立HelloWorld工程。输入合法的ApplicationName、ProjectName和PackageName后一路Next,完成工程的创立。创立成功后的工程文件构造如下:找到并查看工程中的如下几个文件:MainActivity.javaR.javaactivity_main.xmlstrings.xmlAndroidManifest.xmlPperties翻开eclipse下方的Problem查看器查看警告。选择工程HelloWorld点击右键RunAs“AndroidApplication〞,用之前创立的AVD运行此工程。如果运行失败,查看相应的提示信息后,重新跳到步骤1创立一个新的工程HelloWorld2,创立时将MinimunRequiredSDK设置为Android4.0或以上。请思考第一次创立的工程为什么会多生成一个appcompat_V7目录,并且运行失败。更改最低SDK版本后运行成功。实验二:UI设计实验目的本次实验的目的是让同学们熟悉Android开发中的UI设计,包括了解和熟悉常用控件的使用、界面布局和事件处理等内容。实验要求熟悉和掌握界面控件设计了解Android界面布局掌握控件的事件处理实验内容一、常用控件1.常用控件介绍Android中有许多常用控件〔简单分类〕:文本框:TextView、EditText按钮:Button、RadioButton、RadioGroup、CheckBox、ImageButton列表:List、ExpandableListView、Spinner、AutoCompleteTextView、GridView、ImageView进度条:ProgressBar、ProgressDialog、SeekBar、RatingBar选择器:DatePicker、TimePicker菜单:Menu、ContentMenu对话框:Dialog、ProgressDialog常用的控件有文本框、按钮和列表等。2.控件的实现在上一个实验中,我们用一个TextView控件实现了在界面显示一句“HelloWorld!〞。现在我们来看一看.xml文件和编码的相互关系。将MainActivity.java中代码修改如下:注意在上面并没有为textView和button设置文本内容等,另外textView的初始化代码为:TextViewtextView=(TextView)findViewById(R.id.textView01);此处初始化用到了id为textView01的TextView。在工程目录中找到/res/layout/activity_main.xml,修改代码如下:注意上面列出了两个控件:TextView和Button,id分别为textView01和button01,它们的文本内容分别为@string/hello_world和@string/button。在工程目录中找到/res/values/strings.xml,如下:可以看到两个string:hello和button的内容分别为“HelloTheAndroidWorld!〞和“Iamabutton!〞,即使文本框和按钮在界面上显示的内容,如以以下列图所示:3.控件的属性可以直接在类中为控件设置属性,也可以在xml文件中设置属性。每个控件都有一系列的属性,例如id、size、text、color等等,大家可以找找API查看控件的属性。二、界面布局 Android中有很多布局:FrameLayout:最简单的一个布局对象。它里面只显示一个显示对象。Android屏幕元素中所有的显示对象都将会固定在屏幕的左上角,不能指定位置。但允许有多个显示对象,但后一个将会直接在前一个之上进展覆盖显示,把前一个部份或全部挡住〔除非后一个是透明的〕。LinearLayout:以单一方向对其中的显示对象进展排列显示,如以垂直排列显示,那么布局管理器中将只有一列;如以水平排列显示,那么布局管理器中将只有一行。同时,它还可以对个别的显示对象设置显示比例。TableLayout:以拥有任意行列的表格对显示对象进展布局,每个显示对象被分配到各自的单元格之中,但单元格的边框线不可见。AbsoluteLayout:允许以坐标的方式,指定显示对象的具体位置,左上角的坐标为(0,0),向下及向右,坐标值变大。这种布局管理器由于显示对象的位置定死了,所以在不同的设备上,有可能会出现最终的显示效果不一致。RelativeLayout:允许通过指定显示对象相对于其它显示对象或父级对象的相对位置来布局。如一个按钮可以放于另一个按钮的右边,或者可以放在布局管理器的中央。布局中可以放置控件,而每个布局又可以嵌套其他布局,这种思想和之前学习java的布局是一样的。例如在activity_main.xml中如下布局:在一个LinearLayout布局下嵌套了两个LinearLayout,出来的效果如以以下列图所示:其他布局请同学们自行尝试。三、事件处理事件监听和时间处理的概念大家以前都学习过,android中主要有如下事件方法:onClick(Viewv)一个普通的点击按钮事件booleanonKeyMultiple(intkeyCode,intrepeatCount,KeyEventevent)用于在多个事件连续时发生,用于按键重复booleanonKeyDown(intkeyCode,KeyEventevent)用于在按键进展按下时发生booleanonKeyUp(intkeyCode,KeyEventevent〕用于在按键进展释放时发生onTouchEvent(MotionEventevent)触摸屏事件,当在触摸屏上有动作时发生booleanonKeyLongPress(intkeyCode,KeyEventevent)当长时间按时发生下面以点击一个Button为例子:为button添加了一个监听buttonListener,对应的onClick方法那么抛出了一那么文本框提示用户,效果图如下所示:其它控件的使用请同学们自行尝试。实验三:Intent、Activity应用一、实验目的本次实验的目的是让同学们熟悉Intent和Activity的使用。Intent的最常用的用途是绑定应用程序组件。Intent用来在应用程序Activity间启动、停顿和传输。并实现添加用户名,密码小例程。二、实验要求完成Android开发平台的搭建及相关配置创立工程并熟悉文件目录构造实现例程添加用户名,密码实验步骤三、实验步骤工程界面:添加用户名,密码,在另一页面显示用户名。1、创立工程新建一个Android工程命名为test1,目录构造如以以下列图:2、添加布局文件修改main.xml布局文件(这里增加了两个TextView,两个EditView,一个按钮),如以以下列图新建test2.xml布局文件(这里增加了两个TextView),这个页面是用来显示添加的用户名,如以以下列图:3、创立Activity修改test1.java,并且新建一个Activity,一个是test2.java。,代码分别如下:Test1.java作用:获得页面输入的内容,存储并跳转到test2.xml。Test2.java作用:从Intent中获得需要显示name的值,并给TextView赋值。4.修改AndroidManifest.xml文件对比重要的一步啦,修改AndroidManifest.xml文件〔将新增的Activity,test2)注册一下,代码如下(第16行):请尝试使用startActivityForResult(Intentintent,intrequestCode)方法实现页面的跳转。实验四:service应用一、实验目的本次实验的目的是让大家熟悉service的使用。一个使用Service的典型的例子是,用户一边在手机做其他的事情,一边听手机上的音乐。其中,在后台播放音乐就可以使用Service来实现。并实现简单播放器的小例程。二、实验要求创立工程并熟悉文件目录构造。实现例程简单播放器。三、实验步骤工程界面:1、创立工程新建一个Android工程命名为test1,目录构造如以以下列图:2、布局文件修改main.Xml文件修改MusciPlayer.java文件,新建MusicService.java文件,代码如以以下列图:MusciPlayer.java文件MusicService.java3、修改AndroidManifest.xml文件对比重要的一步,修改AndroidManifest.xml文件〔将新增的service〕注册一下,代码如下(第16行):实验五:SQLite和SQLiteDatabase应用一、实验目的1、本次实验的目的是让大家熟悉Android中对数据库进展操作的相关的接口、类等。SQLiteDatabase这个是在android中数据库操作使用最频繁的一个类。通过它可以实现数据库的创立或翻开、创立表、插入数据、删除数据、查询数据、修改数据等操作。2、实现添加用户名,爱好小例程。二、实验要求1、完成Android开发平台的搭建及相关配置2、创立工程并熟悉文件目录构造3、实现例程添加用户名,爱好实验步骤三、实验步骤工程界面:输入用户名,爱好添加到数据库,由数据库查询出来显示插入的列表。当单击列表时会弹出Alert询问是否删除,进展删除操作。1、创立工程新建一个Android工程命名为Database,目录构造如以以下列图:2、布局文件修改main.xml布局文件,添加display.xml文件,用来显示列表。如以以下列图Main.XmlDisplay.xml3、创立Activity修改DatabaseActivity.java文件,新建DBHelper.java文件和displayAvtivity.java,代码如以以下列图:DBHelper.java操作数据库的工具类,该类继承SQLiteOpenHelper。DatabaseActivity.java获取页面输入的值,添加到数据库displayAvtivity.java显示列表,删除数据实验六:图形绘制与OpenGLES一、实验目的在屏幕绘制各种图形,了解OpenGL二、实验要求1、了解在屏幕绘图方法2、了解OpenGL三、实验原理四、实验过程1、绘制直线、园、曲线等各种图形2、显示字符3、利用OpenGLES方法编程Android中的图形系统采用Client/Server架构。Server(即SurfaceFlinger)主要由c++代码编写而成。Client端代码分为两局部,一局部是由Java提供的供给用使用的api,另一局部那么是由c++写成的底层实现。Android图形系统中通过surface为view创立一个Canvas对象,管理view在surface上的绘图操作。View及其子类〔如TextView,Button〕要画在surface上。OpenGLES(OpenGLforEmbeddedSystems)是一个针对嵌入式应用的,免费的,支持全功能2D、3D的跨平台API〔OpenGL®ESisaroyalty-free,cross-platformAPIforfull-function2Dand3Dgraphicsonembeddedsystems-includingconsoles,phones,appliancesandvehicles〕。目前主要由3个版本,1.0,1.1,2.0。OpenGLES1.0是以OpenGL1.3标准为根基的,OpenGLES1.1是以OpenGL1.5标准为根基的,1.1完全兼容1.0。OpenGLES2.0那么是参照OpenGL2.0标准定义的。简单的来说,OpenGLES是OpenGL针对嵌入式应用的简化版,也就是android使用的标准。OpenGLES1.1强调api的硬件加速,OpenGLES2.0更强调3D能力。OpenGLES1.1和OpenGLES2.0之间的关系并不是旧版本和新版本之间的差异,而是一个针对相对低端的应用,一个针对高级应用,OpenGL官方的roadmap也是将这两个版本并行开展的。2.X并不能百分百兼容1.X。Android现在支持1.X和2.X。OpenGLES是专为内嵌和移动设备设计的一个2D/3D轻量级图形库,它基于OpenGLAPI设计,是OpenGL三维图形API的子集。Android里有三个与OpenGL有关的包:android.opengl javax.microedition.khronos.egl javax.microedition.khronos.opengles publicvoidonDrawFrame(GL10gl){ //一般的opengl程序,首先要做的就是清屏 gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT); //紧接着设置模型视图矩阵 gl.glMatrixMode(GL10.GL_MODELVIEW); gl.glLoadIdentity();//清空矩阵 GLU.gluLookAt(gl,0,0,3,0,0,0,0,1,0);//视点变换,将相机位置设置为(0,0,3),同时指向(0,0,0)点 //设置模型位置旋转及缩放信息 gl.glTranslatef(0.0f,0.0f,-1.0f);//将模型位置设置为(0,0,-1) floatangle=30.0f; gl.glRotatef(angle,0,1,0);//绕模型自身Y轴旋转30度 gl.glRotatef(angle,1,0,0);//绕模型自身X轴旋转30度 gl.glScalef(1.2f,1.2f,1.2f);//设置三方向的缩放系数 //设置颜色gl.glColor4f(0.0f,0.0f,0.0f,1.0f);//渲染立方体 mCube.draw(gl,gl.GL_TRIANGLES);//mCube.draw(gl,gl.GL_LINES); }实验七:网络访问与服务一、实验目的掌握Android网络访问方法二、实验要求1、了解手机WEB网站访问编程2、通过网络进展数据访问3、了解数据库使用三、实验原理利用Android网络访问协议四、实验过程访问WEB网站,通过Response类,读入网络数据。AndroidSDK网络包:包描述Android网络访问socket。该包包括URI类,不仅仅是传统的联网方面。.处理Android有关协议类。.wifi在Android平台上管理有关WiFi(802.11无线Ethernet)应用的类。android.telephony.gsm包含用于管理和发送SMS(文本)消息的类。读入WEB数据例程: Clientclient=newDefaultClient(); Getget=newGet(url); Responseresponse=client.execute(get); Entityentity=response.getEntity(); //尝试读取entity的长度,返回-1表示长度未知 longlength=entity.getContentLength(); InputStreamis=entity.getContent(); Strings=null; if(is!=null){ ByteArrayOutputStreambaos=newByteArrayOutputStream(); byte[]buf=newbyte[512]; intch=-1; intcount=0; while((ch=is.read(buf))!=-1){ baos.write(buf,0,ch); count+=ch; //如果长度,可以通过taskProgress()通知监听者任务执行的比例 if(length>0){ listener.taskProgress(this,count,length); } //为了更好的演示进度,让线程休眠100ms Thread.sleep(100); } Log.e("Task","length="+baos.toByteArray().length); //返回内容 s=newString(baos.toByteArray()); } returns;实验八硬件访问与传感器一、实验目的通过底层API访问手机硬件及手机上的各种传感器二、实验要求1、获取手机上、短信等各种功能的编程2、了解手机上各种传感器的功能与使用方法三、实验原理利用手机本身的功能与相关传感器的使用四、实验过程1、了解程序使用手机功能的方法短信收发:◆发送短信只需要几行代码,如下:SmsManagersms=SmsManager.getDefault();PendingIntentpi=PendingIntent.getBroadcast(this,0,newIntent(),0);sms.sendTextMessage(phoneNumber,null,MsgStr,pi,null);其中参数phoneNumber和MsgStr均是String类型,表示接收方的号码和短信内容◆接收短信主要是继承BroadcaseReceiver类,覆盖onReceive函数:packagecom.android.TinySMS;importandroid.app.Activity;importandroid.app.PendingIntent;importandroid.content.BroadcastReceiver;importandroid.content.Context;importandroid.content.Intent;importandroid.os.Bundle;importandroid.telephony.gsm.SmsManager;importandroid.view.View;importandroid.widget.Button;importandroid.widget.EditText;importandroid.widget.Toast;publicclassTinySMSextendsActivity{publicstaticfinalStringSMS_ACTION="com.android.TinySMS.RESULT";// privateTextView message;privateButton snd;privateEditText tel;privateEditText txt;privateSentReceiverreceiver=newSentReceiver();privateclassSentReceiverextendsBroadcastReceiver{ @Override publicvoidonReceive(Contextcontext,Intentintent){ if(intent.getAction().equals(SMS_ACTION)){ intcode=getResultCode(); //短消息发送成功 if(code==Activity.RESULT_OK) Toast.makeText(TinySMS.this,R.string.msg_sent, Toast.LENGTH_SHORT).show(); } }};/**Calledwhentheactivityisfirstcreated.*/@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main); tel=(EditText)findViewById(R.id.EditText01); tel.setText("5554");//模拟器之间互发短信 txt=(EditText)findViewById(R.id.EditText02); txt.setText("我用自己的程序试试发短信。"); snd=(Button)findViewById(R.id.Button01); snd.setOnClickListener(newView.OnClickListener(){ publicvoidonClick(Viewarg0){ StringphoneNo=tel.getText().toString(); Stringmessage=txt.getText().toString(); if(phoneNo.length()>0&&message.length()>0){ sendSMS(phoneNo,message); }else{ Toast.makeText(TinySMS.this, "请重新输入号码和短信内容", Toast.LENGTH_LONG).show(); } } });}privatevoidsendSMS(Stringaddress,Stringcontent){ SmsManagermanager=SmsManager.getDefault(); Intenti=newIntent(SMS_ACTION); //生成PendingIntent,当消息发送完成,接收到播送 PendingIntentsentIntent=PendingIntent.getBroadcast( this, 0, i, PendingIntent.FLAG_ONE_SHOT); manager.sendTextMessage( address, null, content, sentIntent, null);}}如果要收发短信,还需在AndroidManifest.xml中声明权限:<uses-permissionandroid:name="android.permission.READ_SMS"></uses-permission><uses-permissionandroid:name="android.permission.SEND_SMS"></uses-permission>2、手机上有多种传感器,可以对这些传感器进展编程。AndroidSDK中提供的面向硬件的特性特性描述android.hardware.Camera相机交互的类,可以截取照片、获取预览屏幕的图像,修改理相机操作的参数。android.hardware.SensorManager允许访问Android平台传感器的类。并非所有配备Android的设备都支持SensorManager中的所有传感器。android.hardware.SensorListener在传感器值实时更改时,希望接收更新的类要实现的接口。用以监视硬件中一个或多个可用传感器。android.media.MediaRecorder用于录制媒体的类。android.FaceDetector人脸进展基本识别类。android.os.*可以与操作环境交互的包,包括电源管理、文件查看器、处理器和消息类。android.hardware.SensorManager包含几个常量,这表示Android传感器系统的不同方面,包括:传感器类型:方向、加速表、光线、磁场、临近性、温度等。采样率最快、游戏、普通、用户界面。当应用程序请求特定的采样率时,其实只是对传感器子系统的一个提示,或者一个建议。不保证特定的采样率可用。准确性高、低、中、不可靠。SensorListener接口是传感器应用程序的中心。它包括两个必需方法:onSensorChanged(intsensor,floatvalues[])方法在传感器值更改时调用。该方法只对受此应用程序监视的传感器调用。该方法的参数包括:一个整数,指示更改的传感器;一个浮点值数组,表示传感器数据本身。有些传感器只提供一个数据值,另一些那么提供三个浮点值。方向和加速表传感器都提供三个数据值。当传感器的准确性更改时,将调用onAccuracyChanged(intsensor,intaccuracy)方法。参数包括两个整数:一个表示传感器,另一个表示该传感器新的准确值。要与传感器交互,应用程序必须注册以侦听与一个或多个传感器相关的活动。注册使用SensorManager类的registerListener方法完成。并非所有支持Android的设备都支持SDK中定义的所有传感器。以Android为中心的传感器系统相机拍摄:packagecom.android.cameraAndroid;importandroid.app.Activity;importandroid.os.Bundle;importjava.io.File;importjava.io.FileOutputStream;importjava.io.IOException;importandroid.content.Context;importandroid.content.Intent;importandroid.graphics.PixelFormat;importandroid.hardware.Camera;importandroid.hardware.Camera.Parameters;importandroid.hardware.Camera.PictureCallback;importandroid.hardware.Camera.ShutterCallback;importandroid.media.AudioManager;importandroid.media.ToneGenerator;import.Uri;importandroid.os.Environment;importandroid.os.StatFs;importandroid.view.Menu;importandroid.view.MenuItem;importandroid.view.SurfaceHolder;importandroid.view.SurfaceView;publicclassCameraAndroidextendsActivity{ privateCameraPreviewpreview; privateCameracamera; privateToneGeneratortone; privatestaticfinalintOPTION_SNAPSHOT=0; @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); preview=newCameraPreview(this); setContentView(preview); } @Override publicbooleanonOptionsItemSelected(MenuItemitem){ intitemId=item.getItemId(); switch(itemId){ caseOPTION_SNAPSHOT: //拍摄照片 camera.takePicture(shutterCallback,null,jpegCallback); break; } returntrue; } //返回照片的JPEG格式的数据 privatePictureCallbackjpegCallback=newPictureCallback(){ publicvoidonPictureTaken(byte[]data,Cameracamera){ Parametersps=camera.getParameters(); if(ps.getPictureFormat()==PixelFormat.JPEG){ //存储拍照获得的图片 Stringpath=save(data); //将图片交给Image程序处理 Uriuri=Uri.fromFile(newFile(path)); Intentintent=newIntent(); intent.setAction("ent.action.VIEW"); intent.setDataAndType(uri,"image/jpeg"); startActivity(intent); } } }; //快门按下的时候onShutter()被回调 privateShutterCallbackshutterCallback=newShutterCallback(){ publicvoidonShutter(){ if(tone==null) //发出提示用户的声音 tone=newToneGenerator(AudioManager.STREAM_MUSIC, ToneGenerator.MAX_VOLUME); tone.startTone(ToneGenerator.TONE_PROP_BEEP2); } }; privateStringsave(byte[]data){ Stringpath="/sdcard/"+System.currentTimeMillis()+".jpg"; try{ //判断SD卡上是否有足够的空间 Stringstorage=Environment.getExternalStorageDirectory().toString(); StatFsfs=newStatFs(storage); longavailable=fs.getAvailableBlocks()*fs.getBlockSize(); if(available<data.length){ //空间缺乏直接返回空 returnnull; } Filefile=newFile(path); if(!file.exists()) //创立文件 file.createNewFile(); FileOutputStreamfos=newFileOutputStream(file); fos.write(data); fos.close(); }catch(Exceptione){ e.printStackTrace(); returnnull; } returnpath; } @Override publicbooleanonCreateOptionsMenu(Menumenu){ menu.add

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论