基于安卓Android操作系统的软件开发毕业论文_第1页
基于安卓Android操作系统的软件开发毕业论文_第2页
基于安卓Android操作系统的软件开发毕业论文_第3页
基于安卓Android操作系统的软件开发毕业论文_第4页
基于安卓Android操作系统的软件开发毕业论文_第5页
已阅读5页,还剩70页未读 继续免费阅读

下载本文档

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

文档简介

摘要:本文首先地分析了Android系统相对于其他操作系统的优势和具备的潜力。论述了Android系统开发的流程,并搭建了Android系统的开发平台:androidSDK和ADT。接下来进行了新浪微博客户端的自主研发,主要从UI和功能两个方向进行了设计和开发,并着重论述了UI的设计和实现。在客户端开发的基础上又实现了微博服务端API的OAuth认证,使客户端可以投入使用。关键词:Android;Android开发平台;新浪微博客户端;UI;OAuth认证ThesoftwaredevelopmentbasedontheAndroidmobilesystemAbstract:ThispaperfirstbrieflyintroducestheimportantcomponentoftheAndroidsystem:operatingsystem(Linux),middlewareandcomposedofthecoreapplicationssoftwarestack(softwarestack);AndintroducetheAndroidsystemdevelopmentplatformAndroidSDKprovidesAPIandthecorrespondingdevelopmenttool.ThenextlevelofAndroidinfromsystematicresearch.Mainlyinitsruntime,environmentallayerandAndroidapplicationframeworklayerofresearch.Finally,throughtheAndroidplatformontheapplicationdevelopment,realizetheAndroidsystemoftheuseofIntentmechanism.KeyWords:Android;AndroidKernel;UI;OAuth;AndroidSDK;AndroidDevelopment目录第一章绪论 11.1智能平台 11.2ANDROID平台介绍 2第二章Android开发环境的搭建 32.1开发包及其工具的安装和配置 3安装JDK和配置Java开发环境 32.1.2Eclipse的安装与汉化 42.1.3SDK和ADT的安装和配置 5创建第一个ANDROID项目——HELLOANDROID 7创建HelloAndroid项目 7运行HelloAndroid及模拟器的使用 8第三章新浪微博客户端的开发 123.1载入页面 12UI篇 123.1.2sqlite篇 14OAUTH授权认证 153.3用户授权页面 163.3.1用户授权页面UI篇 163.3.2用户授权页面功能篇 183.4登录页面 203.4.1登陆页面UI篇 203.4.2登录页面功能篇 21用户首页面 223.5.1用户首页面UI篇 223.5.2用户首页面功能篇 243.6阅读微博 243.6.1阅读微博UI篇 243.6.2阅读微博功能篇 253.7大图浏览以及保存篇 26总结 28参考文献 29致谢 30附录核心代码 31第一章绪论1.1智能平台说起,没有一个人会感到陌生。近几年来一个名词一直影响着许许多多的用户,它就是智能。智能凭借其强大的功能吸引住了许多用户的眼球,因为有了广大的用户基础,智能也风靡一时。说起智能,除了他有一颗强大的CPU和其他一些较高配置的硬件外,其真正的智能还要归功于其不可缺少的智能操作系统。当今,智能所搭载的智能操作系统平台大致如下:(1)SymbianOS。搭载在具有广泛群众基础的Nokia上,并以此占据了智能的半壁江山,其主要的智能平台为大部分诺基亚搭载的的S60系列和索尼爱立信搭载的UIQ系列;(2)WindowsMobile。Microsoft在桌面系统获得成功之后,觊觎的巨大市场开发的智能系统,因其界面和桌面windows系统较为接近和其强大的微软后台,成为国内市场占有率紧跟Symbian之后成为国人比较喜欢的操作系统;(3)MacOSX(iPhoneOS)。苹果一直都是个性和时尚的代名词,受广大中高层次用户的喜欢。iPhone,以其酷炫的UI和独特的操作方式,给传统带来一场革命,同时也给Symbian和WindowsMobile带来巨大冲击的;(4)Blackberry。以商务应用为主,在国外尤其是欧美等地,受到商务人士欢迎的BlackBarry占据了近一半的无线商务电子邮件业务市场,就连美国总统奥巴马也使用该品牌的。但是在国内还是受到一些基础设施的制约,所以在国内市场不是太好;(5)PalmOS。专门为PDA开发,一度占据了90%的PDA市场的份额,虽然其并不专门针对于设计,但是以其优秀性和对移动设备的支持同样使其能够成为一个优秀的操作系统。(6)Linux。对于Linux系统,想必很多人都不会太陌生,桌面系统中以其开源的特性,赢得了不少用户的喜爱。智能平台的Linux同样具有源代码开放、软件授权费用低、应用开发人才资源丰富等优点,便于开发个人和行业应用。但是因为其平台上的应用少而不被国人所接受。(7)GoogleAndroid。自2007年推出,2008年第一部搭载Android系统的G1上市至今不到短短三年时间,他已被许多人接受并且认可及欢迎。虽然如今的智能系统市场仍被Symbian、WindowsMobile的占领,但是iPhone的革命以后,以及后起之秀Android的推出,在将来,智能市场将发生翻天覆地的变化。1.2Android平台介绍 Android从诞生到现在也不过3年的时间,但是也就是在这短短的3年内Android创造了一个迅速被人们知晓并追捧的奇迹。2007年11月5日,Google与其他33家制造商(包含摩托罗拉、宏达电、三星、LG)、晶片供应商、软硬体供应商、电信业者所联合组成的开放手持装置联盟(OpenHandsetAlliance),发布了名为Android的开放软硬体平台。该联盟的成员宣布日后都会在Android平台上开发他们的新的业务。不久之后的2008年9月24日,T-Mobile公司首度公布第一台Android(G1)的细节,同日Google也放出了AndroidSDK1.0rc1。这样Android进入了人们的视线。Android以其特有的开放性优势越来越受到人们和智能厂商的关注。对于第三放软件开发商来说,Android是一个真正意义上的开放性移动设备综合平台,Android系统是免费向开发人员提供的,这样就避免了开发中专利权的障碍。因此,就能够为第三方软件开发商省下大笔资金。对于设备制造商来说,Android是一个免费的平台。当设备制造商每制造一台时,那些支付给系统制造商的费用也省去了,这样也降低了每台的生产费用,同时就降低了的价格,这样在市场上也提高了竞争力。对硬体开发厂商来说,Android也是个开放的平台。使用Android平台的厂商可以更具自己的需求以及能力为Android开发具有该厂商特色的功能,但是这样的增加完全不用考虑版权的问题。同时Android平台支持各种先进的网络、绘图、3D处理能力,可以用来提供更好的使用者体验。GoogleAndroid系统作为一个完全开源的操作系统,是由操作系统(Linux)、中间件以及核心应用程序组成的软件栈(softwarestack)。通过androidSDK提供的API以及相应的开发工具,程序员可以很方便的开发android平台上的应用程序。其整个系统由应用程序(Application),应用程序框架(ApplicationFramework),应用程序库(Libraries),Android运行库(AndroidRuntime),Linux内核(LinuxKernel)五个部分组成。Android操作系统内置了一部分应用程序,包括电子邮件客户端、SMS程序、日历、地图、浏览器、通讯录以及其他的程序,值得一提的是这些所有的程序都是用java编写的。因为应用程序框架使得组件更易于重用,所以开发者的应用程序可以很容易的调用API函数实现我们想要的功能。在遵守应用程序框架的安全机制约束的前提下,开发者开发的一个应用程序可以使用其他程序所开发的功能。虽然Android的应用程序是用Java语言开发的,但是Android给应用程序开发者提供了一系列的C/C++程序库,通过Android的一些特殊的设计,我们开发者可以使用这些库,这在后面的叙述中将看到。现今,Android操作系统已成为许多制造商的宠儿,其中包括HTC、索尼爱立信、Samsung、摩托罗拉以及国内的联想、华为、海尔、华禹等。其中值得一提的是摩托罗拉公司,就在2009年11月凭借其一款搭载Android平台的Droid,两个月内就突破百万台,击败了苹果的iPhone3GS,被《时代》杂志评选为“年度最佳科技产品”。因此告别了两年多的低迷态势,走出了泥潭。第二章Android开发环境的搭建2.1开发包及其工具的安装和配置安装JDK和配置Java开发环境(1)安装JDK,安装包中包含了JDK和JRE两部分,建议将它们安装在同一个盘符下。双击安装程序,选择安装的目录,点击“下一步”,等待安装程序自动完成安装即可。(2)右键单击“我的电脑”,选择“属性”菜单项,选择“高级”选项卡,选择“环境变量”,找到“Path”变量名(如果没有就新建一个名为“Path”的变量),点击“编辑”按钮,添加JDK安装目录中“bin”文件夹路径,如图2-1所示。然后点击“确定”按钮完成。再找到“ClASSPATH”变量(如果没有,同样可以新建),输入JDK安装目录中“lib”以及“demo”的路径,如图2-2所示,单击“确定”按钮完成。

