衆所周知,移動網際網路在這幾年經曆了蓬勃發展,到目前為止,移動網際網路發展仍然很強勁。其中移動裝置系統以android占據主導地位,之前是加拿大的黑莓系統占據主導,但後來随着android系統的問世,黑莓手機作業系統逐漸被android蠶食,目前,全球最為流行的移動作業系統有Google公司的android、蘋果(Apple)公司的ios、微軟(Microsoft)公司的windows Phone,以上三者形成手機作業系統三足鼎立之勢,其中Google的android占據市場的百分之六十幾的份額,蘋果(Apple)占據百分之十八點幾的份額,而微軟(Microsoft)的Windows Phone占據全球僅僅隻有百分之三點幾的份額,好了,我們開始進入正題吧。
随着3G手機的廣泛普及,移動應用開始了井噴式的發展,這些移動應用公司如雨後春筍越來越多,一些剛剛起來的小公司開發的應用(大部分一些電商、社交等之類的)為了提高其知名度,不得不依附大公司的龐大的使用者群來進行推廣,比如像騰訊(Tencent),新浪(sina),人人網,臉譜網(Facebook)等,這些公司提供接口API供開發者調用。今天呢,我要說的就是新浪登入,至于我為什麼要說新浪,是因為新浪寫的接口文檔太可惡了,走了不少彎路,為了大家少走彎路,我決定寫這篇博文,如果寫的不好,請批評指正[請不要帶有侮辱性的詞彙啊,望手下留情]!
要想在移動應用上使用sina登入,第一步需要注冊成為開發者,說白了,就是一個新浪微網誌帳号,如果有了的話,就不要注冊了,直接登入即可,那麼在那裡去注冊成為開發者呢?下面的圖會告訴你:在位址欄中輸入 t.sina.com.cn --> 它會要求你登入(如果沒登入)
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICdzFWRoRXdvN1LclHdpZXYyd2LcBzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CX90zdOVTUU5kenpWT4FEVkZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39DM0EDM1IjM0EjMwITMzEDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
經過以上第一步,我們進入了新浪的開放平台,如圖:
第三步,建立應用,獲得授權資格,這裡需要你去填寫一些重要的資訊,這些東西在以後會用到,如圖(建立應用):
第四步,當我們點選了建立應用,你需要填寫以下資訊,如圖:
好了,現在剩下最後一步了,填寫完以上資訊之後,送出資訊,完了,此時還還會有些資訊需要你填寫,例如,回調位址,其實就是網站位址,可填新浪預設的,如果你自己有的話,也可以填寫你自己的網站位址,如圖:
記住,以上畫紅線部分,千萬不要洩露出去,因為會對公司造成安全隐患,特别是Android簽名、App Secret,如果App Secret不小心洩露出去的話,你可以點選該條目,進入編輯頁,進行重置,其中android簽名是根據新浪提供的一個app_signatures.apk生成的一串MD5加密字元串,然後填上去,就哦了!下面是一個示例,還要記住的是,要想使用此工具生成一串MD5加密字元串,那你就必須将該應用安裝到你的手機上,因為該MD5加密字元串是根據包名及xx.keystore生成的,Eclipse內建開發工具Run as 所使用的是debug.keystore 是以當你在釋出你的APP的時候,一定要根據你自己公司的 .keystore 生成MD5加密字元串填到android簽名哪一項上去,如果你填的是你通過Eclipse內建開發工具中的Run as 安裝到手機上去的debug.keystore生成的MD5加密字元串的話,那麼會導緻無法授權登入問題産生。是以,一旦你要釋出APP時,一定要更正回來,一般來說,一個公司keystore隻有一份,根據報名産生的MD5加密字元串效果圖如下:
哦,對了,在最後一步我們提到了回調位址,那麼該回調位址有什麼用呢?該回調位址相對使用者來說是不可見的,這個回調位址是用來生成accessToken的,通過這個accessToken可以去請求接口,獲得相關使用者的資訊。帶回一張圖就可以讓你明白,我上面所提到字段的意思。如圖:
完了,這就是新浪登入的過程,下面貼上一段代碼,第三方登入的代碼,這裡有一個請求接口的類,我覺得吧他寫成内部類更好一點,因為這樣可以更好的傳資料。特别提一點,我使用的SSO登入,我相信,Oauth2.0 認證應該是一樣的吧。
代碼:
public class LoginActivity extends BaseActivity implements OnClickListener {
public static final int END_SINA = 2;
private RelativeLayout third_party_login_xinlang;
public String TAG = "LoginActivity---->";
public static Oauth2AccessToken accessToken;
private Weibo mWeibo;
private SsoHandler mSsoHandler;
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
case END_SINA:
Log.v(TAG, "sina data loded!!");
isAlreadExist(LoginActivity.loginType);
break;
default:
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login);
initViews();
initData();
}
private void initData() {// 新浪微網誌執行個體
mWeibo = Weibo.getInstance(ConstantS.APP_KEY, ConstantS.REDIRECT_URL,
TAG);
}
private void initViews() {
third_party_login_xinlang.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.third_party_login_xinlang:
isThreeLogin("1");
isSinaLogin();
break;
}
}
/**
* 新浪登入
*/
private void isSinaLogin() {
mSsoHandler = new SsoHandler(this, mWeibo);
mSsoHandler.authorize(new AuthDialogListener(), null);
}
/**
* 新浪回調
*
* @author Administrator
*
*/
private class AuthDialogListener implements WeiboAuthListener {
@Override
public void onCancel() {
}
@Override
public void onComplete(Bundle values) {
String token = values.getString("access_token");
String expires_in = values.getString("expires_in");
final String idstr = values.getString("uid");
LoginActivity.accessToken = new Oauth2AccessToken(token, expires_in);
if (LoginActivity.accessToken.isSessionValid()) {
String date = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss")
.format(new java.util.Date(accessToken.getExpiresTime()));
AccessTokenKeeper.keepAccessToken(LoginActivity.this,
accessToken);
}
new Thread(new Runnable() {
@Override
public void run() {
UserApi userApi = new UserApi(accessToken);
userApi.show(idstr, new SinaRequestListener());
}
}).start();
}
@Override
public void onError(WeiboDialogError arg0) {
}
@Override
public void onWeiboException(WeiboException arg0) {
}
}
/**
* 新浪請求接口
*
* @author Administrator
*
*/
private class SinaRequestListener implements RequestListener {
@Override
public void onComplete(String response) {
JsonUtil jsonUtil = new JsonUtil();
JSONObject jsonObject = jsonUtil.getJsonObject(response);
try {
Message msg = Message.obtain();
String idstr = jsonObject.getString("idstr");// 唯一辨別符(uid)
String name = jsonObject.getString("name");// 姓名
String avatar_hd = jsonObject.getString("avatar_hd");// 頭像
userModel.setUid(idstr);
userModel.setNickname(name);
userModel.setAvatar(avatar_hd);
msg.what = END_SINA;
handler.sendMessage(msg);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onComplete4binary(ByteArrayOutputStream arg0) {
}
@Override
public void onError(WeiboException arg0) {
}
@Override
public void onIOException(IOException arg0) {
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (mSsoHandler != null) {
mSsoHandler.authorizeCallBack(requestCode, resultCode, data);
}
}
}
好了,到此,已完結!如果認為好的話,想要轉載,請注明出處,謝謝!