友盟UMeng社會化分享SDK v5.0做出了巨大的改變,精簡了接口調用的代碼,結構更加清晰。但是官方文檔不是很完整,並且多出了授權部分的說明,所以僅需要分享功能的開發者需要看很多無用說明,這裏把分享功能的使用進行整理,並把官方文檔中沒有填的坑暴露出來,以幫助後來開發者。可以先看本文目錄在進行整體閱讀。
申請APP_KEY
登錄友盟,打開http://www.umeng.com/apps/new,添加應用,填寫信息,然後得到了一個友盟的app_key.
申請所需分享平臺的Appkey,比如QQ,微信,微博
本文所例舉的平臺只包括QQ,QZone,微信,朋友圈,微博5個平臺,更多平臺說明請訪問友盟官方文檔
地址如下:
(其他的開放平臺請自行搜索)
umeng友盟分享SDK文件介紹
下載umeng分享SDK:http://dev.umeng.com/social/android/sdk-download
解壓目錄結構如下:
- main:存放了必須使用的jar包和res文件
- platforms:存放了各個平臺必須用到的jar包和res文件
- social_sdk_example:UMeng友盟分享/授權demo源碼
- social_sdk_library_project:Eclipse中使用的依賴工程,Android Studio中我沒有用到這個工程作爲依賴,於是踩坑!!!
- debug.keystore:demo的簽名文件
- umeng_android_socialize_demo.apk:demo的apk
- v5.0_api.md:api說明文檔
social_sdk_library_project等下會用到
文件使用說明:
將main下的兩個jar包放入工程libs
將platforms中所需分享平臺的jar包和.so目錄放入工程libs
其中sina微博有用到.so類庫,請連同.so的目錄一同拷貝進libs,而不僅僅是拷貝.so文件,如果你的工程中有同名目錄,僅僅拷貝.so也是可以的。
Android Studio添加依賴
添加jar包依賴
compile files('libs/umeng_social_sdk.jar')
compile files('libs/httpmime-4.1.3.jar')
compile files('libs/SocialSDK_QQZone_3.jar')
compile files('libs/SocialSDK_WeiXin_1.jar')
compile files('libs/SocialSDK_WeiXin_2.jar')
compile files('libs/mta-sdk-1.6.2.jar')
compile files('libs/open_sdk_r5509.jar')
compile files('libs/SocialSDK_Sina.jar')
compile files('libs/weiboSDKCore_3.1.4.jar')
其他平臺請自行添加jar包和依賴。
添加so依賴
android{
sourceSets {
main {
jniLibs.srcDirs = ['libs']//就是你存放so文件夾的不同cup目錄地址
}
}
}
Android Studio中AndroidManifest清單配置
- 添加使用權限:
<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.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及其他數據
1.添加友盟的Activity和APP_KEY/APP_ID
<activity
android:name="com.umeng.socialize.editorpage.ShareActivity"
android:theme="@style/Theme.UMDefault"
android:excludeFromRecents="true"/>
<meta-data
android:name="UMENG_APPKEY"
android:value="4eaee02c527015373b000003" ><!--替換爲自己的友盟key-->
</meta-data>
以上Theme.UMDefault其實就是:Theme.NoTitleBar
2.添加微信分享需要的Activity
<activity
android:name="your_package_name.wxapi.WXEntryActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:exported="true"
android:launchMode="singleTop"
android:theme="@android:style/Theme.Translucent.NoTitleBar" >
</activity>
your_ package_name即你的應用包名,你必須新建一個wxapi的包,並新建WXEntryActivity這個類,可繼承Activity或其他Activity,UMeng建議繼承WXCallbackActivity,並整個類留空即可。
3.添加QQ,QZone分享需要的Activity
<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" /><!--TODO 修改爲自己的key-->
</intent-filter>
</activity>
<activity
android:name="com.tencent.connect.common.AssistActivity"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
4.添加微博分享需要的Activity
<activity
android:name="your_package_name.activity.WBShareActivity"
android:configChanges="keyboardHidden|orientation"
android:screenOrientation="portrait" >
<intent-filter>
<action android:name="com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name="com.sina.weibo.sdk.component.WeiboSdkBrowser"
android:configChanges="keyboardHidden|orientation"
android:windowSoftInputMode="adjustResize"
android:exported="false" >
</activity>
<!--in weibosdkcore_3.0.1.jar and before:xiong_it。微博SDK V3.1以後,剔除了這個Service,不用添加,否則報紅色,並且無法消除-->
<!--<service android:name="com.sina.weibo.sdk.net.DownloadService"
android:exported="false">
</service>-->
微博SDK V3.1以後,剔除了com.sina.weibo.sdk.net.DownloadService 這個類,所以儘管UMeng分享SDK V5給的demo中有這個service,它也是報紅色警告的,不用添加即可。
需新建一個WBShareActivity在任意包下,友盟建議繼承WBShareCallBackActivity
截至現在,清單文件配置完畢,清單裏只剩下修改QQ的key而已。其實,QQ的key無需修改也可正常分享。
初始化各分享平臺設置
友盟建議在自定義的Application中進行平臺配置的初始化,初始化代碼如下:
PlatformConfig.setWeixin("wx967daebe835fbeac", "5bb696d9ccd75a38c8a0bfe0675559b3");//微信 appid appsecret
PlatformConfig.setSinaWeibo("3921700954","04b48b094faeb16683c32669824ebdad");//新浪微博 appkey appsecret
PlatformConfig.setQQZone("100424468", "c7394704798a158208a74ab60104f0ba"); // QQ和Qzone appid appkey
開始愉快的進行分享了
1.使用友盟集成的分享面板:
不用自己寫分享彈出的面板及佈局
final SHARE_MEDIA[] displaylist = new SHARE_MEDIA[]
{
SHARE_MEDIA.WEIXIN, SHARE_MEDIA.WEIXIN_CIRCLE,SHARE_MEDIA.SINA,
SHARE_MEDIA.QQ, SHARE_MEDIA.QZONE
};
ShareAction action = new ShareAction(mActivity);
action.setDisplayList(displaylist);
action.withTitle("分享標題");
action.withText("分享文本內容");
action.withTargetUrl("http://blog.xiongit.com");//點擊分享內容打開的鏈接
action.withMedia(UMImage);//附帶的圖片,音樂,視頻等多媒體對象
action.setShareboardclickCallback(mShareBoardlistener);//設置友盟集成的分享面板的點擊監聽回調
action.open();//打開集成的分享面板
/**
* 友盟分享面板PopupWindow監聽器
*/
private ShareBoardlistener mShareBoardlistener = new ShareBoardlistener() {
@Override
public void onclick(SnsPlatform snsPlatform, SHARE_MEDIA share_media) {
ShareAction shareAction = new ShareAction(mActivity);
shareAction.setPlatform(share_media);
shareAction..setCallback(mUmShareListener);//設置每個平臺的點擊事件
shareAction.withTitle("分享標題");
shareAction.withText("分享文本內容");
shareAction.withTargetUrl("http://blog.xiongit.com");//點擊分享內容打開的鏈接
shareAction.withMedia(UMImage);//附帶的圖片,音樂,視頻等多媒體對象
shareAction.share();//發起分享,調起微信,QQ,微博客戶端進行分享。
}
};
// title在微博中無用,text在朋友圈中無用。但是加上也不影響分享。
/**
* 友盟分享後事件監聽器
*/
private UMShareListener mUmShareListener = new UMShareListener() {
@Override
public void onResult(SHARE_MEDIA platform) {
mTempActivity = null;
// TODO 分享成功
}
@Override
public void onError(SHARE_MEDIA platform, Throwable t) {
mTempActivity = null;
// TODO 分享失敗
}
@Override
public void onCancel(SHARE_MEDIA platform) {
mTempActivity = null;
// TODO 分享取消
}
};
2.使用自己的分享面板:
可以使用PopupWindow或者Dialog,裏面放置你需要分享的平臺圖標及描述,對圖標進行點擊監聽,點擊後,使用友盟進行分享.現在假如點擊的是微博圖標。示例代碼如下:
ShareAction action = new ShareAction(mActivity);
action.setPlatform(SHARE_MEDIA.SINA)
action.withTitle("分享標題");//標題在微博中無用,可不用寫
action.withText("分享文本內容");。
action.withTargetUrl("http://blog.xiongit.com");//點擊分享內容打開的鏈接
action.withMedia(UMImage);//附帶的圖片,音樂,視頻等多媒體對象
action.setCallback(mUmShareListener)//設置友盟分享後狀態監聽
action..share();//發起分享,調起微信,QQ,微博客戶端進行分享。
/**
* 友盟分享後事件監聽器
*/
private UMShareListener mUmShareListener = new UMShareListener() {
@Override
public void onResult(SHARE_MEDIA platform) {
mTempActivity = null;
// TODO 分享成功
}
@Override
public void onError(SHARE_MEDIA platform, Throwable t) {
mTempActivity = null;
// TODO 分享失敗
}
@Override
public void onCancel(SHARE_MEDIA platform) {
mTempActivity = null;
// TODO 分享取消
}
};
最後,對分享所在Activity的onActivityResult()重寫,無論是使用集成面板還是自定義面板都需要重寫
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
UMShareAPI.get( this ).onActivityResult( requestCode, resultCode, data);
}
咦,一點擊分享就崩潰了???
到此爲止,代碼看似沒有任何報錯,但是一點擊分享,就崩了!!並且log爲:
這裏寫代碼片
java.lang.RuntimeException: 獲取資源ID失敗:(packageName=包名 type=drawable name=umeng_socialize_tx_on
java.lang.RuntimeException: 獲取資源ID失敗:(packageName=包名 type=layout name=umeng_socialize_shareboard_item
log顯示缺少umeng_socialize_tx_on這個drawable,
log指示,com.umeng.socialize.common.ResContainer.getResourceId()報錯
缺少layout類型的資源文件,文件名稱爲:umeng_socialize_shareboard_item,於是我就納了悶了,怎麼會缺少文件呢?最後在social_sdk_library_project中找到了這個文件,放在自己工程中,結果又報了無數錯誤,格式通通如下:
java.lang.RuntimeException: 獲取資源ID失敗:(packageName=包名 type=?
name=umeng_socialize_xxx
解決辦法就是在最後在social_sdk_library_project中找到了對應文件,然後拷貝到工程即可。
大概拷貝十幾個文件就行。
終極解決辦法就是在Android Studio中添加social_sdk_library_project項目依賴。具體方法請參考:http://rocko.xyz/2014/12/13/Android-Studio-jar%E3%80%81so%E3%80%81library%E9%A1%B9%E7%9B%AE%E4%BE%9D%E8%B5%96/
本文原創作者xiong_it,本文鏈接:http://blog.csdn.net/Xiong_IT/article/details/50956025
結束了?
友盟分享講到這裏就結束了,代碼混淆部分友盟官網給了相關介紹。但是很想吐槽下各個開放平臺對待Android開發者的糟糕態度,API文檔更新不及時,甚至有的平臺都沒有API文檔,SDK使用文檔說明不清晰,demo源碼髒亂差。反觀對iOS開發者的態度,文檔更新夠快,Demo源碼稍好,demo功能全。現在許多Android開發者都使用了AS作爲開發工具,可是很多平臺的說明文檔還是以eclipse爲基準,希望這些在以後有所改觀。