android开发新浪微博客户端+完整攻略.docx

上传人:b****8 文档编号:9258514 上传时间:2023-02-03 格式:DOCX 页数:115 大小:1.30MB
下载 相关 举报
android开发新浪微博客户端+完整攻略.docx_第1页
第1页 / 共115页
android开发新浪微博客户端+完整攻略.docx_第2页
第2页 / 共115页
android开发新浪微博客户端+完整攻略.docx_第3页
第3页 / 共115页
android开发新浪微博客户端+完整攻略.docx_第4页
第4页 / 共115页
android开发新浪微博客户端+完整攻略.docx_第5页
第5页 / 共115页
点击查看更多>>
下载资源
资源描述

android开发新浪微博客户端+完整攻略.docx

《android开发新浪微博客户端+完整攻略.docx》由会员分享,可在线阅读,更多相关《android开发新浪微博客户端+完整攻略.docx(115页珍藏版)》请在冰豆网上搜索。

android开发新浪微博客户端+完整攻略.docx

android开发新浪微博客户端+完整攻略

特别鸣谢本文作者:

水的右边为android初学者和新手带来如此详细和精彩的文章

另:

不要看本文长,耐心看下来会有很大收获。

还:

有些人可能说,版主转帖不能证明实力,我只能说精力和能力有限。

不过黄色网站的版主也不会去自己拍A篇吧    -----呵呵纯粹搞笑  废话不多说看帖吧!

android开发我的新浪微博客户端-开篇

  开始接触学习android已经有3个礼拜了,一直都是对着android的sdk文档写Tutorials从HelloWorld到NotepadTutorial算是初步入门了吧,刚好最近对微博感兴趣就打算开发个android版本的新浪微博客户端作为练手项目,并且以随笔的方式详细的记录开发的全过程。

本人对java语言以及eclipseIde都是初次应用基本上属于边学边用,做移动设备上的东西也是第一次,总的来说属于无基础、无经验、无天赋的纯三无人员,还请广大同学们多多给予指点。

  开发第一件事情,那就是开发工具以及环境,我的配置是EclipseHelios(3.6.1)+Adroid2.2,具体的环境搭建我就不罗嗦了,google一下一大堆,光博客园里都能搜到很多篇了。

  开发第二件事情,既然是开发新浪的微博客户端,那就先去新浪申请微博账号然后登陆后到新浪的开放平台,新浪的开放平台提供的新浪微博对外的api接口,在我的应用中创建一个新的应用获取AppKey和AppSecret,这2个值后面会有用到先记录下来。

在新浪的开放平台中提供了开发文档、SDK、接口测试工具等,本人决定直接通过新浪的RestApi进行开发并不打算使用新浪提供的SDK,据说新浪提供的java版的SDK并不能直接用来进行android的开发需要进行一定的修改才能使用,只是听说我没有试过不一定准确。

  最后在说一下,我准备分为UI和功能两部分分别进行说明讲解,据我自己的情况大部分的时间都花在的UI的设计和实现上了,编码倒反而工作量小多了,所以特别把UI部分分出来讲。

  最后还要在说一下,很抱歉上面内容基本上属于废话没有什么实质内容了但是既然是第一篇还是得象征性的交代一下,从下篇开始讲具体的内容。

android开发我的新浪微博客户端-载入页面UI篇(1.1)

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

2011-3-3115:

38上传

下载附件(131.9KB)

  一、接下来的任务就是在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文件夹下新建main.xml文件,这个layout采用LinearLayout控件作为顶层控件,然后用ImageView控件分别实现版本号图片顶部靠左对齐显示、软件名称和图标图片居中对齐、作者名称和blog图片底部靠右对齐。

注意在版本号图片显示ImageView控件下面添加一个RelativeLayout控件作为软件名称和图标图片ImageVIew和作者名称和blog图片ImageView的父控件用来控制居中对齐已经底部对齐的实现,具体代码如下:

代码

1.

xmlversion="1.0"encoding="utf-8"?

>

2.

android="

3.android:

id="@+id/layout"

4.android:

orientation="vertical"

5.android:

layout_width="fill_parent"

6.android:

layout_height="fill_parent">

7.

8.android:

layout_width="wrap_content"

9.android:

layout_height="wrap_content"

10.android:

src="@drawable/ver"

11.android:

layout_marginTop="15dip"

12.android:

layout_marginLeft="15dip">

13.

14.

15.android:

layout_width="fill_parent"

16.android:

layout_height="fill_parent">

17.

18.android:

layout_width="wrap_content"

19.android:

layout_height="wrap_content"

20.android:

src="@drawable/logo"

21.android:

layout_centerInParent="true">

