android第三方分享之友盟社会化组件

前言

  现在几乎所有的app都带有分享功能,第一为了更好地推广自己的产品,第二作为使用者也能及时的把自己觉得好的文章,话题,app分享到社交平台供大家一起学习和使用。开发中虽然android系统自带分享功能,可以直接调用。但是系统的功能和平台往往不是很符合客户需求和人性化设计。所以很多第三方分享平台应运而生。今天重点学习一下友盟的社会化组件分享功能的实现。

 

声明
  欢迎转载,但请保留文章原始出处:) 
    博客园:http://www.cnblogs.com/wangshuaiandroid/
 
正文
  一、实现目标 

    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是否填写正确。

  

  

 

posted @ 2016-03-30 15:14  有丶丶小帅  阅读(3665)  评论(0编辑  收藏  举报
Live2D