1. 程式人生 > >學習筆記之——友盟社會化元件精簡版整合qq微信新浪微博

學習筆記之——友盟社會化元件精簡版整合qq微信新浪微博

        用過友盟社會化元件SDK的小夥伴們肯定都知道友盟在推出精簡版SDK之前jar包是很大的,在小型專案使用還沒什麼大問題,但是如果公司的專案本身就比較大型那就非常容易出現Dex方法數量超過65536的現象了。但是很開心的是友盟在2016年9月23號推出了Android 社會化元件SDK v6.0.0    友盟官方對此版本的描述是:

功能更新:
新浪微博推出了精簡版,相比原生sdk體積減小57%
微信推出精簡版,去除了支付的內容,避免個人開發者上傳應用市場被拒問題,相比原生sdk體積減小43%
qq推出了精簡版,相比原生sdk體積減小35%
修復記憶體洩露問題
修復新浪微博精簡版本地圖片分享失敗、重複授權問題,及微信獲取使用者資料提示未授權問題
增加了整合工具,降低整合難度
增加了自檢工具,方便開發者排查一些常見問題
增加android studio版demo,優化體驗
微信推出精簡版,去除了支付的內容,避免個人開發者上傳應用市場被拒問題

        接著來看看友盟官方文件對完整版和精簡版的對比:
以下資訊是基於6.0.4以後的版本

1.微信
型別	                       精簡版	                             完整版
jar大小	                       38.09k	                             235.32k
是否包含支付	不包含(需要額外引入微信支付的jar)	包含(不許額外引入微信支付的jar)
2.新浪
型別	          精簡版	完整版
jar大小	          17.82k	701.21k
.so檔案	          不需要	需要
3.QQ
型別	          精簡版	完整版
jar大小      	  46.89k	348.65k

AndroidManifest(精簡版):

<activity
        android:name="com.umeng.qq.tencent.AuthActivity"
        android:launchMode="singleTask"
        android:noHistory="true" >
        <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="tencent100424468" />
        </intent-filter>
    </activity>
    <activity
        android:name="com.umeng.qq.tencent.AssistActivity"
        android:screenOrientation="portrait"
        android:theme="@android:style/Theme.Translucent.NoTitleBar"
        android:configChanges="orientation|keyboardHidden|screenSize"/>


AndroidManifest(完整版):

<activity
        android:name="com.tencent.tauth.AuthActivity"
        android:launchMode="singleTask"
        android:noHistory="true" >
        <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="tencent100424468" />
        </intent-filter>
    </activity>
    <activity
        android:name="com.tencent.connect.common.AssistActivity"
        android:screenOrientation="portrait"
        android:theme="@android:style/Theme.Translucent.NoTitleBar"
        android:configChanges="orientation|keyboardHidden|screenSize"/>


        看到精簡版的體積一下子減少了不少我就感覺迫不及待下個新版本的SDK來玩玩啦~   以下所說是我下載友盟社會化元件Android v6.0.3版本

        友盟sdk下載網址http://dev.umeng.com/social/android/sdk-download

        果然,不僅是體積減小了,就連集合步驟也精簡了一些,所以寫下本篇文章記錄一下友盟社會化元件精簡版的整合過程,以方便後期專案整合參考。接下來上步驟和程式碼

        下載SDK時選擇自己需要的平臺選擇精簡版點選下載即可,此處我主要使用的是qq、微信、新浪微博三方,可以看出友盟的jar被一分為三了,以下三個便是友盟社會化的jar包:    然後其他三方只需要以下幾個jar包即可搞定授權和分享:

         第一步:下載所需SDK解壓後把資料夾裡面的res/src/lib資源拷貝到自己的專案中,我個人比較習慣先匯入官方demo測試看看效果,然後從官方demo裡面copy清單檔案資原始檔等內容到自己專案中,當然也可以跟著文件一步一步copy。(好處來了,微博精簡版不需要像完整版那麼複雜配置清單檔案,因為根本不用配置嘿嘿~)

         新增許可權:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_LOGS" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.SET_DEBUG_APP" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
        微信:
<activity
        android:name=".wxapi.WXEntryActivity"
        android:configChanges="keyboardHidden|orientation|screenSize"
        android:exported="true"
        android:screenOrientation="portrait"
        android:theme="@android:style/Theme.Translucent.NoTitleBar" />
        qq精簡版:(注意此處和完整版有區別)
