1. 程式人生 > 實用技巧 >Unity 多平臺原生SDK接入速覽(五):微博

Unity 多平臺原生SDK接入速覽(五):微博

ZeroyiQ:Unity 多平臺原生SDK接入速覽(一):微信開放平臺

ZeroyiQ:Unity 多平臺原生SDK接入速覽(二):QQ互聯

ZeroyiQ:Unity 多平臺原生SDK接入速覽(三):Facebook

ZeroyiQ:Unity 多平臺原生SDK接入速覽(四):Twitter

一、前言

官方平臺申請開發者賬號,簡單填寫就可以,當前(2020-7-17)個人開發者可以快速申請下來。建立對應的應用,獲取對應的 AppKey。 要注意的是必須得填寫 Android 包名和簽名,才能正確的授權。填寫位置在應用介面的【應用資訊】-【基本資訊】。

  • Android 包名獲取方式:在工程主 modules 的 build.gradle 檔案(apply plugin 值為 'com.android.application') 中 applicationId 的值。
  • Android 簽名獲取方式:SDK 專案中整合工具 包含了獲取簽名的應用 apk,可以通過包名獲取應用的簽名。至於簽名的知識可以看看這個部落格

二、SDK 接入

1. 配置依賴

build.gradle[Project]

allprojects {
    repositories {
        maven { url "https://dl.bintray.com/thelasterstar/maven/" }
    }
}

build.gradle[Module]

android {
    defaultConfig {
        ndk {
            abiFilters 'armeabi' //, 'armeabi-v7a','arm64-v8a'
        }
    }
}

dependencies {
    implementation 'com.sina.weibo.sdk:core:10.7.0:openDefaultRelease@aar'
}

2. 新增許可權

AndroidManifest.xml

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

3. 初始化

public static final String WB_APP_KEY = "應用 AppKey";  // 應用 APPKey
public static final String WB_REDIRECT_RUL = "http://www.sina.com"; // 必須和圖中後臺設定的授權一致
public static final String WB_USER_SCOPE = "email,direct_messages_read,direct_messages_write,"; // 作用域

private void init() {
    AuthInfo authInfo = new AuthInfo(activity, WB_APP_KEY, WB_REDIRECT_RUL, WB_USER_SCOPE);
    wbApi = WBAPIFactory.createWBAPI(activity);
    wbApi.registerApp(activity, authInfo);
}

三 登入

發起登入授權請求,可以選擇只通過網頁,或者客戶端授權,也可以讓 SDK 自動選擇授權方式。

private void startAuth(){
    // 自動選擇授權(網頁 or 客戶端)
    wbApi.authorize(new WbAuthListener() {
            @Override
            public void onComplete(Oauth2AccessToken oauth2AccessToken) {
                UnityCallApi.unityLogInfo(TAG, "Login successful.");
                AccessTokenHelper.writeAccessToken(activity, oauth2AccessToken);  // 儲存 TOKEN
                UnityCallApi.sendLoginInfoToUnity(true, String.format("id:%s username: %s ", oauth2AccessToken.getUid(), oauth2AccessToken.getScreenName()));
            }

            @Override
            public void onError(UiError uiError) {
                UnityCallApi.unityLogError(TAG, "Login error." + uiError.errorCode + uiError.errorCode);
                UnityCallApi.sendLoginInfoToUnity(false, "");
            }

            @Override
            public void onCancel() {
                UnityCallApi.unityLogInfo(TAG, "Login cancel.");
            }
    });
    // 通過客戶端授權
    //wbApi.authorizeClient(new WbAuthListener()){
    //     ...
    // }

    // 通過網頁授權
    // wbApi.authorizeWeb(new WbAuthListener()){
    //     ...
    // }
}

設定授權回撥,重寫 Activity 的 OnActivityResult。

@Override
 protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    if (wbApi != null) {
        wbApi.authorizeCallback(requestCode, resultCode, data);
    }
    super.onActivityResult(requestCode, resultCode, data);
 }

四、獲取使用者資訊

在授權登入的時候返回資訊中已經包含了使用者最基本的,Uid 和ScreenName。

如果還需要更詳細的資訊,需要自己申請 通過官方SDK維護人員驗證,得知目前 API(10.7.0)已經不再直接提供獲取使用者資訊的介面(UsersApi.Show)了,需要自己根據文件傳送 GET 請求。

五、分享

實現分享回撥介面

private static class ShareCallback implements WbShareCallback {

        @Override
        public void onComplete() {
            UnityCallApi.unityLogInfo(TAG, "shared successful.");
        }

        @Override
        public void onError(UiError uiError) {
            UnityCallApi.unityLogError(TAG, String.format("shared error. code:%s msg:%s", uiError.errorCode, uiError.errorMessage));
        }

        @Override
        public void onCancel() {
            UnityCallApi.unityLogInfo(TAG, "shared cancel.");
        }
    }

設定分享回撥,重寫 Activity 的 OnActivityResult。

@Override
 protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    if (wbApi != null) {
        wbApi.authorizeCallback(requestCode, resultCode, data);
        // 分享回撥
        wbApi.doResultIntent(data, new ShareCallback());
    }
    super.onActivityResult(requestCode, resultCode, data);
 }

1.文字

public void shareText(Bundle params) {
    TextObject textObject = new TextObject();
    textObject.text = "分享文字內容";

    WeiboMultiMessage message = new WeiboMultiMessage();
    message.textObject = textObject;
    boolean isOnlyClient = false; // 是否只允許客戶端分享,不使用網頁分享
    wbApi.shareMessage(message, isOnlyClient);
}

2.圖片

public void shareImage(Bundle params) {
    ImageObject imageObject = new ImageObject();
    Bitmap data = // 需要分享的圖片
    imageObject.setImageData(data);

    WeiboMultiMessage message = new WeiboMultiMessage();
    message.imageObject = imageObject;
    wbApi.shareMessage(message, false);
}

3.網頁

public void shareWebLink(Bundle params) {
    WebpageObject webpageObject = new WebpageObject();
    webpageObject.identify = UUID.randomUUID().toString();
    webpageObject.title = "標題";
    webpageObject.description = "描述";
    webpageObject.actionUrl = "網頁連結";
    webpageObject.defaultText = "分享網頁";

    WeiboMultiMessage message = new WeiboMultiMessage();
    message.mediaObject = webpageObject;
    wbApi.shareMessage(message, false);
}

六、總結

微博的SDK居然意外的封裝的很好,使用起來也比較的簡單省心。就是官方 SDK 倉庫有點亂, 2019 SDK 資料夾下應該才算是最新的 SDK10.7.0,裡面的 PDF 文件由於匯出問題,程式碼部分顯示有所缺失。所以最好還是以官方 Demo 為參考物件。

七、引用

  1. 微博開放平臺
  2. 官方 SDK 倉庫
  3. 微博 API
  4. 官方文件 Scope 說明