图2-1“Path”变量配置

图2-2“ClASSPATH”变量配置(3)安装配置完成之后,要测试是否安装成功。点击开始→运行,输入“CMD”,打开命令行模式。键入命令“java-version”,检测JDK是否安装成功,如果运行结果如图2-3所示,即表示安装成功。

图2-3“java-version”测试命令2.1.2Eclipse的安装与汉化Babel的安装方法和步骤如下所示:(1)启动Eclipse开发工具,依次点击“Help”→选择“SoftwareUpdate...”菜单命令,打开“SoftwareUpdatesandAdd-ons”对话框,选择“AvaliableSoftware”项。接着点击“AddSite...”按钮,在“Location”文本框中输入Babel更新地址:techn-ology/babel/update-site/ganymede,然后点击OK按钮,如图2-4所示。图2-4

添加语言包更新地址(2)“AvaliableSoftware”表中会多出一项up-date-site/ganymede/,点击该项左边的箭头,就会出现网络更新软件列表,如图2-5所示。

图2-5

AvaliableSoftware选择框(3)选择“SimplifiedChinese”语言包后,点击“Install...”按钮,等待Eclipse处理。处理完成后会出现“Install”对话框,这时会提示你选择要安装的语言包。安装完毕后,重新启动Eclipse即可完成全部汉化过程。如果重启Eclipse后不显示中文,请用命令行“eclipse.exe-nlzh_CN”重新启动Eclipse。2.1.3SDK和ADT的安装和配置安装了JDK和Eclipse后,现在就要安装AndroidSDK和ADT插件了。1.AndroidSDK安装(1)解压缩下载好的SDK安装包到要安装SDK的路径,然后运行“SDKSetup.exe”。(2)如果遇到了消息为“FailedtofetchURL…”的错误提示,那么需要将S方式改为方式,在“AndroidSDKandAVDManager”窗口的左侧选择“Settings”,选中“Forces://…”选项(如图2-6所示),点击“Save&Apply”并重新运行。图2-6