<activity
        android:name="com.umeng.qq.tencent.AuthActivity"
        android:launchMode="singleTask"
        android:noHistory="true" >
        <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="tencent100424468" />
        </intent-filter>
    </activity>
    <activity
        android:name="com.umeng.qq.tencent.AssistActivity"
        android:screenOrientation="portrait"
        android:theme="@android:style/Theme.Translucent.NoTitleBar"
        android:configChanges="orientation|keyboardHidden|screenSize"/>
         分享編輯頁:
<activity
        android:name="com.umeng.socialize.editorpage.ShareActivity"
        android:theme="@style/Theme.UMDefault"
        android:excludeFromRecents="true"
        />
         友盟appkey:
<meta-data
            android:name="UMENG_APPKEY"
            android:value="57bea46be0f55a1183001301" >
        </meta-data>
         在專案新建一個MyApplication繼承Application,然後配置三方平臺的appkey:
{
    PlatformConfig.setWeixin("wx967daebe835fbeac", "5bb696d9ccd75a38c8a0bfe0675559b3");
    PlatformConfig.setSinaWeibo("3921700954", "04b48b094faeb16683c32669824ebdad");
    PlatformConfig.setQQZone("100424468", "c7394704798a158208a74ab60104f0ba");
}
        MyApplication中初始化sdk,這個初始化最好放在application的程式入口中,防止意外發生:   
    UMShareAPI.get(this);

         第二步:是否已經有友盟賬號和應用,沒有的話需要先註冊賬號建立應用,然後修改清單檔案的value為自己友盟平臺的appkey

<meta-data
            android:name="UMENG_APPKEY"
            android:value="57bea46be0f55a1183001301" >//修改成自己的appkey
        </meta-data>
          是否有qq、微信和微博開發者平臺的賬戶和各個平臺授權登入分享的許可權,沒有的話也需要一一去註冊然後建立應用,然後提交稽核即可,不過在此處比較坑的是微信平臺啦~除非公司有賬號,不然就得掏你自己的腰包花掉300塊人民幣大洋啦。

          第三步:接下來講講我在這三個平臺上面的配置步驟和需要注意的地方吧!

1.精簡版qq整合是最簡單的了

精簡版的qq整合基本上沒什麼好說的,步驟和完整版一樣,jar包少了,註冊賬號完成建立應用後即可填寫包名了,然後提交稽核把appid和key複製到MyApplication之前配置好的三方平臺的appkey中的qq平臺即可
PlatformConfig.setQQZone("100424468", "c7394704798a158208a74ab60104f0ba");

2.精簡版微信整合

微信授權的整合應該是友盟社會化最容易出現錯誤的一部分吧!不管是論壇的反應還是自身專案的整合都是相對比較其他平臺更容易出現bug的。

首先一步一步跟著友盟官方文件操作,先去微信平臺註冊一個賬號,然後繳費300rmb獲取授權和分享的許可權,得到AppIDAppSecret

 

建立應用,填寫正確的應用簽名應用包名     

然後同QQ平臺一樣在MyApplication配置好的三方平臺的appkey中的微信平臺,

PlatformConfig.setWeixin("100424468", "c7394704798a158208a74ab60104f0ba");
記得貼上回撥類,相信用過完整版的小夥伴們肯定知道檢查微信回撥WXEntryActivity是否是在包名路徑下,例如你的包名是com.a.b,那麼這個activity應該放在com.a.b.wxapi資料夾下

其實配置微信需要更多的細心,多多看文件哈~      http://dev.umeng.com/social/android/快速整合文件

3.精簡版新浪微博整合需要注意:

(1).檢查是否加入了onActivityResult中對應的程式碼,注意要寫在activity中,不要放在fragment中。

(2).新浪微博精簡版appkey需要在友盟後臺進行配置,如下圖所示:

(3)在MyApplication配置好的三方平臺的appkey中的微博平臺

PlatformConfig.setSinaWeibo("100424468", "c7394704798a158208a74ab60104f0ba");

授權程式碼:

