1,在 http://developer.baidu.com/ 注册成开发者
不注册看不到开发相关的链接地址.点自己的用户名,在弹出菜单显示有 <用户中心> ,没有就是没注册.
2,找到关键文档,在文档中查找OAuth,了解相关知识
点docs/oauth这个连接 http://developer.baidu.com/wiki/index.php?title=docs/oauth
注意,baidu有多种授权方式,本例子中选用的是 Authorization Code
3.下载开发文档
下载其中的 Android-SDK-1.0.rar 里面有jar文件,jar源码,示例文件,详细开发教程
4,开始开发
4.1 在开发者服务中添加一个应用,这个应用就是第三方登录应用. 得到API Key和Secret Key
4.2 工程设置
其中OAuth安全设置很重要
点击 安全设置 进入如下页面
4.3写android客户瑞,得到令牌
1 public void onClickGetAccessToken(View btn){ 2 mBaidu = new Baidu(API_KEY, this); 3 //由于取token是在其它线程中的网络请求,所以它的函数不可操作UI 4 mBaidu.authorize(this, false, true, new BaiduDialogListener() { 5 6 @Override 7 public void onError(BaiduDialogError arg0) { 8 refreshTokenText("onError"); 9 } 10 11 @Override 12 public void onComplete(Bundle arg0) { 13 mToken = mBaidu.getAccessToken(); 14 refreshTokenText(mToken); 15 } 16 17 @Override 18 public void onCancel() { 19 refreshTokenText("onCancel"); 20 } 21 22 @Override 23 public void onBaiduException(BaiduException arg0) { 24 refreshTokenText("onBaiduException"); 25 } 26 }); 27 }
4.4 得到令牌后取个人信息
调用的是异步接口
1 public void onClickAsyncGetUserInfo(View btn){ 2 AsyncBaiduRunner asyncRun = new AsyncBaiduRunner(mBaidu); 3 asyncRun.request(USER_INFO_URL, null, "GET", new RequestListener(){ 4 5 @Override 6 public void onIOException(IOException arg0) { 7 refreshResultText(" get user onIOException"); 8 } 9 10 @Override 11 public void onComplete(String jsonResult) { 12 refreshResultText(jsonResult); 13 } 14 15 @Override 16 public void onBaiduException(BaiduException arg0) { 17 refreshResultText(" get user onBaiduException"); 18 } 19 }); 20 }
4.5 完成代码
1 package com.example.oauthsample; 2 3 import java.io.IOException; 4 5 import com.baidu.api.AsyncBaiduRunner; 6 import com.baidu.api.AsyncBaiduRunner.RequestListener; 7 import com.baidu.api.Baidu; 8 import com.baidu.api.BaiduDialog.BaiduDialogListener; 9 import com.baidu.api.BaiduDialogError; 10 import com.baidu.api.BaiduException; 11 import com.google.gson.Gson; 12 import com.google.gson.reflect.TypeToken; 13 14 import android.app.Activity; 15 import android.os.Bundle; 16 import android.view.View; 17 import android.widget.TextView; 18 import android.widget.Toast; 19 20 public class MainActivity extends Activity { 21 22 //这是在developer.baidu.com申请到的API_KEY 23 private static final String API_KEY = "2PBcXbkO1kWyjWHPXeBT2KFz"; 24 25 //得到令牌后取用户信息的url 26 private static final String USER_INFO_URL = "https://openapi.baidu.com/rest/2.0/passport/users/getInfo"; 27 28 private TextView mAccessToken,mResult; 29 private String mToken ; 30 private Baidu mBaidu ; 31 private Gson mGson; 32 33 private void refreshTokenText(final String msg){ 34 mAccessToken.post(new Runnable() { 35 @Override 36 public void run() { 37 mAccessToken.setText(msg); 38 } 39 }); 40 } 41 private void refreshResultText(final String msg){ 42 mResult.post(new Runnable() { 43 @Override 44 public void run() { 45 mResult.setText(msg); 46 } 47 }); 48 } 49 public void onClickSyncGetUserInfo(View btn){ 50 if (mToken == null) { 51 Toast.makeText(this, "token is null", Toast.LENGTH_SHORT).show(); 52 return; 53 } 54 new Thread(){//非UI线程 55 public void run() { 56 try { 57 final String result = mBaidu.request(USER_INFO_URL, null, "GET"); 58 59 //解析JSOn(将json反序列化成对象)的方式1,当返回的是简单对象(只一个对象)时用gson.fromJson(string,xx.class); 60 final BaiduUser usr = mGson.fromJson(result, BaiduUser.class); 61 62 //解析JSOn(将json反序列化成对象)的方式2,当返回的是复杂对象,要用AVA泛型时,如有个集合(0-n)要用gson.fromJson(string,new TypeToken<XXX>(){}.getType()); 63 //如usr2 64 final BaiduUser usr2 = mGson.fromJson(result,new TypeToken<BaiduUser>(){}.getType()); 65 66 67 runOnUiThread(new Runnable() {//到UI线程执行 68 @Override 69 public void run() { 70 mResult.setText(result);//UI线程中的控件 71 mResult.append("\n username : " + usr.username); 72 mResult.append("\n has bind mobile : " + usr.hasBindMobile); 73 mResult.append("\n username : "+usr2.userid); 74 75 //将对象序列化成json数据 76 mResult.append("\n baidu user is : \n" + mGson.toJson(usr)); 77 78 } 79 }); 80 } catch (IOException e) { 81 e.printStackTrace(); 82 } catch (BaiduException e) { 83 e.printStackTrace(); 84 } 85 86 }; 87 }.start(); 88 } 89 public void onClickAsyncGetUserInfo(View btn){ 90 AsyncBaiduRunner asyncRun = new AsyncBaiduRunner(mBaidu); 91 asyncRun.request(USER_INFO_URL, null, "GET", new RequestListener(){ 92 93 @Override 94 public void onIOException(IOException arg0) { 95 refreshResultText(" get user onIOException"); 96 } 97 98 @Override 99 public void onComplete(String jsonResult) { 100 refreshResultText(jsonResult); 101 } 102 103 @Override 104 public void onBaiduException(BaiduException arg0) { 105 refreshResultText(" get user onBaiduException"); 106 } 107 }); 108 } 109 public void onClickGetAccessToken(View btn){ 110 mBaidu = new Baidu(API_KEY, this); 111 //由于取token是在其它线程中的网络请求,所以它的函数不可操作UI 112 mBaidu.authorize(this, false, true, new BaiduDialogListener() { 113 114 @Override 115 public void onError(BaiduDialogError arg0) { 116 refreshTokenText("onError"); 117 } 118 119 @Override 120 public void onComplete(Bundle arg0) { 121 mToken = mBaidu.getAccessToken(); 122 refreshTokenText(mToken); 123 } 124 125 @Override 126 public void onCancel() { 127 refreshTokenText("onCancel"); 128 } 129 130 @Override 131 public void onBaiduException(BaiduException arg0) { 132 refreshTokenText("onBaiduException"); 133 } 134 }); 135 } 136 //------------------------------------------- 137 @Override 138 protected void onCreate(Bundle savedInstanceState) { 139 super.onCreate(savedInstanceState); 140 setContentView(R.layout.activity_main); 141 142 mGson = new Gson(); 143 144 mAccessToken = (TextView) findViewById(R.id.tv_access_token); 145 mResult = (TextView) findViewById(R.id.tv_result); 146 } 147 148 }