更改方式(3)点击“AvailablePackages”,选择要安装的API版本及USB驱动和SDK文档,如图2-7所示。这里为了测试方便,所以全部选择了。图2-7

选择API版本(4)选择好之后点击“InstallSelected”按钮,安装选中的软件包,在接下来出现的界面中依次点击“AcceptAll”单选按钮和“InstallAccepted”按钮,开始下载所选择的安装包。下载完成之后,根据提示即可完成后续的安装操作。2.AndroidSDK配置需要将AndroidSDK安装目录中的tools文件夹路径添加到环境变量中以便使用,操作步骤如下:(1)右键点击“我的电脑”,依次选择“属性”→“高级”→“环境变量”选项,如图2-8所示。(2)选择“系统变量”中变量名为“Path”的项,点击“编辑”按钮,将AndroidSDK安装文件夹下的tools文件夹的路径加入到“Path”变量中,注意用“、”隔开,如图2-9所示。

图2-8

环境变量

图2-9

编辑系统环境变量(3)依次点击“确定”,完成环境变量配置。3.安装和配置ADT下面我们来安装和配置ADT插件,步骤如下:(1)启动Eclipse,点击“Help”菜单,依次选择“SoftwareUpdate...”项和“AvaiableSoftware”选项卡,点击“AddSite...”按钮,输入地址,结果如图2-10所示。(2)点击“OK”,这时可能会出现如图2-11所示的错误。

图2-10

添加ADT的更新地址

图2-11

更新地址错误解决这个问题的方法是:将“s://dl-ssl.google/android/eclipse/”中的“s”更改为“”,在接下来的对话框中选中“Name”下的所有选项,根据提示即可完成后续的安装过程。(3)打开菜单“Windows”,依次选择“Preferences”→“Android”,点击“Browse...”按钮,选择AndroidSDK的安装路径,如图2-12所示。图2-12

Eclipse首选项(4)点击“OK”按钮,开打菜单“File”,依次选择“NEW”→“Project...”菜单命令,出现如图2-13所示的“AndroidProjest”选项,则表示安装配置成功。图2-13

新建工程界面2.2

创建第一个Android项目——HelloAndroid2.2.1

创建HelloAndroid项目ADT提供了简单的生成Andriod应用框架的功能,我们现在使用ADT通过Eclipse创建一个Android工程,其步骤如下。(1)打开Eclipse开发工具,新建一个项目,在弹出的“NewProject”对话框的列表中展开“Android”项,然后选择“AndroidProject”子项,如图2-14所示。图2-14

新建一个Android工程(2)点击“Next”按钮,在“Projectname”文本框中输入“HelloAndroid”,然后在“BuildTarget”选项框中选择“AndroidSDK1.5”,在Applicationname文本框中输入这个应用程序的名字(HelloAndroid),在Packagename文本框中输入应用程序包的名字(),在CreateActivity文本框中输入Activity的名字(HelloAndroid),如图2-15所示。图2-15

新建HelloAndroid工程(3)单击“Finish”按钮,此时Eclipse会自动完成Android项目的创建,这时Eclipse开发平台左边的导航器中显示了刚才创建的项目“HelloAndroid”。如果没有出现导航器,则可以通过单击“Window”→“ShowView”→“PackageExplorer”菜单命令来显示导航器,如图2-16所示。2.2.2

运行HelloAndroid及模拟器的使用从开始引入了AVD(AndroidVirtualDevice)这个概念。AVD是一个经过配置的模拟器。在创建AVD时可以配置的选项有:模拟器影像大小、触摸屏、轨迹球、摄像头、屏幕分辨率、键盘、GSM、GPS、Audio录放、SD卡支持、缓存区大小等。配置Android模拟器的具体步骤如下所示。(1)首先打开“AndroidSDKandAVDManager”,如图2-17所示。

图2-16

显示项目管理器

图2-17

AndroidSDKandAVDManager菜单(2)点击左边的“VirtualDevices”选项,再点击右边的“New...”按钮,新建一个AVD。(3)在“Name”标签处填写AVD的名字,在“Target”标签处选择API等级,在“Size”标签处填写要创建的SD卡的大小,在“Skin”标签中设置模拟器的风格,如图2-18所示。(4)到这里,我们便可以运行第一个Android项目了吗?还是不行,还需要配置模拟器运行的AVD。操作步骤为:点击“Run”,选择“RunConfigurations”菜单命令,打开“RunConfigurations”对话框,如图2-19所示。(5)双击“RunConfigurations”对话框左边的导航器中的“AndroidApplication”菜单命令,创建一个Android项目运行配置。在右边的“Name”文本框中输入Android项目运行配置的名字(HelloAndroid),在“Android”选项卡中的“Project”文本框中输入要运行的Android项目,同样可以点击右边的“Browse...”按钮来选择Android项目,如图2-20所示。

图2-18

创建AVD图2-19

运行配置界面图2-20

配置要运行的HelloAndroid项目(6)点击“Target”选项卡,选择“Automatic”单选框,然后在AVD列表框中选择我们刚才创建的AVD,如图2-21所示。

图2-21

制定运行HelloAndroid项目的AVD(7)点击“Run”按钮,这样便可以运行HelloAndroid项目了,不过Android模拟器启动非常慢,慢慢等吧。但是Android的模拟器做得非常漂亮,终于可以看到第一个Android项目的运行效果了,如图2-22所示。

图2-22HelloAndroid项目在模拟器中的运行效果