22.

23.

24.

25.android:

layout_width="wrap_content"

26.android:

layout_height="wrap_content"

27.android:

src="@drawable/dev"

28.android:

layout_alignParentBottom="true"

29.android:

layout_alignParentRight="true"

30.android:

layout_marginRight="5dip"

31.android:

layout_marginBottom="35dip">

32.

33.

34.

复制代码

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

1.publicvoidonCreate(BundlesavedInstanceState){

2.super.onCreate(savedInstanceState);

3.setContentView(R.layout.main);

4.}

复制代码

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

1.//获取屏幕方向

2.publicstaticintScreenOrient(Activityactivity)

3.{

4.intorient=activity.getRequestedOrientation();

5.if(orient!

=ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE&&orient!

=ActivityInfo.SCREEN_ORIENTATION_PORTRAIT){

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

7.WindowManagerwindowManager=activity.getWindowManager();

8.Displaydisplay=windowManager.getDefaultDisplay();

9.intscreenWidth=display.getWidth();

10.intscreenHeight=display.getHeight();

11.orient=screenWidth

ActivityInfo.SCREEN_ORIENTATION_PORTRAIT:

ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;

12.}

13.returnorient;

14.}

复制代码

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

1.publicstaticvoidAutoBackground(Activityactivity,Viewview,intBackground_v,intBackground_h)

2.{

3.intorient=ScreenOrient(activity);

4.if(orient==ActivityInfo.SCREEN_ORIENTATION_PORTRAIT){//纵向

5.view.setBackgroundResource(Background_v);

6.}else{//横向

7.view.setBackgroundResource(Background_h);

8.}

9.}

复制代码

  完成上述两方法后在MainActivity的onCreate方法中调用AutoBackground方法进行屏幕自动切换:

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

2.//背景自动适应

3.AndroidHelper.AutoBackground(this,layout,R.drawable.bg_v,R.drawable.bg_h);

复制代码

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

2011-3-3115:

47上传

下载附件(94.6KB)

2011-3-3115:

47上传

下载附件(97.9KB)

android开发我的新浪微博客户端-载入页面sqlite篇(1.2)

  通过上一篇文章(android开发我的新浪微博客户端-载入页面UI篇(1.1))已经完成了载入页面的UI部分的实现,效果如上图,接下来在上面的基础上完成载入页面的功能代码。

2011-3-3115:

51上传

下载附件(94.6KB)

  首先说明一下新浪微博提供了OAuth和BaseOAuth两种认证方式(如果不知道什么是OAuth和BaseOAuth请自己google一下恶补,同时接下来的2篇随笔也会对这方面进行详细的说明以及具体实现),本项目是采用OAuth认证方式,采用这种方式就需要有用户的新浪UserID、AccessToken、AccessSecret这3样东西才能自由便利的调用新浪的开放接口,本项目是这样做的当用户第一次使用软件时进行授权认证获取这3样东西的时候存储到sqlite库中以便用户下次使用时不需要重新进行繁琐的授权认证操作直接从sqlite库中读取出来即可,由于这样的需求载入页面的功能设定是这样:

当用户打开软件显示载入页面时开始检查sqlite库中是否已经保存有用户的新浪微博的UserID号、AccessToken、AccessSecret的记录,如果一条记录都没有那就说明用户是第一次使用本软件那么跳到认证授权页面进行授权认证操作(认证授权功能在接下来的两篇中进行实现讲解)获取这3个值保存到sqlite库中,如果已经包括了记录,那么读取这些记录的UserID号、AccessToken、AccessSecret值然后根据这3个值调用新浪的api接口获取这些记录对应的用户昵称和用户头像图标等信息。

  上面功能设定中涉及到sqlite数据库的创建、数据表的创建、数据记录的添加、数据记录的读取等操作,这里新建名为SqliteHelper.java类文件提供sqlite数据表的创建、更新等,代码如下:

1.publicclassSqliteHelperextendsSQLiteOpenHelper{

2.//用来保存

3.UserID、AccessToken、AccessSecret

4.的表名

5.publicstaticfinalStringTB_NAME="users";

6.publicSqliteHelper(Contextcontext,Stringname,CursorFactoryfactory,intversion){

7.super(context,name,factory,version);

8.}

9.//创建表

10.@Override

11.publicvoidonCreate(SQLiteDatabasedb){

12.db.execSQL("CREATETABLEIFNOTEXISTS"+

13.TB_NAME+"("+

14.UserInfo.ID+"integerprimarykey,"+

15.UserInfo.USERID+"varchar,"+

16.UserInfo.TOKEN+"varchar,"+

17.UserInfo.TOKENSECRET+"varchar,"+

18.UserInfo.USERNAME+"varchar,"+

19.UserInfo.USERICON+"blob"+

20.")"

21.);

22.Log.e("Database","onCreate");

23.}

24.//更新表

25.@Override

26.publicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){

27.db.execSQL("DROPTABLEIFEXISTS"+TB_NAME);

28.onCreate(db);

29.Log.e("Database","onUpgrade");

30.}

