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

      

      

  • 相关阅读:
    【转】免费搭建独立博客,WordPress+独立域名+独立空间
    MongoDB索引
    面向对象
    浏览器为webapp
    转载Chrome浏览器IOS
    浅淡Webservice、WSDL三种服务访问的方式(附案例)
    Plupload
    转载Yale CAS + .net Client 实现 SSO(6)
    java 对Hbase的基本操作
    【精】iOS开发视频教程下载
  • 原文地址:https://www.cnblogs.com/wangshuaiandroid/p/5113620.html
Copyright © 2020-2023  润新知