图2-23Android模拟器显示中文界面从版本开始,Android模拟器开始支持中文了,也内置了中文输入法(谷歌拼音输入法),下面我们就将模拟器改为中文环境。操作步骤为:启动Android模拟器,进入Android模拟器菜单,选择“Settings”菜单项,开打“Settings”菜单,选择“Locale&text”菜单项,打开“Locale&text”菜单,依次选择“Selectlocale”项和“Chinese(China)”项,这样就设置为中文了,然后返回桌面,如图2-23所示。

第三章新浪微博客户端的开发3.1载入页面3.1.1UI篇

本软件设定用户第一个接触到的功能就是页面载入等待功能,这个功能对使用者来说就是一个持续1、2秒钟的等待页面,在用户等待的同时程序做一些必要的检查以及数据准备工作,载入页面分为UI篇和功能篇,从表及里首先是UI的实现,一个软件除功能之外还得有一个光鲜的外表也是非常重要的,先用ps做了一下设计效果图如下:图3-1载入页面制作

图3-1载入页面制作

一、接下来的任务就是在android中实现这样的效果显示,从这个效果的设计分别把图片分成背景、版本号部分、软件名称和图标、作者名称和blog四个部分,按照这样的思路把分别生成4张png的图片,背景部分考虑实现横屏和竖屏切换额外添加一张横屏背景图,然后新建android工程,我这里的名称为MySinaWeibo,android版本勾选2.2,并且创建名为MainActivity的Activity作为整个软件的起始页面,然后把上面的这些图片保存到项目的res/drawable-mdpi文件夹下,关于res目录下的drawable-mdpi、drawable-ldpi、drawable-hdpi三个文件夹的区别,mdpi里面主要放中等分辨率的图片,如HVGA(320x480)。ldpi里面主要放低分辨率的图片,如QVGA(240x320)。hdpi里面主要放高分辨率的图片,如WVGA(480x800),FWVGA(480x854)。android系统会根据机器的分辨率来分别到这几个文件夹里面去找对应的图片,在开发程序时为了兼容不同平台不同屏幕,建议各自文件夹根据需求均存放不同版本图片。

二、完成图片资源的准备后接下就是layout文件的编写,在res/layout文件夹下新建文件,这个layout采用LinearLayout控件作为顶层控件,然后用ImageView控件分别实现版本号图片顶部靠左对齐显示、软件名称和图标图片居中对齐。注意在版本号图片显示ImageView控件下面添加一个RelativeLayout控件作为软件名称和图标图片ImageVIew和作者名称和blog图片ImageView的父控件用来控制居中对齐已经底部对齐的实现。

三、在ec打开名为MainActivity的Activity源代码文件进行编辑,onCreate部分代码如下:

public

void

onCreate(Bundle

savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

}然后运行项目可以在模拟器中显示,上面的几个图片都按照设计的位置和效果进行显示只是整个页面的背景还是黑色的,接下来就是背景部分的显示实现,由于为了实现横竖屏切换显示,背景图的显示采用代码进行控制显示,首先用如下方法获取当前是横屏还是竖屏://获取屏幕方向E

&&

orient

!=

ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)

{

//宽>高为横屏,反正为竖屏

WindowManager

windowManager

=

activity.getWindowManager();

Display

display

=

windowManager.getDefaultDisplay();

int

screenWidth

=

display.getWidth();

int

screenHeight

=

display.getHeight();

orient

=

screenWidth

<

screenHeight

?

ActivityInfo.SCREEN_ORIENTATION_PORTRAIT

:

ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;

}

return

orient;

}然后编写一个名为AutoBackground的公共方法用来实现屏幕背景的自动切换,后面的几乎每一个功能页面都需要用到这个方法:ENTATION_PORTRAIT)

{

//纵向

view.setBackgroundResource(Background_v);

}else{

//横向

view.setBackgroundResource(Background_h);

}

}

完成上述两方法后在

MainActivity的onCreate方法中调用AutoBackground方法进行屏幕自动切换:LinearLayout

layout=(LinearLayout)findViewById(R.id.layout);

//背景自动适应

AndroidHelper.AutoBackground(this,

layout,

R.drawable.bg_v,

R.drawable.bg_h);

到此完成了载入页面的UI部分的实现,测试运行模拟器中查看效果,基本上跟最上面的设计效果图相符,测试效果图如下:图3-2载入页面测试效果图

图3-2载入页面测试效果图04/1925655.html"sqlite篇

通过上一节已经完成了载入页面的UI部分的实现,接下来在上面的基础上完成载入页面的功能代码。

首先说明一下新浪微博提供了OAuth和BaseOAuth两种认证方式,本项目是采用OAuth认证方式,采用这种方式就需要有用户的新浪UserID、AccessToken、AccessSecret这3样东西才能自由便利的调用新浪的开放接口,本项目是这样做的当用户第一次使用软件时进行授权认证获取这3样东西的时候存储到sqlite库中以便用户下次使用时不需要重新进行繁琐的授权认证操作直接从sqlite库中读取出来即可,由于这样的需求载入页面的功能设定是这样:当用户打开软件显示载入页面时开始检查sqlite库中是否已经保存有用户的新浪微博的UserID号、AccessToken、AccessSecret的记录,如果一条记录都没有那就说明用户是第一次使用本软件那么跳到认证授权页面进行授权认证操作(认证授权功能在接下来的两篇中进行实现讲解)获取这3个值保存到sqlite库中,如果已经包括了记录,那么读取这些记录的UserID号、AccessToken、AccessSecret值然后根据这3个值调用新浪的api接口获取这些记录对应的用户昵称和用户头像图标等信息。