31.//更新列

32.publicvoidupdateColumn(SQLiteDatabasedb,StringoldColumn,StringnewColumn,StringtypeColumn){

33.try{

34.db.execSQL("ALTERTABLE"+

35.TB_NAME+"CHANGE"+

36.oldColumn+""+newColumn+

37.""+typeColumn

38.);

39.}catch(Exceptione){

40.e.printStackTrace();

41.}

42.}

43.}

复制代码

  接下来新建名为DataHelper.java类文件实现用户记录的创建、更新、删除等,代码如下:

1.publicclassDataHelper{

2.//数据库名称

3.privatestaticStringDB_NAME="mysinaweibo.db";

4.//数据库版本

5.privatestaticintDB_VERSION=2;

6.privateSQLiteDatabasedb;

7.privateSqliteHelperdbHelper;

8.

9.publicDataHelper(Contextcontext){

10.dbHelper=newSqliteHelper(context,DB_NAME,null,DB_VERSION);

11.db=dbHelper.getWritableDatabase();

12.}

13.

14.publicvoidClose()

15.{

16.db.close();

17.dbHelper.close();

18.}

19.//获取users表中的UserID、AccessToken、AccessSecret的记录

20.publicListGetUserList(BooleanisSimple)

21.{

22.ListuserList=newArrayList();

23.Cursorcursor=db.query(SqliteHelper.TB_NAME,null,null,null,null,null,UserInfo.ID+"DESC");

24.cursor.moveToFirst();

25.while(!

cursor.isAfterLast()&&(cursor.getString

(1)!

=null)){

26.UserInfouser=newUserInfo();

27.user.setId(cursor.getString(0));

28.user.setUserId(cursor.getString

(1));

29.user.setToken(cursor.getString

(2));

30.user.setTokenSecret(cursor.getString(3));

31.if(!

isSimple){

32.user.setUserName(cursor.getString(4));

33.ByteArrayInputStreamstream=newByteArrayInputStream(cursor.getBlob(5));

34.Drawableicon=Drawable.createFromStream(stream,"image");

35.user.setUserIcon(icon);

36.}

37.userList.add(user);

38.cursor.moveToNext();

39.}

40.cursor.close();

41.returnuserList;

42.}

43.

44.//判断users表中的是否包含某个UserID的记录

45.publicBooleanHaveUserInfo(StringUserId)

46.{

47.Booleanb=false;

48.Cursorcursor=db.query(SqliteHelper.TB_NAME,null,UserInfo.USERID+"="+UserId,null,null,null,null);

49.b=cursor.moveToFirst();

50.Log.e("HaveUserInfo",b.toString());

51.cursor.close();

52.returnb;

53.}

54.

55.//更新users表的记录,根据UserId更新用户昵称和用户图标

56.publicintUpdateUserInfo(StringuserName,BitmapuserIcon,StringUserId)

57.{

58.ContentValuesvalues=newContentValues();

59.values.put(UserInfo.USERNAME,userName);

60.//BLOB类型

61.finalByteArrayOutputStreamos=newByteArrayOutputStream();

62.//将Bitmap压缩成PNG编码,质量为100%存储

63.userIpress(Bitmap.CompressFormat.PNG,100,os);

64.//构造SQLite的Content对象,这里也可以使用raw

65.values.put(UserInfo.USERICON,os.toByteArray());

66.intid=db.update(SqliteHelper.TB_NAME,values,UserInfo.USERID+"="+UserId,null);

67.Log.e("UpdateUserInfo2",id+"");

68.returnid;

69.}

70.

71.//更新users表的记录

72.publicintUpdateUserInfo(UserInfouser)

73.{

74.ContentValuesvalues=newContentValues();

75.values.put(UserInfo.USERID,user.getUserId());

76.values.put(UserInfo.TOKEN,user.getToken());

77.values.put(UserInfo.TOKENSECRET,user.getTokenSecret());

78.intid=db.update(SqliteHelper.TB_NAME,values,UserInfo.USERID+"="+user.getUserId(),null);

79.Log.e("UpdateUserInfo",id+"");

80.returnid;

81.}

82.

83.//添加users表的记录

84.publicLongSaveUserInfo(UserInfouser)

85.{

86.ContentValuesvalues=newCont

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1