1. 程式人生 > >友盟微社群2.1版本的接入

友盟微社群2.1版本的接入

應老大的要求,我開始正式接入友盟的微社群,從微社群的內測版1.2版本到現在的上線版2.1版本,我都幾乎全程參與了,在這其中也遇到了很多問題,比如自己的賬號系統和微社群中的第三方登入的賬戶系統整合、微信登陸爆機、賬號登出不成功等等……現在使用2.1版本的微社群SDK已經可以基本實現社群的功能了。下面我來分享下自己是如何接入的:

1、微信登陸爆機或者不成功

        在這裡需要注意下,可能你的微信登陸不成功或者爆機,很可能原因就是Mainfest檔案中的:

<!-- 微信登入 -->
<activity    android:name=".wxapi.WXEntryActivity"    
android:configChanges="keyboardHidden|orientation|screenSize"    
android:exported="true"    
android:screenOrientation="portrait"    
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
這裡注意這段程式碼不能修改,即使修改的和這樣的一樣也不行(至於原因我也不是很清楚)。。。

如圖所示,微信的回撥類要對應在包名.wxapi 類中。

當然,微信登陸成功的前提是你獲得了微信登陸許可權……這裡就不多說了

記得在使用時將你的微信appKey和values填入:

 protected void useSocialLogin() {

        String wxappId = "xxxxxxxxxxxxxxxxx";
        String wxappSecret = "xxxxxxxxxxxxxxxxxxxxxxxx";
        new UMWXHandler(getApplicationContext(), wxappId,
                wxappSecret).addToSocialSDK();
    }


下面,我們來看看接入微社群的程式碼吧:

2、使用自己的賬號系統來接入微社群,實現登陸時跳轉到自己的登陸頁面

 LoginSDKManager.getInstance().addAndUse(new CustomLoginImpl());

CustomLoginImpl是自定義實現登入系統,實現Loginable中的三個方法。

SDK內部在登入時會呼叫login函式,如果你的登入介面是Activity, 那麼需要自己將LoginListener傳遞給你的登入Activity並且最後將結果回撥給微社群SDK,登入成功那麼返回碼為200,否則視為登入失敗。 

 另外需要注意的是是否登入的標識應該儲存到本地,而不應該儲存在記憶體中。如果儲存在記憶體中,那麼下次重新進入應用是 isLogin被置為false,造成重複登入。

public class CustomLoginImpl implements Loginable {
    // !不要使用成員變數儲存是否登入的狀態,應該儲存在本地
    private boolean isLogin = false;

    @Override
    public void login(Context context, final LoginListener listener) {
        // 跳轉到你的Activity
        if (!MC.pref.getBooleanShareData("isLogin", false))
        {
            // 包裝一下Listener
       CustonLoginActivitysLoginListener = new LoginListener() {

            @Override
            public void onStart() {
                listener.onStart();
            }

            @Override
            public void onComplete(int stCode, CommUser userInfo) {
                if (stCode == 200) {
                    isLogin = true;
                }
                setUmengPush(userInfo);
                listener.onComplete(stCode, userInfo);
            }
        };

            Intent intent = new Intent(context,CustonLoginActivity.class);
            intent.putExtra("isOpenLoginView", true);
            context.startActivity(intent);
        } else
        {
            String userInfo = MC.pref.getStringShareData("user", true);
            JSONObject testData = null;
            try
            {
                testData = new JSONObject(userInfo);
            } catch (JSONException e)
            {
                e.printStackTrace();
            }
            UserNode userNode = new UserNode(testData);
            // 注意使用者id、暱稱、source是必填項
            CommUser user = new CommUser(Logic.UID);
            user.id = Logic.UID;
            // 登入的來源.可使用值參考文件中SOURCE的取值說明
            user.source = Source.SELF_ACCOUNT;
            user.name = userNode.getNickName();
            user.customField = userNode.getEmail();
            RL.d("--->", "資訊--id==" + user.id + "--source==" + user.source + "--name==" + user.name);
            // 如果沒有頭像地址,可不傳遞
            user.iconUrl = ServerCfg.IMAGE_PREFIX + userNode.getUserIcon();
            isLogin = true;
            setUmengPush(user);
            listener.onComplete(200, user);
        }
    }

    @Override
    public void logout(Context context, LoginListener listener) {
        Log.d("", "### 登出登入 ");
        MC.pref.storeBooleanShareData("isLogin", false);
        MC.pref.storeShareData("user", new UserNode().toJSONObject().toString().getBytes());
        //置空微社群的賬號
        cleanUmCommUser();
        isLogin = false;
        listener.onComplete(200, null);
    }

    @Override
    public boolean isLogined(Context context) {
        Log.d("", "### 這裡需要將是否已經登入的狀態存到本地,避免下次重新進入應用是 isLogin被置為false");
        if (MC.pref.getBooleanShareData("isLogin", false))
            isLogin = true;
        else isLogin = false;
        return isLogin;
    }

    /**
     * 設定微社群的推送功能功能
     * 
     * @param user
     */
    private void setUmengPush(CommUser user)
    {
        UmengPushImpl umengPushImpl = new UmengPushImpl();
        umengPushImpl.enable(MC.application);
        umengPushImpl.setUserAlias(user);
        PushSDKManager.getInstance().addAndUse(umengPushImpl);
    }

    /**
     * 清空友盟微社群的使用者資訊
     */
    private void cleanUmCommUser()
    {
        // 清空SDK內部儲存的使用者資訊
        CommonUtils.logout();
        // 置空使用者資訊
        CommConfig.getConfig().loginedUser = new CommUser();
    }

}

CustonLoginActivity就是你的登陸頁面對應的Activity,在登陸成功銷燬這個Activity時,把使用者資訊回撥給社群SDK:
 /**
     * 模擬使用者登入操作,自定義過程中使用者可以構造使用者名稱、密碼輸入介面
     */
    private void mockLoginData() {
        Log.d("", "### 使用自己的賬戶系統登入,然後將標識使用者唯一性的id和source傳遞給社群SDK ");
        Random random = new Random();
        CommUser loginedUser = new CommUser();
        String userId = "id" + random.nextInt(Integer.MAX_VALUE);
        loginedUser.id = userId; // 使用者id
        loginedUser.name = "name" + random.nextInt(Integer.MAX_VALUE); // 使用者名稱
        loginedUser.source = Source.SELF_ACCOUNT;// 登入系統來源
        loginedUser.gender = Gender.FEMALE;// 使用者性別
        loginedUser.level = random.nextInt(100); // 使用者等級
        loginedUser.score = random.nextInt(100);// 積分
        
        if (sLoginListener != null) {
            // 登入完成回撥給社群SDK,200代表登入成功
            sLoginListener.onComplete(200, loginedUser);
        }
    }
這樣就可以使用自己的登陸頁面來登陸進入微社群啦,快來試試吧~

3、使用微社群登陸賬號登出不了(切換為別的賬號後,仍然是第一次登陸的賬號)

這裡需要在退出登陸的時候,置空微社群中的賬號,程式碼如下:

        // 清空SDK內部儲存的使用者資訊
        CommonUtils.logout();
        // 置空使用者資訊
        CommConfig.getConfig().loginedUser = new CommUser();