上面功能设定中涉及到sqlite数据库的创建、数据表的创建、数据记录的添加、数据记录的读取等操作,这里新建名为类文件提供sqlite数据表的创建、更新等。接下来新建名为类文件实现用户记录的创建、更新、删除等。完成上面的代码后,我们需要在载入页面中调用上面的方法实现sqlite库中是否已经保存有用户的新浪微博的UserID号、AccessToken、AccessSecret的记录的功能在MainActivity的onCreate。3.2OAuth授权认证图3-3OAuth授权认证图3-3OAuth授权认证示意图

本篇说说关于OAuth授权认证的事情,新浪开放api都必须在这个基础上才能调用,所以有必要专门来讲讲,前面的文章中已经提到过关于新浪微博提供了OAuth和BaseOAuth两种认证方式,并且本项目采用OAuth认证方式,至于为什么采用这个OAuth认证而不采用BaseOAuth认证原因很简单,自从Twitter只支持OAuth认证方式以来,各大应用都纷纷转向OAuth认证方式,而新浪微博的开放平台也将在近日停止BaseOAuth的认证方式。

OAuth的基本概念,OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此OAUTH是安全的。同样新浪微博提供OAuth认证也是为了保证用户账号和密码的安全,在这里通过OAuth建立普通新浪微博用户、客户端程序(我们正在开发的这个android客户端程序)、新浪微博三者之间的相互信任关系,让客户端程序(我们正在开发的这个android客户端程序)不需要知道用户的账号和密码也能浏览、发布微博,这样有效的保护了用户账号的安全性不需要把账号密码透露给客户端程序又达到了通过客户端程序写微博看微博目的。这个是OAuth的作用。

结合新浪微博的OAuth认证来说说具体的功能实现,首先罗列一下关键字组,下面四组关键字跟我们接下来OAuth认证有非常大的关系。

第一组:(AppKey和AppSecret),这组参数就是本系列文本第一篇提到的建一个新的应用获取AppKey和AppSecret。

第二组:(RequestToken和RequestSecret)

第三组:(oauth_verifier)

第四组:(user_id、AccessToken和AccessSecret)

新浪微博的OAuth认证过程,当用户第一次使用本客户端软件时,客户端程序用第一组作为参数向新浪微博发起请求,然后新浪微博经过验证后返回第二组参数给客户端软件同时表示新浪微博信任本客户端软件,当客户端软件获取第二组参数时作为参数引导用户浏览器跳至\o"新浪微博的授权页面"新浪微博的授权页面,然后用户在新浪的这个授权页面里输入自己的微博账号和密码进行授权,完成授权后根据客户端设定的回调地址把第三组参数返回给客户端软件并表示用户也信任本客户端软件,接下客户端软件把第二组参数和第三组参数作为参数再次向新浪微博发起请求,然后新浪微博返回第四组参数给客户端软件,第四组参数需要好好的保存起来这个就是用来代替用户的新浪账号和密码用的,在后面调用api时都需要。从这个过程来看用户只是在新浪微博的认证网页输入过账户和密码并没有在客户端软件里输入过账户和密码,客户端软件只保存了第四组数据并没有保存用户的账户和密码,这样有效的避免了账户和密码透露给新浪微博之外的第三方应用程序,保证了安全性。

本项目用为了方便开发采用了\o"oauth-signpost开源项目"oauth-signpost开源项目进行OAuth认证开发,新建OAuth.java类文件对OA进行简单的封装,OAuth类主要有RequestAccessToken、GetAccessToken、SignRequest三个方法,第一个方法RequestAccessToken就是上面过程中用来获取第三组参数用的,GetAccessToken方法是用来获取第四组参数用,SignRequest方法是用来调用api用。由于采用了oauth-signpost开源项目简单了很多。这样就完成了OAuth功能类的开发,后面都会用到这个类相关的方法。3.3用户授权页面3.3.1用户授权页面UI篇

上一篇讲了讲OAuth授权认证的事情,大概的介绍了OAuth的原理,并且完成了一个的类库,提供了几个OAuth认证必要的方法,本篇开始具体讲本项目的用户授权功能,用户授权页面是当用户第一次使用本软件的时候自动从载入页面跳转过来的显示的页面,涉及OAuth认证相关都是在上一篇的的类基础上开发。用户授权页面分为UI篇和功能篇两篇,本篇先来讲讲UI的实现,这次就不贴PS的效果图了直接贴实现后的功能截图如下:

图3-4UI实现图

看上面的图,其实这个页面的UI实现不复杂,重点来讲讲这个半透明的弹出对话框窗口是如何实现的,首先新建名为的Activity,并且在文件中添加这个Activity,这样这个Activity才能被使用,接下来为这个Activity新建名为的Layout,这个Layout很简单只负责logo小图标显示,背景部分和透明窗口都是有代码来实现。

完成Layout建立后在AuthorizeActivity的onCreate方法添加如下代码,设置为AuthorizeActivity的页面Layout:@Override

public

void

onCreate(Bundle

savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.authorize);

}

接下来是本节的重点部分,半透明弹窗用Dialog控件进行实现,首先为这个半透明弹窗新建一个名为的Layout,这个Layout主要是对4个元素进行布局,如图所示分别为i小图标、信息提示、中间文字、开始按钮,首先用LinearLayout对i小图标和信息提示进行水平布局,中间文字以一个TextView跟在下面,对于开始按钮是用RelativeLayout进行底部对齐显示。

