1、android开发新浪微博客户端+完整攻略特别鸣谢本文作者:水的右边为android初学者和新手带来如此详细和精彩的文章另:不要看本文长,耐心看下来会有很大收获。还:有些人可能说,版主转帖不能证明实力,我只能说精力和能力有限。不过黄色网站的版主也不会去自己拍A篇吧 - 呵呵纯粹搞笑废话不多说 看帖吧!android开发我的新浪微博客户端-开篇 开始接触学习android已经有3个礼拜了,一直都是对着android的sdk文档写Tutorials从Hello World到Notepad Tutorial算是初步入门了吧,刚好最近对微博感兴趣就打算开发个android版本的新浪微博客户端作为练手项
2、目,并且以随笔的方式详细的记录开发的全过程。本人对java语言以及eclipse Ide都是初次应用基本上属于边学边用,做移动设备上的东西也是第一次,总的来说属于无基础、无经验、无天赋的纯三无人员,还请广大同学们多多给予指点。开发第一件事情,那就是开发工具以及环境,我的配置是Eclipse Helios (3.6.1) + Adroid2.2,具体的环境搭建我就不罗嗦了,google一下一大堆,光博客园里都能搜到很多篇了。开发第二件事情,既然是开发新浪的微博客户端,那就先去新浪申请微博账号然后登陆后到新浪的开放平台,新浪的开放平台提供的新浪微博对外的api接口,在我的应用中创建一个新的应用获取
3、App Key和App Secret,这2个值后面会有用到先记录下来。在新浪的开放平台中提供了开发文档、SDK、接口测试工具等,本人决定直接通过新浪的Rest Api进行开发并不打算使用新浪提供的SDK,据说新浪提供的java版的SDK并不能直接用来进行android的开发需要进行一定的修改才能使用,只是听说我没有试过不一定准确。最后在说一下,我准备分为UI和功能两部分分别进行说明讲解,据我自己的情况大部分的时间都花在的UI的设计和实现上了,编码倒反而工作量小多了,所以特别把UI部分分出来讲。最后还要在说一下,很抱歉上面内容基本上属于废话没有什么实质内容了但是既然是第一篇还是得象征性的交代一下
4、,从下篇开始讲具体的内容。android开发我的新浪微博客户端-载入页面UI篇(1.1)本软件设定用户第一个接触到的功能就是页面载入等待功能,这个功能对使用者来说就是一个持续1、2秒钟的等待页面,在用户等待的同时程序做一些必要的检查以及数据准备工作,载入页面分为UI篇和功能篇,从表及里首先是UI的实现,一个软件除功能之外还得有一个光鲜的外表也是非常重要的,尽管本人设计水平一般但是还是亲自操刀用ps先做了一下设计效果图如下:2011-3-31 15:38 上传下载附件 (131.9 KB) 一、接下来的任务就是在android中实现这样的效果显示,从这个效果的设计分别把图片分成背景、版本号部分、
5、软件名称和图标、作者名称和blog四个部分,按照这样的思路把分别生成4张png的图片,背景部分考虑实现横屏和竖屏切换额外添加一张横屏背景图,然后新建android工程,我这里的名称为MySinaWeibo,android版本勾选2.2,并且创建名为MainActivity的Activity作为整个软件的起始页面,然后把上面的这些图片保存到项目的res/drawable-mdpi文件夹下,关于res目录下的drawable-mdpi、drawable-ldpi,、drawable-hdpi三个文件夹的区别,mdpi 里面主要放中等分辨率的图片,如HVGA (320x480)。ldpi里面主要放低
6、分辨率的图片,如QVGA (240x320)。hdpi里面主要放高分辨率的图片,如WVGA (480x800),FWVGA (480x854)。android系统会根据机器的分辨率来分别到这几个文件夹里面去找对应的图片,在开发程序时为了兼容不同平台不同屏幕,建议各自文件夹根据需求均存放不同版本图片,我这里就不进行这么多的考虑了。二、完成图片资源的准备后接下就是layout文件的编写, 在res/layout文件夹下新建main.xml文件,这个layout采用LinearLayout控件作为顶层控件,然后用ImageView控件分别实现版本号图片顶部靠左对齐显示、软件名称和图标图片居中对齐、作
7、者名称和blog图片底部靠右对齐。注意在版本号图片显示ImageView控件下面添加一个RelativeLayout控件作为软件名称和图标图片ImageVIew和作者名称和blog图片ImageView的父控件用来控制居中对齐已经底部对齐的实现,具体代码如下:代码1. 2. 7. 13. 14. 17. 22. 23. 24. 32. 33. 34. 复制代码三、在ec打开名为MainActivity的Activity源代码文件进行编辑,onCreate部分代码如下:1. public void onCreate(Bundle savedInstanceState) 2. super.onCr
8、eate(savedInstanceState);3. setContentView(R.layout.main);4. 复制代码然后运行项目可以在模拟器中显示,上面的几个图片都按照设计的位置和效果进行显示只是整个页面的背景还是黑色的,接下来就是背景部分的显示实现,由于为了实现横竖屏切换显示,背景图的显示采用代码进行控制显示,首先用如下方法获取当前手机是横屏还是竖屏:1. /获取屏幕方向2. public static int ScreenOrient(Activity activity)3. 4. int orient = activity.getRequestedOrientation()
9、; 5. if(orient != ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE & orient != ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) 6. /宽高为横屏,反正为竖屏 7. WindowManager windowManager = activity.getWindowManager(); 8. Display display = windowManager.getDefaultDisplay(); 9. int screenWidth = display.getWidth(); 10. int scr
10、eenHeight = display.getHeight(); 11. orient = screenWidth screenHeight ? ActivityInfo.SCREEN_ORIENTATION_PORTRAIT : ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;12. 13. return orient;14. 复制代码然后编写一个名为AutoBackground的公共方法用来实现屏幕背景的自动切换,后面的几乎每一个功能页面都需要用到这个方法1. public static void AutoBackground(Activity acti
11、vity,View view,int Background_v, int Background_h)2. 3. int orient=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方法中调用Aut
12、oBackground方法进行屏幕自动切换:1. LinearLayout layout=(LinearLayout)findViewById(R.id.layout);2. /背景自动适应3. AndroidHelper.AutoBackground(this, layout, R.drawable.bg_v, R.drawable.bg_h);复制代码到此完成了载入页面的UI部分的实现,测试运行模拟器中查看效果,基本上跟最上面的设计效果图相符,测试效果图如下:2011-3-31 15:47 上传下载附件 (94.6 KB) 2011-3-31 15:47 上传下载附件 (97.9 KB)
13、android开发我的新浪微博客户端-载入页面sqlite篇(1.2)通过上一篇文章(android开发我的新浪微博客户端-载入页面UI篇(1.1))已经完成了载入页面的UI部分的实现,效果如上图,接下来在上面的基础上完成载入页面的功能代码。2011-3-31 15:51 上传下载附件 (94.6 KB) 首先说明一下新浪微博提供了OAuth和Base OAuth两种认证方式(如果不知道什么是OAuth和Base OAuth请自己google一下恶补,同时接下来的2篇随笔也会对这方面进行详细的说明以及具体实现),本项目是采用OAuth认证方式,采用这种方式就需要有用户的新浪UserID、Acc
14、ess Token、Access Secret这3样东西才能自由便利的调用新浪的开放接口,本项目是这样做的当用户第一次使用软件时进行授权认证获取这3样东西的时候存储到sqlite库中以便用户下次使用时不需要重新进行繁琐的授权认证操作直接从sqlite库中读取出来即可,由于这样的需求载入页面的功能设定是这样:当用户打开软件显示载入页面时开始检查sqlite库中是否已经保存有用户的新浪微博的UserID号、Access Token、Access Secret的记录,如果一条记录都没有那就说明用户是第一次使用本软件那么跳到认证授权页面进行授权认证操作(认证授权功能在接下来的两篇中进行实现讲解)获取这
15、3个值保存到sqlite库中,如果已经包括了记录,那么读取这些记录的UserID号、Access Token、Access Secret值然后根据这3个值调用新浪的api接口获取这些记录对应的用户昵称和用户头像图标等信息。上面功能设定中涉及到sqlite数据库的创建、数据表的创建、数据记录的添加、数据记录的读取等操作,这里新建名为SqliteHelper.java类文件提供sqlite数据表的创建、更新等,代码如下:1. public class SqliteHelper extends SQLiteOpenHelper2. /用来保存 3. UserID、Access Token、Acces
16、s Secret4. 的表名5. public static final String TB_NAME=users;6. public SqliteHelper(Context context, String name, CursorFactory factory, int version) 7. super(context, name, factory, version);8. 9. /创建表10. Override11. public void onCreate(SQLiteDatabase db) 12. db.execSQL(CREATE TABLE IF NOT EXISTS +13
17、. TB_NAME+(+14. UserInfo.ID+ integer primary key,+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. Override26. public void onUpgrade(SQLite
18、Database db, int oldVersion, int newVersion) 27. db.execSQL(DROP TABLE IF EXISTS + TB_NAME);28. onCreate(db);29. Log.e(Database,onUpgrade);30. 31. /更新列32. public void updateColumn(SQLiteDatabase db, String oldColumn, String newColumn, String typeColumn)33. try34. db.execSQL(ALTER TABLE +35. TB_NAME
19、+ CHANGE +36. oldColumn + + newColumn +37. + typeColumn38. );39. catch(Exception e)40. e.printStackTrace();41. 42. 43. 复制代码接下来新建名为DataHelper.java类文件实现用户记录的创建、更新、删除等,代码如下:1. public class DataHelper 2. /数据库名称3. private static String DB_NAME = mysinaweibo.db;4. /数据库版本5. private static int DB_VERSION =
20、2;6. private SQLiteDatabase db;7. private SqliteHelper dbHelper;8. 9. public DataHelper(Context context)10. dbHelper=new SqliteHelper(context,DB_NAME, null, DB_VERSION);11. db= dbHelper.getWritableDatabase();12. 13. 14. public void Close()15. 16. db.close();17. dbHelper.close();18. 19. /获取users表中的Us
21、erID、Access Token、Access Secret的记录20. public List GetUserList(Boolean isSimple)21. 22. List userList = new ArrayList();23. Cursor cursor=db.query(SqliteHelper.TB_NAME, null, null, null, null, null, UserInfo.ID+ DESC);24. cursor.moveToFirst();25. while(!cursor.isAfterLast()& (cursor.getString(1)!=nul
22、l)26. UserInfo user=new UserInfo();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. ByteArrayInputStream stream = new ByteArrayInpu
23、tStream(cursor.getBlob(5); 34. Drawable icon= Drawable.createFromStream(stream, image);35. user.setUserIcon(icon);36. 37. userList.add(user);38. cursor.moveToNext();39. 40. cursor.close();41. return userList;42. 43. 44. /判断users表中的是否包含某个UserID的记录45. public Boolean HaveUserInfo(String UserId)46. 47.
24、Boolean b=false;48. Cursor cursor=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. return b;53. 54. 55. /更新users表的记录,根据UserId更新用户昵称和用户图标56. public int UpdateUserInfo(String
25、userName,Bitmap userIcon,String UserId)57. 58. ContentValues values = new ContentValues();59. values.put(UserInfo.USERNAME, userName);60. / BLOB类型 61. final ByteArrayOutputStream os = new ByteArrayOutputStream(); 62. / 将Bitmap压缩成PNG编码,质量为100%存储 63. userIpress(Bitmap.CompressFormat.PNG, 100, os); 64.
26、 / 构造SQLite的Content对象,这里也可以使用raw 65. values.put(UserInfo.USERICON, os.toByteArray();66. int id= db.update(SqliteHelper.TB_NAME, values, UserInfo.USERID + = + UserId, null);67. Log.e(UpdateUserInfo2,id+);68. return id;69. 70. 71. /更新users表的记录72. public int UpdateUserInfo(UserInfo user)73. 74. Content
27、Values values = new ContentValues();75. values.put(UserInfo.USERID, user.getUserId();76. values.put(UserInfo.TOKEN, user.getToken();77. values.put(UserInfo.TOKENSECRET, user.getTokenSecret();78. int id= db.update(SqliteHelper.TB_NAME, values, UserInfo.USERID + = + user.getUserId(), null);79. Log.e(UpdateUserInfo,id+);80. return id;81. 82. 83. /添加users表的记录84. public Long SaveUserInfo(UserInfo user)85. 86. ContentValues values = new Cont
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1