Android新浪微博客户端(四)——添加多个账户及认证
原文出自:方杰| http://fangjie.info/?p=75转载请注明出处
二.获取用户信息并保存数据库
上面说到加载AuthActivity有两种情况,其中一种就是授权成功回调,在授权回调成功后我们就开始通过微博API获取用户信息了,然后保存数据库了。这一系列操作我采用主框架模式,将任务发送给MainService来处理。
对于这个任务的具体处理过程,先通过token获取UID,再通过UID获取UserInfo。UserInfo中值得注意的是UserIcon是Bitmap类型的,这里涉及到一个通过url获取Bitmap的方法,这里就不细讲了。
MainService.java中的doTask方法:
public void doTask(Task task) { Message msg=handler.obtainMessage(); msg.what=task.getTaskID(); switch(task.getTaskID()) { //登录操作 case Task.WEIBO_LOGIN: break; //通过access_token获取用户信息,并保存到数据库操作 case Task.GET_USERINFO_BY_TOKEN: { Oauth2AccessToken access_token=(Oauth2AccessToken)task.getParams().get("token"); Log.i("OUTPUT", "access_token:"+access_token.getToken()); /** * 步骤一:用授权码来获取用户Uid */ //请求获取uid String uid=""; GetUserInfo.reqUID(access_token); //获取uid do{ uid=GetUserInfo.getUID(); }while(uid.equals("")); /** * 步骤二:通过uid,token获取UserInfo */ //请求获取用户信息 long _uid=Long.parseLong(uid); UserInfo user=new UserInfo(); GetUserInfo.reqUserInfo(access_token, _uid); //获取UserInfo do{ user=GetUserInfo.getUserInfo(); }while(user.getUserName().equals("")); user.setUserId(uid); //Log.i("OUTPUT","username:"+user.getUserName()+"userid+"+user.getUserId()+"usericon"+user.getUserIcon()); /** * 步骤三:把UserInfo的数据保存到数据库总 */ //创建数据库 DBUserInfo db=new DBUserInfo(getActivityByName("AuthActivity")); //如果该数据不存在数据库中 if(db.getUserInfoByUserId(uid)==null) { //插入 db.insertUserInfo(user); Log.i("OUTPUT","保存数据库成功"); } //如果该数据已经存在数据库中 else { //修改 Log.i("OUTPUT","数据修改成功"); } msg.obj="成功"; } break; //登录界面获取用户信息显示操作 case Task.GET_USERINFO_IN_LOGIN: break; default : break; } handler.sendMessage(msg); }
上面的微博API操作都是异步的操作所以同样采取先请求,然后获取的操作。这种方式在授权部分已经讲的很清楚了。
然后就是保存数据库的操作,这里都是最基本的数据库使用方式了,就是有一点需要注意的是,UserIcon保存的是BOLB二进制数据。
GetUserInfo.java //利用微博API获取用户信息的工具方法类
package com.fangjie.weibo.util; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.net.URLConnection; import org.json.JSONException; import org.json.JSONObject; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.util.Log; import com.fangjie.weibo.bean.UserInfo; import com.weibo.sdk.android.Oauth2AccessToken; import com.weibo.sdk.android.WeiboException; import com.weibo.sdk.android.api.AccountAPI; import com.weibo.sdk.android.api.UsersAPI; import com.weibo.sdk.android.net.RequestListener; /** * GetUserInfo类 * 通过API获取用户信息 * @author 方杰 * @date 2013-7-29 */ public class GetUserInfo { public static String UID=""; private static UserInfo user; /** * 通过accessToken请求用户信息UID * @param accessToken */ public static void reqUID(Oauth2AccessToken accessToken) { AccountAPI account=new AccountAPI(accessToken); account.getUid(new RequestListener(){ @Override public void onComplete(String result) { // TODO Auto-generated method stub try { JSONObject object =new JSONObject(result); UID=object.getString("uid"); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public void onError(WeiboException arg0) { // TODO Auto-generated method stub } @Override public void onIOException(IOException arg0) { // TODO Auto-generated method stub } }); } /** * 请求UID之后,获取UID * @return string */ public static String getUID() { String id=UID; UID=""; return id; } /** * 通过accessToken,uid请求获取用户信息UserInfo(name,icon......) * @param accessToken * @param uid */ public static void reqUserInfo(final Oauth2AccessToken accessToken,long uid) { user=new UserInfo(); UsersAPI userapi=new UsersAPI(accessToken); userapi.show(uid, new RequestListener() { @Override public void onIOException(IOException arg0) { // TODO Auto-generated method stub } @Override public void onError(WeiboException arg0) { // TODO Auto-generated method stub } @Override public void onComplete(String arg0) { // TODO Auto-generated method stub JSONObject object; try { object = new JSONObject(arg0); Bitmap bm=GetUserInfo.getBitmap(object.getString("profile_image_url")); GetUserInfo.user.setUserIcon(bm); GetUserInfo.user.setToken(accessToken.getToken()); GetUserInfo.user.setIsDefault("0"); GetUserInfo.user.setUserName(object.getString("screen_name")); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); } public static UserInfo getUserInfo() { Log.i("OUTPUT",user.getUserName()); return user; } public static Bitmap getBitmap(String biturl) { Bitmap bitmap=null; try { URL url=new URL(biturl); URLConnection conn=url.openConnection(); InputStream in =conn.getInputStream(); bitmap=BitmapFactory.decodeStream(new BufferedInputStream(in)); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return bitmap; } }
DBUserInfo.java //操作用户信息的数据库工具方法类
package com.fangjie.weibo.db; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.util.ArrayList; import java.util.List; import com.fangjie.weibo.bean.UserInfo; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.graphics.Bitmap; import android.graphics.Bitmap.CompressFormat; import android.graphics.BitmapFactory; import android.graphics.drawable.Drawable; import android.util.Log; public class DBUserInfo { private DBHelper dbhelper; public DBUserInfo(Context context) { dbhelper = new DBHelper(context); } /** * 添加用户信息 * @param UserInfo */ public void insertUserInfo(UserInfo user) { SQLiteDatabase db = dbhelper.getWritableDatabase(); ByteArrayOutputStream baos=new ByteArrayOutputStream(); user.getUserIcon().compress(Bitmap.CompressFormat.PNG, 100, baos); byte[] usericon=baos.toByteArray(); ContentValues values = new ContentValues(5); values.put(UserInfo.USER_ID,user.getUserId()); values.put(UserInfo.USER_NAME, user.getUserName()); values.put(UserInfo.TOKEN,user.getToken()); values.put(UserInfo.IS_DEFAULT,user.getIsDefault()); values.put(UserInfo.USER_ICON,usericon); db.insert(UserInfo.TB_NAME, null, values);//表名称 db.close(); } /** * 根据用户userId获取用户对象 * @param String * @return UserInfo */ public UserInfo getUserInfoByUserId(String uid) { SQLiteDatabase db = dbhelper.getReadableDatabase(); Cursor cursor =db.query(UserInfo.TB_NAME, new String[]{UserInfo.ID,UserInfo.IS_DEFAULT,UserInfo.TOKEN, UserInfo.USER_ID,UserInfo.USER_NAME,UserInfo.USER_ICON}, UserInfo.USER_ID +"=?",new String[]{uid}, null, null, null); UserInfo userInfo =null; if(null != cursor) { if(cursor.getCount() >0) { cursor.moveToFirst(); userInfo = new UserInfo(); Long id =cursor.getLong(cursor.getColumnIndex(UserInfo.ID)); String uId = cursor.getString(cursor.getColumnIndex(UserInfo.USER_ID)); String userName = cursor.getString(cursor.getColumnIndex(UserInfo.USER_NAME)); String token = cursor.getString(cursor.getColumnIndex(UserInfo.TOKEN)); String isDefault = cursor.getString(cursor.getColumnIndex(UserInfo.IS_DEFAULT)); byte[] byteIcon = cursor.getBlob(cursor.getColumnIndex(UserInfo.USER_ICON)); userInfo.setId(id); userInfo.setUserId(uId); userInfo.setIsDefault(isDefault); userInfo.setToken(token); userInfo.setToken(token); userInfo.setUserName(userName); if(null !=byteIcon) { Bitmap userIcon=BitmapFactory.decodeByteArray(byteIcon, 0, byteIcon.length); userInfo.setUserIcon(userIcon); } } } db.close(); return userInfo; } /** * 获取数据库所有授权用户信息 * @param * @return List<UserInfo> */ public List<UserInfo> getAllUserInfo() { List<UserInfo> users=new ArrayList<UserInfo>(); SQLiteDatabase db = dbhelper.getReadableDatabase(); Cursor cursor =db.query(UserInfo.TB_NAME, new String[]{UserInfo.ID,UserInfo.IS_DEFAULT,UserInfo.TOKEN, UserInfo.USER_ID,UserInfo.USER_NAME,UserInfo.USER_ICON}, null,null, null, null, null); UserInfo userInfo =null; while(cursor.moveToNext()) { userInfo = new UserInfo(); Long id =cursor.getLong(cursor.getColumnIndex(UserInfo.ID)); String uId = cursor.getString(cursor.getColumnIndex(UserInfo.USER_ID)); String userName = cursor.getString(cursor.getColumnIndex(UserInfo.USER_NAME)); String token = cursor.getString(cursor.getColumnIndex(UserInfo.TOKEN)); String isDefault = cursor.getString(cursor.getColumnIndex(UserInfo.IS_DEFAULT)); byte[] byteIcon = cursor.getBlob(cursor.getColumnIndex(UserInfo.USER_ICON)); userInfo.setId(id); userInfo.setUserId(uId); userInfo.setIsDefault(isDefault); userInfo.setToken(token); userInfo.setUserName(userName); if(null !=byteIcon) { Bitmap userIcon=BitmapFactory.decodeByteArray(byteIcon, 0, byteIcon.length); Log.i("OUTPUT","dbuserinfo"+userIcon); userInfo.setUserIcon(userIcon); } users.add(userInfo); } db.close(); return users; } }
三.获取所有授权用户信息并显示在登录界面上
还记得在上面的AuthActivity中我们发送的GET_USERINFO_BY_TOKEN (获取授权用户信息并保存数据库)这个任务,这个任务完成后,我们会在refresh()方法中跳到LoginActivity。在LoginActivity的初始时,我们会发送GET_USERINFO_IN_LOGIN(获取所有授权用户信息),在做这个任务处理时也就是数据库的操作。
//登录界面获取用户信息显示操作 case Task.GET_USERINFO_IN_LOGIN: { DBUserInfo db=new DBUserInfo(getActivityByName("LoginActivity")); List<UserInfo> users=db.getAllUserInfo(); msg.obj=users; }
其他:
讲完上面这些,我突然想讲讲这个addActivty,reMoveActivty,getActivityByName
/** * UI层向MainService中发送任务的同时,同样要发送自己Activity, * 以便在MainService中调用refresh(); * @param task */ public static void addActivty(Activity activity) { appActivities.add(activity); } /** * UI层中有向MainService中传递Activity,在任务结束后(refresh),应去除该Activity,防止混淆! * eg:在LoginActivity中的GET_USERINFO_IN_LOGIN任务会随Activity的每次重新加载而开始一次,如果不去除 * activity的话,会导致本次refresh的是上次的activity的实例。因为获取activity是通过getActivityByName,这两 * 次的activity实例的name是相同的。 * @param activity */ public static void reMoveActivty(Activity activity) { appActivities.remove(activity); }
特别是reMoveActivty这个方法,我自己在做项目的时候就忘记了在每次完成任务时去删除这个Activity实例,导致了这样一个错误:
程序启动的时候会到LoginActivity,这时候做了一次GET_USERINFO_IN_LOGIN,就把LoginAcivity的一个实例传到activities中,当我再次添加一个授权用户信息,完成后再次跳到LoginActivity时,这时界面上就没有任何显示信息。因为当第二次跳到LoginActivity时,再次传一个LoginActivity的实例,而我在完成任务后refresh()时,刷新的是第一次的LoginActivity实例,所以对第二次的LoginActivity当然是没有显示。
通过上面这三个方法的配合我们就可以由Activity向一些工具类方法传递Context上下文的参数,比如在建立数据库时需要Context这个参数,还有在工具类中跳转的时候也需要用到Context参数。虽然这种传参可能会增加层与层之间的耦合度,但是我目前就这水平,也请大家给我指点。
Android新浪微博客户端(四)——添加多个账户及认证的更多相关文章
- android 新浪微博客户端的表情功能的实现
这是一篇好文章,我转来收藏,技术的最高境界是分享. 最近在搞android 新浪微博客户端,有一些心得分享弄android客户端表情功能可以用以下思路1.首页把新浪的表情下载到本地一文件夹种,表情图片 ...
- Android新浪微博客户端(三)——添加多个账户及认证
原文出自:方杰|http://fangjie.info/?p=72 转载请注明出处 一.微博OAuth2.0认证 首先来说说授权过程,我这里授权是通过SDK的,先添加SDK的jar包,微博SDK的de ...
- Android新浪微博客户端(二)——添加多个账户及认证
原文出自:方杰| http://fangjie.info/?p=69 转载请注明出处 先看下实现效果: 欢迎界面: 第一次进入登录界面登录由于在登录界面没有已授权用户信息,所以自动跳转到授权界面. ...
- Android新浪微博客户端(七)——ListView中的图片异步加载、缓存
原文出自:方杰|http://fangjie.info/?p=193转载请注明出处 最终效果演示:http://fangjie.sinaapp.com/?page_id=54 该项目代码已经放到git ...
- Android新浪微博客户端(六)——Home界面的ListView
原文出自:方杰|http://fangjie.info/?p=184转载请注明出处 最终效果演示:http://fangjie.info/?page_id=54该项目代码已经放到github:http ...
- 新浪微博客户端(8)-添加按钮到TabBar
在tabBar的中部添加一个发送微博的按钮. DJTabBar.h #import <UIKit/UIKit.h> @class DJTabBar; @protocol DJTabBarD ...
- Android新浪微博客户端(五)——主界面的TabHost和WeiboUtil
原文出自:方杰|http://fangjie.info/?p=183转载请注明出处 最终效果演示:http://fangjie.info/?page_id=54 该项目代码已经放到github:htt ...
- Android新浪微博客户端(一)——主框架搭建
原文出自:方杰| http://fangjie.info/?p=62 转载请注明出处 提前声明的是,我是按照Ivan的这套教程学下来的. 首先,对于任何应用我们都需要建立一套消息处理机制,就是当用户在 ...
- 四次元新浪微博客户端Android源码
四次元新浪微博客户端Android源码 源码下载:http://code.662p.com/list/11_1.html [/td][td] [/td][td] [/td][td] 详细说明:http ...
随机推荐
- 线程、委托、lambda运算符的简单示例
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- Android AppWidget(转)
AppWidget不知道大家使用这个多不多,这个在手机上也叫做挂件,挂件也就是放在桌面方便用户进行使用的,从android1.6开始挂件支持一些简单的lauout和view,到了android4.0之 ...
- Java基础知识强化之集合框架笔记13:Collection集合存储学生对象并遍历
1. Collection集合存储学生对象并遍历: 需求:存储自定义对象并遍历Student(name,age) 分析: (1)创建学生类 (2)创建集合对象 (3)创建学生对象 (4)把学生对象添加 ...
- Exception in thread "main" brut.androlib.AndrolibException: brut.androlib.AndrolibException: brut.common.BrutException: could not exec command
错误如下: Exception in thread "main" brut.androlib.AndrolibException: brut.androlib.AndrolibEx ...
- Unix Shell 通配符、转义字符、元字符、特殊字符
shell通配符: * 匹配0或多个字符 a*b a与b之间可以有任意长度的任意字符, 也可以一个也没有, 如aabcb, a01b, ab等 ? 匹配任意一个字符 a?b a与b之间有且只有一个字符 ...
- Day9 - Python 多线程、进程
Python之路,Day9, 进程.线程.协程篇 本节内容 操作系统发展史介绍 进程.与线程区别 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线 ...
- Day1 - Python基础1 介绍、基本语法、流程控制
Python之路,Day1 - Python基础1 本节内容 Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 .pyc是个什么鬼 ...
- 刷新的时候jquery获取checkbox是否为选中和设置选中
$(document).ready(function(){ $('.uninstall_list_checkbox').click(function(){ if($(this).parent('.un ...
- Directive Definition Object
不知道为什么这个我并没有想翻译过来的欲望,或许我并没有都看熟透,不好误人子弟,原版奉上. Here's an example directive declared with a Directive D ...
- node.js的ejs模版引擎
ejs版本是0.8.8,生成的views目录下面只有index.ejs and error.ejs,没有layout.ejs. D:\lianchuangfile\nodeDevelop\microb ...