完成了半透明弹窗的Layout定义接下来我们要做的就是为它写一个自定义样式来实现我们想要的显示效果,首先我们需准备一个圆角的半透明png图片名为并且添加到drawable中,接下来再res/values文件夹新建名为的resources样式文件。这个样式文件的说明如下parent="@android:style/Theme.Dialog"

:在系统Dialog样式基础上,相当于继承系统样式<itemname="android:windowFrame">@null</item>

:Dialog的windowFrame框为无<itemname="android:windowIsFloating">true</item>:是否浮现在activity之上<itemname="android:windowIsTranslucent">false</item>:是否半透明<itemname="android:windowNoTitle">true</item>:是否显示title<itemname="android:windowBackground">@drawable/dia_bg</item>:设置dialog的背景<itemname="android:backgroundDimEnabled">false</item>:

背景是否模糊显示

接下来写java代码把这个半透明弹窗显示出来,在AuthorizeActivity的onCreate方法添加如下代码:

View

diaView=View.inflate(this,

R.layout.dialog,

null);

dialog=new

Dialog(AuthorizeActivity.this,R.style.dialog);

dialog.setContentView(diaView);

dialog.show();

最后运行查看效果,到这里我们的任务已经完成了。3.3.2用户授权页面功能篇

图3-5用户授权页面的UI

在\o"上一篇"上一篇实现了用户授权页面的UI,如上图,接下来要做的就是在这个基础上完成功能部分真正实现用户的授权认证,这一篇是\o"android开发我的新浪微博客户端-OAuth篇(2.1)"android开发我的新浪微博客户端-OAuth篇(2.1)的具体应用篇原理就不多解释了不懂的看OAuth篇即可。认证过程从点击开始按钮然后跳转到新浪的授权页面,接着用户在新浪的页面里输入自己的账户和密码确定后返回用户授权页面。首先给开始按钮添加点击事件代码,代码中主要是调用我们前面\o"android开发我的新浪微博客户端-OAuth篇(2.1)"android开发我的新浪微博客户端-OAuth篇(2.1)完成的OAuth类的RequestAccessToken方法用来获取oauth_verifier,具体代码如下:ImageButton

stratBtn=(ImageButton)diaView.findViewById(R.id.btn_start);

stratBtn.setOnClickListener(new

OnClickListener(){

@Override

public

void

onClick(View

arg0)

{

auth=new

OAuth();

auth.RequestAccessToken(AuthorizeActivity.this,

CallBackUrl);

}

});

上面的代码中重点来说明一下

RequestAccessToken方法的第二参数CallBackUrl,这个参数是用户在新浪的页面中输入账户密码后完成认证后返回的地址,我这里是这样设置的orizeActivity",在中配置AuthorizeActivity添加如下配置把指向到AuthorizeActivity,这样当页面返回到AuthorizeActivity中就可以获取到传过来的oauth_verifier参数。<intent-filter>

<action

android:name="ent.action.VIEW"

/>

<category

android:name="ent.category.DEFAULT"

/>

<category

android:name="ent.category.BROWSABLE"

/>

<data

android:scheme="myapp"

android:host="AuthorizeActivity"

/>

</intent-filter>

再AuthorizeActivity如果来接收返回的oauth_verifier参数呢?接下来AuthorizeActivity添加如下方法:@Override

protected

void

onNewIntent(Intent

intent)

{

super.onNewIntent(intent);

//在这里处理获取返回的oauth_verifier参数

}

关于onNewIntent的说明是这样的,onCreate是用来创建一个Activity也就是创建一个窗体,但一个Activty处于任务栈的顶端,若再次调用startActivity去创建它,则不会再次创建。若你想利用已有的Acivity去处理别的Intent时,你就可以利用onNewIntent来处理。在onNewIntent里面就会获得新的Intent,在这里AuthorizeActivity是属于已有的Acivity,所以需要onNewIntent来处理接收返回的参数,获取oauth_verifier参数后OAuth还没有结束从"\o"android开发我的新浪微博客户端-OAuth篇(2.1)"OAuth篇描述来看还需要进行根据这个参数继续向新浪微博请求获取User_id、AccessToken和AccessSecret,在这里我把这些操作全部写在了GetAccessToken方法中。在onNewIntent添加如下代码:UserInfo

user=

auth.GetAccessToken(intent);

if(user!=null){

DataHelper

helper=new

DataHelper(this);

String

uid=user.getUserId();

if(helper.HaveUserInfo(uid))

{

helper.UpdateUserInfo(user);

Log.e("UserInfo",

"update");

}else

{

helper.SaveUserInfo(user);

Log.e("UserInfo",

"add");

}

}

通过上面的代码完成了User_id、AccessToken和AccessSecret

获取并且保存到了sqlite库中,这样就完成了用户的OAuth认证,当需要调用新浪的api时只需要去sqlite库中找该用户的User_id、AccessToken和AccessSecret

即可。登录页面3.4.1登陆页面UI篇

图3-6用户登陆首页

首先回顾一下功能流程当用户开启软件显示载入页面时程序首先去sqlite库查询是否已经保存有用户的新浪微博的UserID号、AccessToken、AccessSecret的记录如果没有一条记录那么跳转到用户授权功能页面,这个已经由上面两篇文章实现了,如果有记录那么页面跳转到用户登录页面,也就是本篇以及下篇要实现的功能,本篇讲UI的实现,本项目支持多微博账号了,也就是用户可以设置多个微博账号,登录的时候选择其中的一个登录,具体效果如上图,新建名LoginA的Activity并且在中进行相应配置,这个页面就是我们要实现的用户登录页面。

