在前面完成了数据库操作、异步图片加载和缓存、新浪微博认证后,就可以进行登录界面的功能开发了,登录界面功能代码如下:
package com.xhq.xweibo.ui;
import java.util.ArrayList;
import java.util.List;
import com.sina.weibo.sdk.auth.Oauth2AccessToken;
import com.sina.weibo.sdk.auth.WeiboAuth;
import com.sina.weibo.sdk.auth.WeiboAuthListener;
import com.sina.weibo.sdk.net.AsyncWeiboRunner;
import com.sina.weibo.sdk.net.RequestListener;
import com.sina.weibo.sdk.net.WeiboParameters;
import com.sina.weibo.sdk.constant.WBConstants;
import com.sina.weibo.sdk.openapi.UsersAPI;
import com.sina.weibo.sdk.openapi.models.User;
import com.sina.weibo.sdk.exception.WeiboException;
import com.sina.weibo.sdk.utils.LogUtil;
import com.sina.weibo.sdk.utils.UIUtils;
import com.xhq.common.AsyncImageLoader;
import com.xhq.common.ImageUtil;
import com.xhq.common.NetUtil;
import com.xhq.xweibo.logic.Constants;
import com.xhq.xweibo.logic.CurUserKeeper;
import com.xhq.xweibo.logic.UserInfo;
import com.xhq.xweibo.logic.XDBHelper;
import com.xhq.xweibo.R;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.Toast;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
public class LoginActivity extends Activity
{
private static final String TAG = "LoginActivity";
private static final String WEIBO_DEMO_APP_SECRET = "4e47e691a516afad0fc490e05ff70ee5";
private static final String OAUTH2_ACCESS_TOKEN_URL = "https://open.weibo.cn/oauth2/access_token";
// UI references.
private static ImageView mHeaderView;
private static Spinner mAccountView;
private static Button mLoginBotton;
private static Button mAuthBotton;
private static Button mExitBotton;
private static Button mLogoutBotton;
private static ProgressDialog pd;
private static XDBHelper mDBHelper;
private static List<UserInfo> mUserList;
private static UserInfo mCurUser;
private ArrayAdapter<String> mAdapter;
private List<String> mUserNameList;
private static long m_nExitTime;
private AsyncImageLoader mImageLoader;
private AsyncImageLoader.onLoadCompleteListener mLoadCompleteListener;
private WeiboAuth mWeiboAuth;
private String mCode;
private Oauth2AccessToken mAccessToken;
private UsersAPI mUsersAPI;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
//this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_login);
// Set up the login form.
mHeaderView = (ImageView) findViewById(R.id.login_header);
mAccountView = (Spinner) findViewById(R.id.login_account);
mLoginBotton = (Button) findViewById(R.id.login_button);
mAuthBotton = (Button) findViewById(R.id.login_auth);
mExitBotton = (Button) findViewById(R.id.login_exit);
mLogoutBotton = (Button) findViewById(R.id.login_logout);
mImageLoader = new AsyncImageLoader(this.getApplicationContext());
mDBHelper = new XDBHelper(LoginActivity.this);
mUserNameList = new ArrayList<String>();
mAdapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item, mUserNameList);
initUser();
mLoginBotton.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view)
{
CharSequence error;
if (mUserList.isEmpty())
{
error = getString(R.string.login_error_noneaccount);
Toast.makeText(LoginActivity.this, error, Toast.LENGTH_LONG)
.show();
} else
{
if (mCurUser != null)
{
pd = new ProgressDialog(LoginActivity.this);
pd.setMessage("登录服务器....");
pd.show();
CurUserKeeper.saveCurUser(getApplicationContext(), mCurUser);
Intent it = new Intent();
it.setClass(LoginActivity.this, TabHostActivity.class);
startActivity(it);
pd.dismiss();
finish();
}else
{
Toast.makeText(getApplicationContext(), "无用户账号", Toast.LENGTH_SHORT).show();
}
}
}
});
mAuthBotton.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
mWeiboAuth = new WeiboAuth(LoginActivity.this,
Constants.APP_KEY, Constants.REDIRECT_URL,
Constants.SCOPE);
mWeiboAuth.authorize(new AuthListener(),
WeiboAuth.OBTAIN_AUTH_CODE);
}
});
mExitBotton.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
// TODO 自动生成的方法存根
finish();
System.exit(0);
}
});
mLogoutBotton.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
}
});
}
@Override
protected void onResume()
{
// TODO Auto-generated method stub
super.onResume();
init();
}
public boolean onKeyDown(int keyCode, KeyEvent event)
{
if (keyCode == KeyEvent.KEYCODE_BACK
&& event.getAction() == KeyEvent.ACTION_DOWN)
{
if ((System.currentTimeMillis() - m_nExitTime) > 2000) //
{
Toast.makeText(getApplicationContext(), "再按一次退出程序",
Toast.LENGTH_SHORT).show();
m_nExitTime = System.currentTimeMillis();
} else
{
finish();
System.exit(0);
}
return true;
}
return super.onKeyDown(keyCode, event);
}
public void initUser()
{
Log.d(TAG, "initUser");
mDBHelper.createUserTable();
mUserList = mDBHelper.getUserList(false);
if (!mUserList.isEmpty())
{
// 获取用户名列表,并关联到spinner控件
for (UserInfo ui : mUserList)
{
mUserNameList.add(ui.getUserName());
}
mAdapter.setDropDownViewResource(android.R.layout.simple_spinner_item);
mAccountView.setAdapter(mAdapter);
mAccountView
.setOnItemSelectedListener(new SpinnerSelectedListener());
// 获取最近登录的用户
SharedPreferences sp = getSharedPreferences("lastUser",
Activity.MODE_PRIVATE);
String name = sp.getString("lastUser", "");
if (name != "")
{
mAccountView.setSelection(mUserNameList.indexOf(name), true);
} else
{
mAccountView.setSelection(0, true);
}
} else
{
Log.d(TAG, "Have 0 user");
}
}
public void init()
{
Log.d(TAG, "init");
Intent it = new Intent("com.xhq.xweibo.logic.XService");
startService(it);
}
public void fetchTokenAsync(String authCode, String appSecret)
{
WeiboParameters requestParams = new WeiboParameters();
requestParams.put(WBConstants.AUTH_PARAMS_CLIENT_ID, Constants.APP_KEY);
requestParams.put(WBConstants.AUTH_PARAMS_CLIENT_SECRET, appSecret);
requestParams.put(WBConstants.AUTH_PARAMS_GRANT_TYPE,
"authorization_code");
requestParams.put(WBConstants.AUTH_PARAMS_CODE, authCode);
requestParams.put(WBConstants.AUTH_PARAMS_REDIRECT_URL,
Constants.REDIRECT_URL);
// 异步请求,获取 Token
AsyncWeiboRunner.requestAsync(OAUTH2_ACCESS_TOKEN_URL, requestParams,
"POST", new RequestListener()
{
@Override
public void onComplete(String response)
{
LogUtil.d(TAG, "Response: " + response);
Oauth2AccessToken token = Oauth2AccessToken
.parseAccessToken(response);
if (token != null && token.isSessionValid())
{
LogUtil.d(TAG, "Success! " + token.toString());
mCurUser = new UserInfo();
mAccessToken = token;
mCurUser.setUserId(mAccessToken.getUid());
mCurUser.setToken(mAccessToken.getToken());
mCurUser.setUserExpiresin(mAccessToken.getExpiresTime());
mUsersAPI = new UsersAPI(mAccessToken);
long uid = Long.parseLong(mAccessToken.getUid());
mUsersAPI.show(uid, mListener);
} else
{
LogUtil.d(TAG, "Failed to receive access token");
}
}
@Override
public void onWeiboException(WeiboException e)
{
LogUtil.e(TAG, "onWeiboException: " + e.getMessage());
Toast.makeText(LoginActivity.this, "获取Token失败",
Toast.LENGTH_SHORT).show();
}
});
}
/**
* 微博 OpenAPI 回调接口。
*/
private RequestListener mListener = new RequestListener()
{
@Override
public void onComplete(String response)
{
if (!TextUtils.isEmpty(response))
{
LogUtil.i(TAG, response);
User user = User.parse(response);
if (user != null)
{
LogUtil.d(TAG, "Success to get screen_name: "
+ user.screen_name);
mCurUser.setUserName(user.screen_name);
mCurUser.setUserIcon(user.profile_image_url);
mDBHelper.SaveUserInfo(mCurUser);
initUser();
mImageLoader.loadImage(mHeaderView,user.profile_image_url, mLoadCompleteListener);
} else
{
Toast.makeText(LoginActivity.this, response,
Toast.LENGTH_LONG).show();
}
}
}
@Override
public void onWeiboException(WeiboException e)
{
LogUtil.e(TAG, e.getMessage());
}
};
class SpinnerSelectedListener implements OnItemSelectedListener
{
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
long arg3)
{
Log.d("LoginActivity", "spinner item selected");
mCurUser = mDBHelper.getUserByName(mUserNameList.get(arg2),
mUserList);
if (null != mCurUser)
{
mImageLoader.loadImage(mHeaderView,mCurUser.getUserIcon(), new AsyncImageLoader.onLoadCompleteListener()
{
@Override
public void onLoadSuccess(View view, Bitmap bmp, String url)
{
// TODO 自动生成的方法存根
((ImageView)view).setImageDrawable(ImageUtil.BMP2Drawable(bmp));
}
@Override
public void onLaodFail(View view, String url)
{
// TODO 自动生成的方法存根
((ImageView)view).setImageResource(R.drawable.login_user_ic);
}
});
}
}
public void onNothingSelected(AdapterView<?> arg0)
{
}
}
class AuthListener implements WeiboAuthListener
{
@Override
public void onComplete(Bundle values)
{
if (null == values)
{
Toast.makeText(LoginActivity.this, "授权失败", Toast.LENGTH_SHORT)
.show();
return;
}
String code = values.getString("code");
if (TextUtils.isEmpty(code))
{
Toast.makeText(LoginActivity.this, "授权失败", Toast.LENGTH_SHORT)
.show();
return;
}
LogUtil.d(TAG, "Success to get code");
mCode = code;
fetchTokenAsync(mCode, WEIBO_DEMO_APP_SECRET);
}
@Override
public void onCancel()
{
Toast.makeText(LoginActivity.this, "授权取消", Toast.LENGTH_LONG)
.show();
}
@Override
public void onWeiboException(WeiboException e)
{
UIUtils.showToast(LoginActivity.this,
"Auth exception : " + e.getMessage(), Toast.LENGTH_LONG);
}
}
}
主要逻辑如下:
(1)初始化:登录界面载入时,先到数据库中取出用户列表,把用户名加入到Spinner中,然后通过 SharedPreferences 获取最近登录过的用户,
SharedPreferences sp = getSharedPreferences("lastUser",Activity.MODE_PRIVATE);
String name = sp.getString("lastUser", "");
然后让Spinner选中相应的用户,然后在SpinnerSelectedListener 中保存获取当前用户信息,异步加载用户头像。
(2)添加授权: 点击添加授权按钮后,就进入授权界面了,获取到code后,再获取token,然后保存用户的相应信息到数据库,然后把当前用户选择为刚刚授权成功的账号。
(3)退出 :点击退出按钮直接退出程序或者在2秒内点击返回键。
(4)注销账号:功能还没实现。
(5)登录 :点击登录按钮后就会进入到微博的主界面了。