Unity使用官方sdk實現微信、QQ、微博三方登入(Android)

NO IMAGE

————————————-2017.5.18更新—————————————————————————————————————

由於微博更新了sdk,關閉了網路請求的介面,後來微博登入的時候一直顯示系統錯誤,微博更新sdk以後不再是jar提供使用,改成了aar提供使用,區別不是很大,修改一下你的gradle,在dependices裡面加上

compile(name: 'openDefault-2.0.3', ext: 'aar'),上面還要加一個repositories。
然後應用一下,吧這個aar的包拷到你的libs目錄下就可以了。

repositories{
flatDir {
dirs 'libs'
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.0.1'
compile 'com.android.support:support-v4:25.3.1'
testCompile 'junit:junit:4.12'
compile files('libs/libammsdk.jar')
compile files('libs/classes.jar')
// compile files('libs/weiboSDKCore_3.1.4.jar')
compile files('libs/mta-sdk-1.6.2.jar')
compile files('libs/open_sdk_r5756.jar')
compile files('libs/Sunflower.jar')
compile files('libs/okhttputils-2_6_2.jar')
compile files('libs/okhttp-3.3.1.jar')
compile files('libs/okio-1.8.0.jar')
compile files('libs/commons-beanutils-1.8.0.jar')
compile files('libs/fastjson-1.1.41.jar')
compile files('libs/unitynotification.jar')
compile files('libs/gson-2.8.0.jar')
compile files('libs/unityutil.jar')
compile(name: 'openDefault-2.0.3', ext: 'aar')
//    compile(name: 'PushSDK-debug', ext: 'aar')
}

然後在你的mainactivity裡的oncreate函式裡註冊一下微博:

WbSdk.install(this,new AuthInfo(this, Constants.APP_KEY, Constants.REDIRECT_URL, Constants.SCOPE));

把之前的WBTools這個指令碼刪掉,新建一個WBAuthActivity指令碼,或者把新下載的微博sdk Demo裡的這個指令碼拷過來。

android供unity呼叫的微博登入函式

 //微博登入
public void WBLogin()
{
// wbTools.WBLogin();
Log.i("微博","點到微博登入了");
startActivity(new Intent(this, WBAuthActivity.class));
}

WBAuthActivity指令碼程式碼:

public class WBAuthActivity extends Activity {
private static final String TAG = "weibosdk";
/** 顯示認證後的資訊,如 AccessToken */
private TextView mTokenText;
/** 封裝了 "access_token","expires_in","refresh_token",並提供了他們的管理功能  */
private Oauth2AccessToken mAccessToken;
/** 注意:SsoHandler 僅當 SDK 支援 SSO 時有效 */
private SsoHandler mSsoHandler;
/**
* @see {@link Activity#onCreate}
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 建立微博例項
mSsoHandler = new SsoHandler(WBAuthActivity.this);
// SSO 授權, 僅客戶端
mSsoHandler.authorizeClientSso(new SelfWbAuthListener());
Log.i("發起授權成功","授權成功");
// 從 SharedPreferences 中讀取上次已儲存好 AccessToken 等資訊,
// 第一次啟動本應用,AccessToken 不可用
mAccessToken = com.sina.weibo.sdk.auth.AccessTokenKeeper.readAccessToken(this);
Log.i("發起授權成功11111111","授權成功");
}
/**
* 當 SSO 授權 Activity 退出時,該函式被呼叫。
*
* @see {@link Activity#onActivityResult}
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Log.i("data1111",Integer.toString(requestCode));
if(resultCode== Activity.RESULT_CANCELED)
{
System.out.println("使用者取消了33333");
finish();
}
// SSO 授權回撥
// 重要:發起 SSO 登陸的 Activity 必須重寫 onActivityResults
if (mSsoHandler != null) {
Log.i("sso回撥","毀掉成功");
mSsoHandler.authorizeCallBack(requestCode, resultCode, data);
}
}
private class SelfWbAuthListener implements com.sina.weibo.sdk.auth.WbAuthListener{
@Override
public void onSuccess(final Oauth2AccessToken token) {
WBAuthActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
mAccessToken = token;
if (mAccessToken.isSessionValid()) {
// 顯示 Token
//  updateTokenView(false);
// 儲存 Token 到 SharedPreferences
Map m=new HashMap();
m.put("access_token",mAccessToken.getToken());
m.put("uid",mAccessToken.getUid());
com.sina.weibo.sdk.auth.AccessTokenKeeper.writeAccessToken(WBAuthActivity.this, mAccessToken);
UnityPlayer.UnitySendMessage("ThirdLoginGameobject","WeiboCallBack", JSON.toJSONString(m));
Log.i("accesstoken",JSON.toJSONString(m));
finish();
}
}
});
}
@Override
public void cancel() {
Log.i("取消授權","取消授權成功");
}
@Override
public void onFailure(WbConnectErrorMessage errorMessage) {
Toast.makeText(WBAuthActivity.this, errorMessage.getErrorMessage(), Toast.LENGTH_LONG).show();
}
}
}

最後改一下你的Mainfest檔案,之前關於微博的許可權全部刪掉,加上

  <!-- 授權認證 -->
<activity android:name=".WBAuthActivity" />
<!--<activity android:name=".WBAuthCodeActivity" />-->
<!--<activity android:name=".WBShareMainActivity" />-->
<meta-data
android:name="WEIBO_APPKEY"
android:value="你申請的微博的APPKEY" />
<meta-data
android:name="WEIBO_CHANNEL"
android:value="weibo" />

———————————————————微博登入更新結束——————————————————————————————————————————————————

對於一個不懂安卓不會java的新手程式,實現安卓三方登入開始是 一頭霧水,不知道從哪下手,通過自己摸索加上多方求助終於完成了。為了自己鞏固一下以及一些像我一樣的新手走彎路,把詳細過程記錄下來。

第一次寫文章,寫的有點亂,希望能幫助到大家。吐舌頭

我使用的是android studio2.2.2版本開發。

一、新建安卓工程並匯入jar檔案

注意寫好自己的包名,微信登入和微博登入都要用到包名獲取簽名,把獲取到的簽名上傳到開放平臺。

填好包名後一直點next就可以了,點選finish完成建立。

建立完成後,新建一個module類,同樣寫好自己的包名。

到這裡準備工作就做好了。

二、QQ登入

QQ登入時最簡單的一個,因為不需要簽名。在qq開放平臺下載好sdk,然後copy到libs資料夾下。

點選Add as Library就可以了,微信和微博的jar包匯入也是一樣,Unity的classes.jar也需要匯入,後面就不贅述了。

通過呼叫Tencent類的login函式發起登入/校驗登入態。
該API具有兩個作用:
(1)如果開發者沒有呼叫mTencent例項的setOpenId、setAccessToken API,則該API執行正常的登入操作;
(2)如果開發者先呼叫mTencent例項的setOpenId、setAccessToken API,則該API執行校驗登入態的操作。如果登入態有效,則返回成功給應用,如果登入態失效,則會自動進入登入流程,將最新的登入態資料返回給應用。

建議開發者在每次應用啟動時呼叫一次該API(先呼叫setOpenId、setAccessToken),以確保每次開啟應用時使用者都是有登入態的。

public class MainActivity extends UnityPlayerActivity {
private Tencent mTencent;
private BaseUiListener mBaseUiListener=new BaseUiListener();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mTencent = Tencent.createInstance("你的APPID", this.getApplicationContext());
}
/**
* qq登入程式碼  Unity裡呼叫
*/
public void QQlogin() {
//登入程式碼。。。
if (!mTencent.isSessionValid())
{
mTencent.login(this, "", mBaseUiListener);
}
}
/**
* qq請求回撥
*/
private class BaseUiListener implements IUiListener {
@Override
public void onComplete(Object o) {
JSONObject response=(JSONObject)o;
//把請求到的引數傳給unity
UnityPlayer.UnitySendMessage("ThirdLoginGameobject","QQCallBack",o.toString());
}
@Override
public void onError(UiError uiError) {
}
@Override
public void onCancel() {
}
}
/**
* qq登入頁面返回處理
* @param requestCode
* @param resultCode
* @param data
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Tencent.onActivityResultData(requestCode,resultCode,data,mBaseUiListener);
}

然後再mainfest裡配置許可權。

<uses-permission android:name=”android.permission.INTERNET” />

<uses-permission android:name=”android.permission.ACCESS_NETWORK_STATE” />


<application>

<activity

android:name=”com.tencent.tauth.AuthActivity” 

android:noHistory=”true” 

android:launchMode=”singleTask” >

<intent-filter>

<action android:name=”android.intent.action.VIEW” />

<category android:name=”android.intent.category.DEFAULT” />

<category android:name=”android.intent.category.BROWSABLE” />

<data android:scheme=”tencent你的AppId” />

</intent-filter>

</activity>

<application>

SDK_V2.0引入了AssistActivity,開發者需在androidManifest.xml中註冊。程式碼如下:

<activity android:name=”com.tencent.connect.common.AssistActivity”

android:theme=”@android:style/Theme.Translucent.NoTitleBar”

android:configChanges=”orientation|keyboardHidden|screenSize” 

/>

現在就可以成功拉起QQ授權頁面並登陸了。

三、微信登入

新建一個名為wxapi的包和WXEntryActivity的類。

WXEntryActivity的程式碼如下:

public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
private static final String WEIXIN_ACCESS_TOKEN_KEY = "wx_access_token_key";
private static final String WEIXIN_OPENID_KEY = "wx_openid_key";
private static final String WEIXIN_REFRESH_TOKEN_KEY = "wx_refresh_token_key";
public static WeChatCode mWeChatCode;
public WeChatCode getWeChatCode() {
return mWeChatCode;
}
public void setWeChatCode(WeChatCode weChatCode) {
mWeChatCode = weChatCode;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 微信事件回撥介面註冊
MyApplication.sApi.handleIntent(getIntent(), this);
}
//微信元件註冊初始化
public static IWXAPI initWeiXin(Context context, @NonNull String weixin_app_id) {
if (TextUtils.isEmpty(weixin_app_id)) {
Toast.makeText(context.getApplicationContext(), "app_id 不能為空", Toast.LENGTH_SHORT).show();
}
IWXAPI api = WXAPIFactory.createWXAPI(context, weixin_app_id, true);
api.registerApp(weixin_app_id);
return api;
}
/**
* 登入微信
*/
public static void loginWeixin(Context context, IWXAPI api, WeChatCode wechatCode) {
// 判斷是否安裝了微信客戶端
//        if (!api.isWXAppInstalled()) {
//            Toast.makeText(context.getApplicationContext(), "您還未安裝微信客戶端!", Toast.LENGTH_SHORT)
//                    .show();
//            return;
//        }
mWeChatCode=wechatCode;
// 傳送授權登入資訊,來獲取code
SendAuth.Req req = new SendAuth.Req();
// 應用的作用域,獲取個人資訊
req.scope = "snsapi_userinfo";
/**
* 用於保持請求和回撥的狀態,授權請求後原樣帶回給第三方
* 為了防止csrf攻擊(跨站請求偽造攻擊),後期改為隨機數加session來校驗
*/
req.state = "app_wechat";
api.sendReq(req);
}
// 微信傳送請求到第三方應用時,會回撥到該方法
@Override
public void onReq(BaseReq req) {
switch (req.getType()) {
case ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX:
break;
case ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX:
break;
default:
break;
}
}
// 第三方應用傳送到微信的請求處理後的響應結果,會回撥到該方法
@Override
public void onResp(BaseResp resp) {
switch (resp.errCode) {
// 傳送成功
case BaseResp.ErrCode.ERR_OK:
// 獲取code
String code = ((SendAuth.Resp) resp).code;
mWeChatCode.getResponse(code);
break;
}
}
/**
* 返回code的回撥介面
*/
public interface WeChatCode {
void getResponse(String code);
}
}

MainActivity中新增如下程式碼:

  private static final String WEIXIN_ACCESS_TOKEN_KEY = "wx_access_token_key";
private static final String WEIXIN_OPENID_KEY = "wx_openid_key";
private static final String WEIXIN_REFRESH_TOKEN_KEY = "wx_refresh_token_key";
//微信登入  unity中呼叫該方法
public void weiLogin() {
WXEntryActivity.loginWeixin(MainActivity.this, MyApplication.sApi, new WXEntryActivity.WeChatCode() {
@Override
public void getResponse(String code) {
// 通過code獲取授權口令access_token
getAccessToken(code);
Log.i("獲取token成功",code.toString());
// 從手機本地獲取儲存的授權口令資訊,判斷是否存在access_token,不存在請求獲取,存在就判斷是否過期
String accessToken = (String) ShareUtils.getValue(MainActivity.this, WEIXIN_ACCESS_TOKEN_KEY,
"none");
String openid = (String) ShareUtils.getValue(MainActivity.this, WEIXIN_OPENID_KEY, "");
if (!"none".equals(accessToken)) {
// 有access_token,判斷是否過期有效
isExpireAccessToken(accessToken, openid);
} else {
// 沒有access_token
getAccessToken(code);
Log.i("獲取token成功",code.toString());
}
}
});
Log.i("登入成功","aaaaaaaaaaaaaaaaaaaaaaaaaa");
}
/**
* 微信登入獲取授權口令
*/
private void getAccessToken(String code) {
String url = "https://api.weixin.qq.com/sns/oauth2/access_token?"  
"appid="   AppConst.WEIXIN_APP_ID  
"&secret="   AppConst.WEIXIN_APP_SECRET  
"&code="   code  
"&grant_type=authorization_code";
// 網路請求獲取access_token
OkHttpUtils.get().url(url).build().execute(new StringCallback() {
@Override
public void onError(Call call, Exception e, int id) {
e.printStackTrace();
}
@Override
public void onResponse(String response, int id) {
// 判斷是否獲取成功,成功則去獲取使用者資訊,否則提示失敗
processGetAccessTokenResult(response);
}
});
}
/**
* 微信登入處理獲取的授權資訊結果
*
* @param response 授權資訊結果
*/
public void processGetAccessTokenResult(String response) {
// 驗證獲取授權口令返回的資訊是否成功
if (validateSuccess(response)) {
// 使用Gson解析返回的授權口令資訊
//  WXAccessTokenInfo tokenInfo = mGson.fromJson(response, WXAccessTokenInfo.class);
// 儲存資訊到手機本地
//  saveAccessInfotoLocation(tokenInfo);
// 獲取使用者資訊
//  getUserInfo(tokenInfo.getAccess_token(), tokenInfo.getOpenid());
} else {
// 授權口令獲取失敗,解析返回錯誤資訊
//  WXErrorInfo wxErrorInfo = mGson.fromJson(response, WXErrorInfo.class);
}
}
/**
*微信登入獲取tokenInfo的WEIXIN_OPENID_KEY,WEIXIN_ACCESS_TOKEN_KEY,WEIXIN_REFRESH_TOKEN_KEY儲存到shareprephence中
* @param tokenInfo
*/
private void saveAccessInfotoLocation(WXAccessTokenInfo tokenInfo) {
ShareUtils.saveValue(MyApplication.mContext,WEIXIN_OPENID_KEY,tokenInfo.getOpenid());
ShareUtils.saveValue(MyApplication.mContext,WEIXIN_ACCESS_TOKEN_KEY,tokenInfo.getAccess_token());
ShareUtils.saveValue(MyApplication.mContext,WEIXIN_REFRESH_TOKEN_KEY,tokenInfo.getRefresh_token());
}
/**
* 驗證是否成功
*
* @param response 返回訊息
* @return 是否成功
*/
private boolean validateSuccess(String response) {
String errFlag = "errmsg";
return (errFlag.contains(response) && !"ok".equals(response))
|| (!"errcode".contains(response) && !errFlag.contains(response));
}
/**
* 微信登入判斷accesstoken是過期
*
* @param accessToken token
* @param openid      授權使用者唯一標識
*/
private void isExpireAccessToken(final String accessToken, final String openid) {
String url = "https://api.weixin.qq.com/sns/auth?"  
"access_token="   accessToken  
"&openid="   openid;
OkHttpUtils.get().url(url).build().execute(new StringCallback() {
@Override
public void onError(Call call, Exception e, int id) {
}
@Override
public void onResponse(String response, int id) {
if (validateSuccess(response)) {
// accessToken沒有過期,獲取使用者資訊
getUserInfo(accessToken, openid);
                   //把請求到的資料傳遞到unity
UnityPlayer.UnitySendMessage("與安卓互動的C#指令碼掛載的物體名","函式名",response.toString());
Toast.makeText(getApplicationContext(),response.toString(),Toast.LENGTH_LONG).show();
} else {
// 過期了,使用refresh_token來重新整理accesstoken
refreshAccessToken();
}
}
});
}
/**
* 微信登入重新整理獲取新的access_token
*/
private void refreshAccessToken() {
// 從本地獲取以儲存的refresh_token
final String refreshToken = (String) ShareUtils.getValue(this, WEIXIN_REFRESH_TOKEN_KEY,
"");
if (TextUtils.isEmpty(refreshToken)) {
return;
}
// 拼裝重新整理access_token的url請求地址
String url = "https://api.weixin.qq.com/sns/oauth2/refresh_token?"  
"appid="   AppConst.WEIXIN_APP_ID  
"&grant_type=refresh_token"  
"&refresh_token="   refreshToken;
// 請求執行
OkHttpUtils.get().url(url).build().execute(new StringCallback() {
@Override
public void onError(Call call, Exception e, int id) {
System.out.println("重新整理獲取新的access_token資訊失敗!!!");
// 重新請求授權
weiLogin();
}
@Override
public void onResponse(String response, int id) {
// 判斷是否獲取成功,成功則去獲取使用者資訊,否則提示失敗
processGetAccessTokenResult(response);
}
});
}
/**
* 微信token驗證成功後,聯網獲取使用者資訊
* @param access_token
* @param openid
*/
private void getUserInfo(String access_token, String openid) {
String url = "https://api.weixin.qq.com/sns/userinfo?"  
"access_token="   access_token  
"&openid="   openid;
OkHttpUtils.get().url(url).build().execute(new StringCallback() {
@Override
public void onError(Call call, Exception e, int id) {
System.out.println("聯網獲取使用者資訊失敗!!!");
}
@Override
public void onResponse(String response, int id) {
// 解析獲取的使用者資訊
// WXUserInfo userInfo = mGson.fromJson(response, WXUserInfo.class);
System.out.println("獲取使用者資訊String是::::::" response);
}
});
}

我寫了一個類來存APPID和SECRET

新建一個MyApplication類來初始化微信登入和網路請求

public class MyApplication extends Application {
public static IWXAPI sApi;
public static Context mContext;
@Override
public void onCreate() {
super.onCreate();
mContext=this;
//初始化微信
sApi = WXEntryActivity.initWeiXin(this, AppConst.WEIXIN_APP_ID);
initOkHttp();
}
//封裝okhttp框架的初始化配置
private void initOkHttp() {
HttpsUtils.SSLParams sslParams = HttpsUtils.getSslSocketFactory(null, null, null);
CookieJarImpl cookieJar = new CookieJarImpl(new PersistentCookieStore(getApplicationContext()));
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.addInterceptor(new LoggerInterceptor("TAG"))
.cookieJar(cookieJar)
.connectTimeout(20000L, TimeUnit.MILLISECONDS)
.readTimeout(20000L,TimeUnit.MILLISECONDS)
.writeTimeout(20000L,TimeUnit.MILLISECONDS)
.sslSocketFactory(sslParams.sSLSocketFactory, sslParams.trustManager)
//其他配置
.build();
OkHttpUtils.initClient(okHttpClient);
}
}

mainfest裡初始化MyApplication

只要填寫正確的APPID以及簽名正確,就可以拉起微信登入頁面了。

四、微博登入

微博登入不光要匯入jar包,libs裡面的.so檔案也要匯入

這裡只講客戶端授權。

從官方demo中複製AccessTokenKeeper這個類到你的工程中。寫一個Constance類來存APPKEY

把這三個類也從官方的demo中複製過來,下面我貼上我刪減後的程式碼

public class WBAuthActivity extends Activity {
private static final String TAG = "weibosdk";
private AuthInfo mAuthInfo;
/** 封裝了 "access_token","expires_in","refresh_token",並提供了他們的管理功能  */
private Oauth2AccessToken mAccessToken;
/** 注意:SsoHandler 僅當 SDK 支援 SSO 時有效 */
private SsoHandler mSsoHandler;
/**
* @see {@link Activity#onCreate}
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mAuthInfo = new AuthInfo(this, Constants.APP_KEY, Constants.REDIRECT_URL, Constants.SCOPE);
mSsoHandler = new SsoHandler(WBAuthActivity.this, mAuthInfo);
// SSO 授權, 僅客戶端
WBLogin();
// 從 SharedPreferences 中讀取上次已儲存好 AccessToken 等資訊,
// 第一次啟動本應用,AccessToken 不可用
mAccessToken = AccessTokenKeeper.readAccessToken(this);
if (mAccessToken.isSessionValid()) {
updateTokenView(true);
}
}
/**
* 當 SSO 授權 Activity 退出時,該函式被呼叫。
*
* @see {@link Activity#onActivityResult}
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// SSO 授權回撥
// 重要:發起 SSO 登陸的 Activity 必須重寫 onActivityResults
//                   
//如果是sso授權登陸,必須先執行下面的回撥,然後才會執行監聽器裡的 回撥
if (mSsoHandler != null) {
mSsoHandler.authorizeCallBack(requestCode, resultCode, data);
}
}
private void WBLogin()
{
mSsoHandler.authorizeClientSso(new AuthListener());
}
/**
* 微博認證授權回撥類。
* 1. SSO 授權時,需要在 {@link #onActivityResult} 中呼叫 {@link SsoHandler#authorizeCallBack} 後,
*    該回撥才會被執行。
* 2. 非 SSO 授權時,當授權結束後,該回撥就會被執行。
* 當授權成功後,請儲存該 access_token、expires_in、uid 等資訊到 SharedPreferences 中。
*/
class AuthListener implements WeiboAuthListener {
@Override
public void onComplete(Bundle values) {
// 從 Bundle 中解析 Token
mAccessToken = Oauth2AccessToken.parseAccessToken(values);
UnityPlayer.UnitySendMessage("ThirdLoginGameobject","WeiboCallBack",values.toString());
//從這裡獲取使用者輸入的 電話號碼資訊 
//  String phoneNum =  mAccessToken.getUid();
if (mAccessToken.isSessionValid()) {
// 顯示 Token
updateTokenView(false);
} else {
// 以下幾種情況,您不會收到 Code:
// 1. 當您未在平臺上註冊的應用程式的包名與簽名時;
// 2. 當您註冊的應用程式包名與簽名不正確時;
// 3. 當您在平臺上註冊的包名和簽名與您當前測試的應用的包名和簽名不匹配時。
}
}
@Override
public void onCancel() {
}
@Override
public void onWeiboException(WeiboException e) {
}
}
/**
* 顯示當前 Token 資訊。
*
* @param hasExisted 配置檔案中是否已存在 token 資訊並且合法
*/
private void updateTokenView(boolean hasExisted) {
}
}

public class WBAuthCodeActivity extends Activity {
private static final String TAG = "WBAuthCodeActivity";
/**
* WeiboSDKDemo 程式的 APP_SECRET。
* 請注意:請務必妥善保管好自己的 APP_SECRET,不要直接暴露在程式中,此處僅作為一個DEMO來演示。
*/
/** 通過 code 獲取 Token 的 URL */
private static final String OAUTH2_ACCESS_TOKEN_URL = "https://open.weibo.cn/oauth2/access_token";
/** 微博 Web 授權介面類,提供登陸等功能  */
private AuthInfo mAuthInfo;
/** 獲取到的 Code */
private String mCode;
/** 獲取到的 Token */
private Oauth2AccessToken mAccessToken;
/**
* @see {@link Activity#onCreate}
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_auth_code);
// 初始化微博物件
mAuthInfo = new AuthInfo(this, Constants.APP_KEY, Constants.REDIRECT_URL, Constants.SCOPE);
}
/**
* 微博認證授權回撥類。
*/
class AuthListener implements WeiboAuthListener {
@Override
public void onComplete(Bundle values) {
if (null == values) {
return;
}
String code = values.getString("code");
if (TextUtils.isEmpty(code)) {
return;
}
mCode = code;
}
@Override
public void onCancel() {
}
@Override
public void onWeiboException(WeiboException e) {
}
}
/**
* 非同步獲取 Token。
* 
* @param authCode  授權 Code,該 Code 是一次性的,只能被獲取一次 Token
* @param appSecret 應用程式的 APP_SECRET,請務必妥善保管好自己的 APP_SECRET,
*                  不要直接暴露在程式中,此處僅作為一個DEMO來演示。
*/
public void fetchTokenAsync(String authCode, String appSecret) {
WeiboParameters requestParams = new WeiboParameters(Constants.APP_KEY);
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
new AsyncWeiboRunner(getApplicationContext()).requestAsync(OAUTH2_ACCESS_TOKEN_URL, requestParams, "POST", new RequestListener() {
@Override
public void onComplete(String response) {
// 獲取 Token 成功
Oauth2AccessToken token = Oauth2AccessToken.parseAccessToken(response);
if (token != null && token.isSessionValid()) {
mAccessToken = token;
String date = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(
new java.util.Date(mAccessToken.getExpiresTime()));
String format = token.toString();
} else {
}
}
@Override
public void onWeiboException(WeiboException e) {
}
});
}
}

 WBShareMainActivity繼承Activity為空即可。
在MainActivity的onCreate裡寫上
LogUtil.sIsLogEnable = true;
MainActivity里加上微博登入程式碼
//微博登入  Unity裡呼叫
public void WBLogin()
{
startActivity(new Intent(MainActivity.this, WBAuthActivity.class));
}

mainfest里加上

即可。

把MainActivity裡的程式碼整合到一起後,build

把libs裡的classes.jar刪掉,把紅框圈起來的classes.jar拖到libs資料夾裡,然後把libs,res和AndroidMainfest這三個檔案拖到Unity工程的Plugins/Android資料夾下。

然後在unity建立三個按鈕並新增點選事件

 public void OnQQBtnClick(ButtonScript obj, object args, object param1, object param2)
{
#if UNITY_IPHONE
c_thirdQQLogin();
#elif UNITY_ANDROID
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
jo.Call("QQlogin");
#endif
}
public void OnWeChatBtnClick(ButtonScript obj, object args, object param1, object param2)
{
#if UNITY_IPHONE
c_thirdLogin();
#elif UNITY_ANDROID
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
jo.Call("weiLogin");
#endif
}
public void OnWeiboBtnClick(ButtonScript obj, object args, object param1, object param2)
{
#if UNITY_IPHONE
c_thirdWeiboLogin();
#elif UNITY_ANDROID
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
jo.Call("WBLogin");
#endif
}

釋出安卓應用的時候記得簽名,不然微信和微博登入會報錯。

demo指令碼和jar包下載地址點選開啟連結