看上面的效果,首先页面分3部分实现,背景部分、底部菜单部分、用户选择以及头像显示部分,首先在res/layout的目录下新建名为的layout,然后根据页面显示要求编写如下的布局控制。

正对上面的的layout进行一下说明,背景部分前面已经讲过了这里也就不重复。

底部菜单实现,原本我是采用GridView实现的非常的方便但是后来由于显示位置不好控制改成了用RelativeLayout和LinearLayout嵌套的方式,实现的比较土但是达到了显示需求,首先是一个最外面的RelativeLayout目的是用来实现底部对齐显示,并且把这个RelativeLayout的背景设置为浅蓝色半透明的效果,关键这2行:android:layout_alignParentBottom="true"和android:background="#BB768e95"。然后是在RelativeLayout内部添加3个LinearLayout分别是用来显示添加账号、退出软件、删除账号3个功能按钮菜单,并且分别设置为左对齐、居中对齐、右对齐,3个LinearLayout都设置为垂直布局android:orientation="vertical",然后每LinearLayout添加相应的图片和文字。

用户选择以及头像显示部分,这块分成3小块,用来显示用户头像的ImageView、用来显示用户名字并且点击可以出现选择列表的EditText、用来点击进入当前选择用户首页的功能按钮ImageButton,这3小块的布局实现也是采用elativeLayout和LinearLayout相互嵌套配合的方式实现的具体参考。这里重点说说这个账号选择列表弹出窗口的实现,当点击下拉箭头按钮的时候弹出并显示,这个是用Dialog控件实现,首先准备好圆角的半透明背景图然后添加到res/drawable-mdpi文件夹下,接着自定义一个Dialog样式文件,在res/values目录下新建名为的resources文件,在用户授权验证页面的时候我们也自定义过类似的Dialog的样式,具体解释可以参考前面的户授权验证页面功能,接下来还需要定义选择列表的layout,新建名为的layout文件。完成了layout和样式文件的编写,接下来就是把样式文件和的列表layout用起来,当点击id为iconSelectBtn的ImageButton时显示用户选择窗口,在LoginActivity的onCreate方法中添加代码。到这里登录的UI部分就实现的差不多了,剩下的都是一些功能部分代码用来实现从sqlite中账号列表的获取,以及点击选择等交互操作等。登录页面功能篇上一篇中完成了如上图的UI部分的实现,现在继续来讲功能的实现,用户登录操作主要就是账号列表显示和选择账号登录两个功能其他的都是些简单的辅助功能,首先是点击id为iconSelectBtn的ImageButton时显示用户选择窗口,这个时候去数据库中获取账号记录然后在选择窗口中以列表方式显示出来,通过上一篇已经知道Id为list的ListView控件来显示账号列表,首先是从数据库中获取所有的账户记录然后设置默认选中的用户账号。这个initUser()

初始账号的方法在LoginActivity的onCreate中调用,主要完成两件事情,第一件获取通过userList

=

dbHelper.GetUserList(false);获取所有的账户记录,关于DataHelper前面已经有说过了,如果获取的用户记录为空那么就跳转到用户授权功能页面让用户添加账号,如果不为空那么通过SharedPreferences去读取用户上一次选择的账号名称,如果没有或者数据库里账号记录不包括这个账户名称那么默认显示记录的第一个账号和头像,如果有那么显示这个账户的名称和头像。关于SharedPreferences,是android提供给开发者用来存储一些简单的数据用的,非常方便类似于网站的Cookie,在这里我就是用这个来保存上一次用户选择的是哪个账号,非常实用。

接下类首先为Id为list的ListView控件准备数据Adapter,这个Adapter非常简单就是普通的adapter继承BaseAdapter即可。接下就是为这个ListView设定数据源Adapter,在账号选择窗口显示的时候进行设置,添加到id为iconSelectBtn的ImageButton的OnClickListener中。通过上面代码完成了账号选择的功能,接下来给id为login的ImageButton添加OnClickListener,使得点击后以当前选择账号进入微博首页,在上面的GoHome方法中ConfigHelper.nowUser是类型为UserInfo的static类型用来保存当前登录账号的信息,替代web中session使用。最后添加如下方法,用来当这个登录LoginActivity结束的时候保存当前选择的账户名称到SharedPreferences中,以便帮用户记住登录账号的功能,就是前面的initUser()

初始账号的方法中会获取保存在SharedPreferences中的账户名称代码如下:@Override

protected

void

onStop()

{

//获得SharedPreferences对象

SharedPreferences

MyPreferences

=

getSharedPreferences(Select_Name,

Activity.MODE_PRIVATE);

//获得对象

SharedPreferences.Editor

editor

=

MyPreferences.edit();

//保存组件中的值

editor.putString("name",

iconSelect.getText().toString());

editormit();

super.onStop();

}用户首页面3.5.1用户首页面UI篇

图3-7用户首页

在前篇完成了用户登录功能后开始用户首页的开发,用户的首页主要的内容是当前登录用户关注的微博列表,本篇先来讲讲UI的实现,效果如上图,整个页面分为上、中、下三部分,上面部分是工具条,显示当前登录用户的昵称以及写微博、刷新两个功能按钮;中间部分是当前用户关注的最新微博列表,下面部分是功能切换栏,用来进行各个功能之间的切换。

首先新建名为的Activity作为用户首页,然后在res/layout目录下新建名为的Layout。

