android第三方分享之友盟社会化组件
前言
1.1 社会化组件--分享内容到各大社交平台
支持主流的社交平台:新浪、微信、QQ空间、腾讯微博、豆瓣、人人、短信、邮箱等等。
二、具体步骤
1、获取友盟appkey
去友盟官网http://www.umeng.com注册开发者账号
如果你之前已经在友盟注册了应用,并获取到了Appkey,可以继续使用它.
如果你尚未在友盟注册开发者账号,需要先注册,注册之后登录你的账号,点击**添加新应用**,填写完应用基本信息后,将进入"下载SDK并添加代码"页面,此页面即可得到Appkey。
2、下载并安装sdk
下载最新版本sdk(友盟提供很多社交平台的分享集成,下载的时候只需勾选自己需要的社交平台)
添加代码和资源引用,友盟提供了添加资源文件和jar文件的两种方式,可以根据需求选择
方法一:
解压SDK压缩包,将文件夹中的'main/libs'和'main/res'文件夹复制到你的项目工程根目录下(如使用'ADT 17'以下用户需要手动添加'libs'下的jar文件到工程Path中)
注意:
1:QQ和QQ Zone SSO(免登录)引用的jar文件相同。当需要同时支持QQ和QQ Zone的时候,只需添加一次SocialSDK_QQZone_1.jar,SocialSDK_QQZone_2.jar,SocialSDK_QQZone_3.jar文件即可.
2:由于我们对微信的包名做了修改(libammsdk.jar -> SocialSDK_WeiXin.jar),如出现"Unable to execute dex: Multiple dex files define "问题,请删除libammsdk.jar或者SocialSDK_WeiXin.jar中的一个即可解决问题。
方法二:
解压SDK压缩包,将文件夹中的social_sdk_library_project文件夹导入Eclipse,并在您的工程中添加对此项目的引用即可。
注意:
social_sdk_library_project文件夹下包含所有平台jar包资源只添加自己需要的平台jar包,多余的删除
3、Manifest配置,添加友盟Appkey/Activity/权限
<!-- #######注册SDK使用的Activity######### --> <!--分享编辑页--> <activity android:name="com.umeng.socialize.view.ShareActivity" android:configChanges="orientation|keyboard" android:launchMode="singleTask" android:noHistory="true" android:theme="@style/Theme.UMDialog"
android:windowSoftInputMode="stateVisible|adjustResize" > </activity> <!-- ####QQ空间和QQ SSO授权的Activity注册 ##### --> <activity android:name="com.tencent.tauth.AuthActivity" /> <!-- 友盟AppKey, 需要替换成你自己的 --> <meta-data android:name="UMENG_APPKEY" android:value="566fb983e0f55a12cd001b84" > </meta-data> <!--####################友盟分享的相关权限 ##################--> <!-- 检测网络状态 --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 获取mac地址作为用户的备用唯一标识 --> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- 获取用户手机的IMEI,用来唯一的标识用户 --> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!-- 缓存资源优先存入SDcard --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 允许应用程序联网,以便向我们的服务器端发送数据 --> <uses-permission android:name="android.permission.INTERNET" />
4、编辑分享代码
首先要在各分享平台注册开发者账号,添加你的应用获得相应的appId和appSecret
然后替换到平台配置中
新浪微博需要在新浪微博开放平台申请应用,并且填写应用签名与包名审核通过,将申请获取的appkey及secret绑定在友盟主站后台。
(在友盟主站找到我的应用--组件--社会化分享--设置--社交平台配置)
下面是写好的一个友盟分享工具类
使用时直接调用
ShareUtils.shareUmeng(ct, shareTitle, summary, msgSinaContent, imageUrl, shareUrl); // 是否只有已登录用户才能打开分享选择页 ShareUtils.mController.openShare(NewsDetailActivity.this, false); /** * 友盟分享工具类 * shareUmeng * / public class ShareUtils { // 友盟分享平台的Controller,负责管理整个SDK的配置、操作等处理 public final UMSocialService mController = UMServiceFactory .getUMSocialService("com.umeng.share"); /** * 友盟分享 * shareUmeng * * @param context * @param msgTitle * @param msgText * @param imgPath * void */ public static void shareUmeng(Context context, String msgTitle, String msgContent, String msgSinaContent, String imgPath, String msgUrl){ // 配置需要分享的相关平台 configPlatforms(context); // 设置分享的内容 setShareContent(context, msgTitle, msgContent, msgSinaContent, imgPath, msgUrl); } /** * 根据不同的平台设置不同的分享内容</br> * @param context * @param imgPath * @param msgText * @param msgTitle * @param msgUrl */ private static void setShareContent(Context context, String msgTitle, String msgContent, String msgSinaContent, String imgPath, String msgUrl) { LogUtil.i("Share="+msgContent+imgPath+msgUrl); // 配置SSO mController.getConfig().setSsoHandler(new SinaSsoHandler()); //微信 WeiXinShareContent weixinContent = new WeiXinShareContent(); // 设置朋友圈分享的内容 CircleShareContent circleMedia = new CircleShareContent(); //新浪 SinaShareContent sinaContent = new SinaShareContent(); //本地图片 // UMImage localImage = new UMImage(context, R.drawable.ic_about_app); //url UMImage urlImage = new UMImage(context, imgPath); // 设置分享图片,参数2为本地图片的路径(绝对路径) // UMImage urlImage = new UMImage(context, BitmapFactory.decodeFile(imgPath)); weixinContent.setShareImage(urlImage); circleMedia.setShareImage(urlImage); sinaContent.setShareImage(urlImage); //添加微信分享内容 weixinContent.setShareContent(msgContent);//分享内容摘要 weixinContent.setTitle(msgTitle); //标题 weixinContent.setTargetUrl(msgUrl); //url mController.setShareMedia(weixinContent); //添加朋友圈分享内容 circleMedia.setShareContent(msgContent); circleMedia.setTitle(msgTitle); circleMedia.setTargetUrl(msgUrl); mController.setShareMedia(circleMedia); //添加新浪分析内容 sinaContent.setShareContent(msgSinaContent); sinaContent.setTitle(msgTitle); sinaContent.setTargetUrl(msgUrl); mController.setShareMedia(sinaContent); } /** * 配置分享平台参数</br> * @param context */ private static void configPlatforms(Context context) { // 添加新浪SSO授权 mController.getConfig().setSsoHandler(new SinaSsoHandler()); // 添加微信、微信朋友圈平台 addWXPlatform(context); // 打开分享选择页并设置分享平台顺序 mController.getConfig().setPlatforms(SHARE_MEDIA.WEIXIN, SHARE_MEDIA.WEIXIN_CIRCLE, SHARE_MEDIA.SINA); } /** * @param context * @功能描述 : 添加微信平台分享 * @return */ private static void addWXPlatform(Context context) { // 注意:在微信授权的时候,必须传递appSecret // wx967daebe835fbeac是你在微信开发平台注册应用的AppID, 这里需要替换成你注册的AppID String appId = "xxxxxxxxxxxxxxx";//这个填写通过的审核的APPID String appSecret = "xxxxxxxxxxxxxxxxxxxxxxx"; // 添加微信平台 UMWXHandler wxHandler = new UMWXHandler(context, appId, appSecret); wxHandler.addToSocialSDK(); // 支持微信朋友圈 UMWXHandler wxCircleHandler = new UMWXHandler(context, appId, appSecret); wxCircleHandler.setToCircle(true); wxCircleHandler.addToSocialSDK(); } }
在对应的activity中实现onActivityResult方法 /** * 如果有使用任一平台的SSO授权, 则必须在对应的activity中实现onActivityResult方法, 并添加如下代码 */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); /**使用SSO授权必须添加如下代码 */ UMSsoHandler ssoHandler = ShareUtils.mController.getConfig().getSsoHandler(requestCode) ; if(ssoHandler != null){ ssoHandler.authorizeCallBack(requestCode, resultCode, data); } } 注意onActivityResult方法必须写在分享所在的Activity或fragment依赖的Activity中,不可以直接写在fragment中
5、混淆
为了保证引用友盟Social SDK jar文件以及腾讯jar文件被混淆,请在proguard.cfg文件中添加以下代码避免被混淆.
-dontshrink -dontoptimize -dontwarn com.google.android.maps.** -dontwarn android.webkit.WebView -dontwarn com.umeng.** -dontwarn com.tencent.weibo.sdk.** -dontwarn com.facebook.** -keep enum com.facebook.** -keepattributes Exceptions,InnerClasses,Signature -keepattributes *Annotation* -keepattributes SourceFile,LineNumberTable -keep public interface com.facebook.** -keep public interface com.tencent.** -keep public interface com.umeng.socialize.** -keep public interface com.umeng.socialize.sensor.** -keep public interface com.umeng.scrshot.** -keep public class com.umeng.socialize.* {*;} -keep public class javax.** -keep public class android.webkit.** -keep class com.facebook.** -keep class com.facebook.** { *; } -keep class com.umeng.scrshot.** -keep public class com.tencent.** {*;} -keep class com.umeng.socialize.sensor.** -keep class com.umeng.socialize.handler.** -keep class com.umeng.socialize.handler.* -keep class com.tencent.mm.sdk.modelmsg.WXMediaMessage {*;} -keep class com.tencent.mm.sdk.modelmsg.** implements com.tencent.mm.sdk.modelmsg.WXMediaMessage$IMediaObject {*;} -keep class im.yixin.sdk.api.YXMessage {*;} -keep class im.yixin.sdk.api.** implements im.yixin.sdk.api.YXMessage$YXMessageData{*;} -dontwarn twitter4j.** -keep class twitter4j.** { *; } -keep class com.tencent.** {*;} -dontwarn com.tencent.** -keep public class com.umeng.soexample.R$*{ public static final int *; } -keep public class com.umeng.soexample.R$*{ public static final int *; } -keep class com.tencent.open.TDialog$* -keep class com.tencent.open.TDialog$* {*;} -keep class com.tencent.open.PKDialog -keep class com.tencent.open.PKDialog {*;} -keep class com.tencent.open.PKDialog$* -keep class com.tencent.open.PKDialog$* {*;} -keep class com.sina.** {*;} -dontwarn com.sina.** -keep class com.alipay.share.sdk.** { *; } -keepnames class * implements android.os.Parcelable { public static final ** CREATOR; }
6、更多详细文档参考友盟文档中心http://dev.umeng.com/social/android/operation
7、在程序入口加入**com.umeng.socialize.utils.Log.LOG = true**,可在LogCat中观察友盟日志
8、常用开放平台
微信开放平台:https://open.weixin.qq.com/
新浪开放平台:http://open.weibo.com/
腾讯开放平台:http://open.qq.com/
9、//设置打印友盟log日志
com.umeng.socialize.utils.Log.LOG = true;
//关闭友盟toast提示
mController.getConfig().closeToast();
结束
按照sdk的demo进行集成后,碰到几个大坑。现在总结下这些坑同时给出我的解决方法。
1、点击qq或空间分享,出现应用无响应(ANR)的情况。
解决方法:查查是否分享的图片参数是否已经设置,没有设置会出现ANR,设置后可以正常分享。title、url、 content等参数尽量都设置一下,以防出现其他莫名奇妙问题
2、微信分享不成功。现象是点击微信或朋友圈分享后,出现微信的界面,提示请稍候,然后一闪而过消失。查看logcat出现错误:
## get sso Handler, requestCode = 10086, 微信访问被拒绝(未知错误)-----------微信分享
## get sso Handler, requestCode = 10085, 微信访问被拒绝(未知错误)-----------微信朋友圈分享
解决方法:
这个看看应用md5签名和在微信开放平台上登记的md5签名是否一致。值得注意的是在开放平台上录入的md5签名必须没有冒号,同时应该全部是小写字母。请特别注意。如果是一致的话,还是不行的话,清空下微信缓存,再不行,重新安装应用或换手机测试。
3、新浪微博分享,web页面显示:你所访问的站点在微博的认证失败,请稍后再试。如有疑问,请联系XX。(error:redirect_uri_mismatch) 。这种问题往往发生在新提交了移动应用但未审核的情况下。
解决方法:需要在微博开放平台的应用基本信息中配置安全域名:sns.whalecloud.com。同时在高级信息中配置OAuth2.0 授权设置:
授权回调页:
http://sns.whalecloud.com/sina2/callback
取消授权回调页:
http://sns.whalecloud.com/sina2/callback
4、新浪微博开始分享后不久出现分享失败的错误,查看Logcat出现错误:sina : error,
User is not in platform app test list
解决办法:从日志错误来看,是提示用来分享的用户不在平台应用的测试账号列表中。这一般发生在未审核应用中。可以在应用的测试信息中添加测试账号来测试分享。
5、新浪微博分享,在安装微博客户端的时候,分享时总是提示“sso package or sign error”,而在未安装微博客户端的时候,在web auth授权页面又总是提示来自“来自友盟社会化组件”,而不是显示来自"XXX应用"。
解决办法:
1、检查应用包名和md5签名是否在新浪开放平台填写正确。
2、检查授权回调页是否填写正确
3、检查应用是否审核成功
4、检查友盟的分享设置页面,新浪微博分配的appkey和appsecret是否填写正确并正确绑定。
5、如果以上四个步骤都检查无误,但是还是出现来源错误的话检查Androidmanifest.xml中UMENG_APPKEY是否填写正确。