/* *******************第三方登入開始*******************************/
	private void loginThirdParty(SHARE_MEDIA platform) {
		/**begin invoke umeng api**/
		mShareAPI.doOauthVerify(this, platform, umAuthListener);
	}
	
	/** auth callback interface**/
    private UMAuthListener umAuthListener = new UMAuthListener() {
        @Override
        public void onComplete(SHARE_MEDIA platform, int action, Map<String, String> data) {
            for (String key : data.keySet()) {
                Log.e("key:", "xxxxxx key = "+key+"    value= "+data.get(key));
            }
            Toast.makeText(getApplicationContext(), "Authorize succeed", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onError(SHARE_MEDIA platform, int action, Throwable t) {
            Toast.makeText( getApplicationContext(), "Authorize fail", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onCancel(SHARE_MEDIA platform, int action) {
            Toast.makeText( getApplicationContext(), "Authorize cancel", Toast.LENGTH_SHORT).show();
        }
    };
	/** delauth callback interface**/
    private UMAuthListener umdelAuthListener = new UMAuthListener() {
        @Override
        public void onComplete(SHARE_MEDIA platform, int action, Map<String, String> data) {
            Toast.makeText(getApplicationContext(), "delete Authorize succeed", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onError(SHARE_MEDIA platform, int action, Throwable t) {
            Toast.makeText( getApplicationContext(), "delete Authorize fail", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onCancel(SHARE_MEDIA platform, int action) {
            Toast.makeText( getApplicationContext(), "delete Authorize cancel", Toast.LENGTH_SHORT).show();
        }
    };
	@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        mShareAPI.HandleQQError(this,requestCode,umAuthListener);
        mShareAPI.onActivityResult(requestCode, resultCode, data);
    }
/********************第三方登入結束*******************************/
使用平臺:
platform = SHARE_MEDIA.SINA;
loginThirdParty(platform);

分享程式碼:
/***********************  友盟分享    *******************************/	
    private UMShareListener umShareListener = new UMShareListener() {
        @Override
        public void onResult(SHARE_MEDIA platform) {
            Log.d("plat","platform"+platform);
            if(platform.name().equals("WEIXIN_FAVORITE")){
                Toast.makeText(CaijingDetailActivity.this,platform + "收藏成功",Toast.LENGTH_SHORT).show();
            }else{
                Toast.makeText(CaijingDetailActivity.this, platform + "分享成功", Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onError(SHARE_MEDIA platform, Throwable t) {
            Toast.makeText(CaijingDetailActivity.this,platform + "分享失敗", Toast.LENGTH_SHORT).show();
            if(t!=null){
                Log.e("throw","throw:"+t.getMessage());
            }
        }

        @Override
        public void onCancel(SHARE_MEDIA platform) {
            Toast.makeText(CaijingDetailActivity.this,platform + "分享取消", Toast.LENGTH_SHORT).show();
        }
    };
	
	@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        /** attention to this below ,must add this**/
        UMShareAPI.get(this).onActivityResult(requestCode, resultCode, data);
        Log.d("result","onActivityResult");
    }
/***********************  友盟分享    *******************************/

使用:
SHARE_MEDIA[] share_media = {SHARE_MEDIA.WEIXIN,SHARE_MEDIA.WEIXIN_CIRCLE,SHARE_MEDIA.QQ,SHARE_MEDIA.QZONE,SHARE_MEDIA.SINA};
//TODO 分享到,分享內容欄位
	private void sharTo(int position) {
		new ShareAction(this)
		.withTitle("分享")                           //分享的標題
		.withText(datas.get(position).getTitle())      //分享的文字
		.setPlatform(share_media[position])            //分享的平臺
		.withTargetUrl(url)                            //分享的連結內容
		.setCallback(umShareListener)                  //回撥
		.share();
	}

 4.整合過程中一些常見錯誤

1.  資原始檔找不到

這是由於老版本升級到6.0,對應資原始檔沒有拷入,在下載的精簡版sdk包裡面有res/src/lib等相關資原始檔拷貝到專案中即可

2.  微信授權一直等待,不成功

是否在包名路徑下加入了回撥activity並呼叫UmengTool.getSignature(activity)這個方法列印程式簽名和包名,與微信後臺的包名簽名做對比,看是否一樣,如果仍然有問題,把列印截圖跟微信後臺截圖給客服人員。 呼叫UmengTool.getSignature(activity)如下圖所示:

微信開發者平臺簽名如下圖所示:

3.  微信授權或分享之後沒有回撥

1.你可以呼叫 UmengTool.checkWx(this)檢查是否配置成功 

2.檢查微信回撥WXEntryActivity是否是在包名路徑下,例如你的包名是com.a.b,那麼這個activity應該放在com.a.b.wxapi資料夾下

4.  微信分享連結顯示為空

這是由於沒有設定title,所以title為空不是連結為空 

2.如果開了混淆需要加入附錄中的混淆檔案

5.  微博分享出現error, User is not in platform app test list

應用沒有稽核通過,需要在微博後臺新增測試賬號或者提交應用稽核通過即可

demo下載地址:http://download.csdn.net/detail/lxlyhm/9690423