这个布局首先是一个竖直的根LinearLayout,在这个根LinearLayout里面分别是两个RelativeLayout,第一个RelativeLayout

用来显示页面的工具条,第二个RelativeLayout用来显示列表以及底部的功能栏,特别主要在这第二个RelativeLayout中有一个id为loadingLayout的LinearLayout是用来显示数据载入中的动画,它的android:visibility属性为invisible(也可以设置成gone,区别:invisible这个View在ViewGroupt中仍保留它的位置,不重新layout

gone>不可见,但这个View在ViewGroupt中不保留位置,重新layout,那后面的view就会取代他的位置。

),也就是一开始不显示的意思,接下来看看<ProgressBar android:id="@+id/loading"

android:layout_width="31px"

android:layout_height="31px" android:layout_gravity="center" style="@style/progressStyle"></ProgressBar>

这个ProgressBar控件就是用来显示动画用的,关键就是

style="@style/progressStyle",在res/values目录下新建名为,内容如下:<?xml

version="1.0"

encoding="UTF-8"?>

<resources>

<style

name="progressStyle"

width="38"

height="38"

parent="@android:style/Widget.ProgressBar.Small">

<item

name="android:indeterminateDrawable">@anim/loading</item>

</style>

</resources>

接着准备好,八张不同的小图片分别代表每旋转45度图片,八张刚好是360度。把这些图片添加到res/drawable-mdpi目录中。然后在res/anim目录下新建名为动画文件,内容如下:<?xml

version="1.0"

encoding="UTF-8"?>

<animation-list

android:oneshot="false"

xmlns:android="://schemas.android/apk/res/android">

<item

android:duration="200"

android:drawable="@drawable/r1"

/>

<item

android:duration="200"

android:drawable="@drawable/r2"

/>

<item

android:duration="200"

android:drawable="@drawable/r3"

/>

<item

android:duration="200"

android:drawable="@drawable/r4"

/>

<item

android:duration="200"

android:drawable="@drawable/r5"

/>

<item

android:duration="200"

android:drawable="@drawable/r6"

/>

<item

android:duration="200"

android:drawable="@drawable/r7"

/>

<item

android:duration="200"

android:drawable="@drawable/r8"

/>

</animation-list>用户首页面功能篇本篇接下来讲功能部分的实现,本页面主要的功能就用户关注的最新微博列表,从上一篇中知道本列表是用ID为Msglist的ListView控件来实现,本篇的主要就讲解如果获取微博列表数据给这个ListView提供显示数据。ListView每一条子数据分别由用户头像、用户昵称、发布时间、是否包含照片、微博内容这五部分组成,根据这五部分定义一个名为实体类。然后在res/layout目录下新建名为的Layout用来控制ListView子项的显示部件,接下来为列表控件定义一个数据Adapter,这个Adapter实现没有什么特别的很普通,不过这个中使用了AsyncImageLoader的方法,这个是用来实现用户头像图标的异步载入显示,这样能提高列表显示的速度,提高用户体验,完成上述的工作后,接下来就是显示微薄列表,在HomeActivity的onCreate方法中调用loadList();上面的loadList()

方法通过新浪Api接口获取当前登录用户及其所关注用户的最新微博消息,然后显示到列表中。3.6阅读微博3.6.1阅读微博UI篇

图3-8阅读微博

上一篇完成了微博列表的功能,本篇接着做预读微博的功能,本篇主要讲讲UI部分的实现,最终实现的效果如上图所示。整个显示页面从上往下分为四部分,第一部分顶部工具条、第二部分作者头像和名称、第三部分微博正文、第四部分功能按钮区。新建名为作为阅读微博的页面,再res/layout目录下新建名为的Layout,上面这个布局实现起来并不复杂,主要看看功能按钮区的4个按钮的点击上去的切换背景的效果,以关注按钮为例子看这行设置,android:background="@drawable/lt_selector",在res/drawable-mdpi目录下新建名为用来实现点击上去切换图片的效果,本篇虽然看layout文件非常的长,其实仔细看看非常的简单了没有什么难和复杂的了,就是按照前面的经验控制好图片以及控件的显示位置和样式即可,本篇中用了一个ScrollView控件这个是前面没有用到过的,主要是用来当微博的内容超出显示区域的时候出现滚动条用的这个非常容易使用阅读微博功能篇在上面一篇中已经实现了预读微博的UI界面,效果如上图,接下来完成功能部分的代码,当用户在上一个列表界面的列表中点击某一条微博的时候显示这个阅读微博的界面,在这个界面中根据传来的微博ID,然后根据这个ID通过api获取微博的具体内容进行显示。

接下来就是view方法具体获取微博内容的方法,在这个方法中如果获取的本条微博如果包含图片那么就用前面AsyncImageLoader的方法异步载入图片并且进行显示,同时在这个方法中还要获取本条微博被转发的次数以及评论的次数,

在上面的方法中对于微博中包含的图片显示尺寸进行了特别的处理,如果直接把获取的图片显示在ImageView中,因为当图片宽高超过屏幕的时候,系统会自动按照的屏幕按比例缩放图片进行显示,但是我发现一个现象图片的高虽然是按照比例缩小了,但是图片占据的高仍旧是原来图片的高度照成真实图片和文字内容之间多了很高的一块空白,这个现象非常的奇怪,所以我写了如下方法进行处理:private

void

showImg(ImageView

view,Drawable

img){

int

w=img.getIntrinsicWidth();

int

h=img.getIntrinsicHeight();

Log.e("w",

w+"/"+h);

if(w>3

温馨提示

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

评论

0/150

提交评论