前言

在如今的APP或者游戏中,分享功能差点儿已经成为标配。分享功能不但能够满足用户的需求。也能够为产品带来很多其它的用户,甚至能够对用户的行为、活跃度、年龄段等情况进行数据统计,使得软件公司能够对产品进行更精准的定位。今天我们就来简单剖析市场上一款优秀的分享SDK以及其集成过程。这款分享SDK就是友盟的社会化分享组件。

友盟社会化分享,帮助移动应用高速具备分享、登录、评论、喜欢等社交功能,提升用户粘度、助力产品推广,并提供实时、全面的社会化数据统计分析服务。

很多其它请訪问友盟社会化组件官网

基本概念

依据友盟的集成文档。我们对于友盟社会化分享SDK的操作主要是通过UMSocialService接口来进行操作,一些相关的配置则须要通过SocialzieConfig类来进行配置。这个配置类通过UMSocialService的getConfig()函数来获得。在友盟社会化分享SDK中一个社交平台通过SHARE_MEDIA枚举来标识。比方新浪微博就是SHARE_MEDIA.SINA。微信就是SHARE_MEDIA.WEIXIN。通过这个平台枚举我们就知道了用户是要将内容分享到哪个社交平台,至于为什么是用枚举。我想可能是由于老代码的遗留问题吧。而为了增强平台的可扩展性,友盟又添加了一个UMSsoHandler 。通过这个类来包装社交平台的分享、SSO登录等操作。

因此。我们得到例如以下几张结构图:

图1

从图1中能够看出,SDK的核心控制类中含有一个配置类,该配置类管理SDK中的各个社交平台,因此假设我们要支持分享到某个平台。必须将该平台加入到SDK的配置类中。假设不须要某个平台。就将该平台从SDK配置类中删除就可以。

        

图2 图3

图2和图3各自是授权和分享的基本流程。

对于授权来说,假设该平台仅仅有webview授权,那么就是用webview进行授权。假设该平台既支持webview授权又支持SSO授权 ( 即通过client来授权 ),在用户没有配置SSO授权的情况下是用webview授权,否则是用SSO授权。假设该平台仅仅是SSO授权。那么在client的版本号支持的情况就会是用SSO授权。而SSO授权都是通过UMSsoHandler这个类来进行操作的。再看图3。分享也是两个分支。即通过API进行分享和通过社交平台client分享,比如豆瓣仅仅支持API分享,而微信仅仅支持通过client进行分享。通过client进行分享也是通过UMSsoHandler这个类。

总结一下:

SDK中含有配置类。配置类管理各个社交平台。

当用户要把内容分享到某个社交平台时,SDK内部进行处理。假设是通过API分享,那么直接底层分享。

假设是通过client分享,那么通过平台找到相应的UMSsoHandler对象,然后再通过UMSsoHandler的相应方法跳转到社交平台或者IM软件的client进行分享。授权也是相同的原理。

集成过程

以下。我们就以新浪微博为例来解说一下集成过程。

首先到新浪微博开放平台中创建一个新的应用。新浪微博开放平台

图 4

然后填写应用的相关信息后会进入到APP具体信息的配置页面。

例如以下图所看到的:

图 5

在这里主要配置的是应用的包名和签名。应用的包名在AndroidManifest.xml中查看,package属性的值就是。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.sharedemo"
android:versionCode="1"
android:versionName="1.0" >

应用签名即是应用的keystore的MD5值,但也不一定,比方facebook的签名就是keystore的SHA1加上分号,然后再加上应用包名。这里我们仅仅解说新浪微博的设置,我们能够通过eclipse查看应用的签名。例如以下图 : 

图6

下图中的MD5 fingerprint的值就是我们的APP签名,这个值不是直接填写到新浪开发平台官网的,而是须要将冒号去掉,而且将字母转换为小写。如上图5所看到的。然后填写完其它的信息,提交审核就可以。此时,我们就有了新浪微博的app id和app key了。

通过审核我们能够到友盟官网创建应用而且绑定新浪微博的app id和app key了。如图7.

图 7

此时,我们就能够在project中集成友盟社会化分享组件SDK了。

首先,下载SDK而且解压缩SDK。SDK文件夹例如以下。

图8

当中main文件夹下的为核心sdk的jar和资源。将jar包复制到libs文件夹下。而且加入到编译路径中,然后将res文件夹下的资源复制到你project中相应的文件夹下就可以。

platforms文件夹下即为各个社交平台的jar包和资源。SDK默认加入了新浪微博、豆瓣、人人网、腾讯微博这几个平台,其它平台须要手动加入jar包、资源 ( 存放在platforms中相应的文件夹中 ),然后手写代码加入到SDK中。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmJveWZlaXl1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

图9

先看上图9 的左边,确保你所须要的jar包和资源都拷贝进了相应的文件夹,然后看右边的代码。首先声明一个UMSocialService的对象,这个对象就是整个SDK的控制器,通过这个控制器我们能够进行授权、分享等操作。我们通过相应的方法设置分享内容,然后设置各个平台在分享面板上的显示顺序( 不是必须 ), 最后我们在一个button的点击事件中调用了UMSocialService的openShare(context, listener)方法。这种方法就是打开分享面板。

用户点击这个面板上的平台时就会将分享内容分享到这个平台( 假设没有授权则须要先授权一次 )。

最后。不要忘了将你获取到的友盟appkey等信息配置AndroidManifest.xml。配置AndroidManifest.xml參考友盟文档。友盟社会化组件文档

执行程序后。会得到例如以下的效果图。点击某个平台就能够进行授权。然后分享。

效果图

图10 图11

加入其它社交平台

在最新版的SDK中默认仅仅加入了新浪微博、腾讯微博、豆瓣、人人网这四个平台,可是友盟社会化组件还支持微信、微信朋友圈、QQ、QQ空间、facebook、instagram、pinterest、来往、易信等十几个平台,其它的平台请參考友盟社会化组件官网。假设我们要使用除了默认四个平台的其它平台,那么须要我们手动加入到SDK中。

以下我们就来演示假设将微信和微信朋友圈加入到SDK中。

首先将SDK解压缩包中Platforms/weixin文件夹下的Libs文件夹和res文件夹下的相关文件复制到project文件夹下相应的文件夹中。然后通过代码把相关平台加入到SDK中,代码例如以下 : 
                    // 微信平台
UMWXHandler wxHandler = new UMWXHandler(getActivity(), "你的微信app id", "你的微信 app secret") ;
wxHandler.addToSocialSDK(); // 微信朋友圈平台, 与微信共用一个app id, app secret
UMWXHandler circleHandler = new UMWXHandler(getActivity(), "你的微信app id", "你的微信 app secret") ;
circleHandler.setToCircle(true);
circleHandler.addToSocialSDK();

上面的微信app id和app secret都须要到微信开放平台申请。这一步最为麻烦,这里须要创建你的应用。然后填写应用的包名和MD5签名(针对于Android平台),注意,这里的包名和签名一定不能错,而且測试的时候要检查你安装后的apk的签名和你填写时候的签名是否一致,有的情况下我们使用eclipse自带的keystore来測试,打包的时候又成了别的keystore。这样就导致了签名不一致的情况,因此一定要注意签名的正确性问题。假设签名和包名有错误,那么你在使用app id和app secret来进行分享时则无法调出微信或者微信朋友圈的分享界面。出现这样的情况你就须要复查你的apk的签名和包名是否与微信开放平台上填写的一致了。

假设信息填写无误。那么提交审核就可以。

审核成功后就可以进行分享。

图12
然后把压缩包中的Platforms/Android/weixin文件夹下的wxapi放到你的根包的文件夹下,比如我的project的包名为
com.example.sharedemo,那么wxapi的路径就是com.example.sharedemo.wxapi。这一点不能错,否则微信分享可能无法成功。如图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmJveWZlaXl1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" style="border:1px solid black" width="1000" height="170" />

图13
然后在AndroidManafest.xml中注冊微信的这个WXEntryActivity,例如以下 : 
<activity
android:name=".wxapi.WXEntryActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:configChanges="keyboardHidden|orientation|screenSize"
android:exported="true"
android:screenOrientation="portrait" />

这样,集成就完毕了。

可是想要成功分享还得微信开放平台的审核通过,这须要一些时间,因此为了节省时间,填写包名和签名时尽量保证没有问题。

审核通过后,就可以分享成功。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmJveWZlaXl1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" width="200" height="320" />
图14

这样微信和微信朋友圈就集成成功了。
其它的平台集成也是这么一个步骤。

1、到相应的开放平台创建应用;
2、假设须要填写签名和包名。那么填写这些信息;
3、拿到应用的app id, app secret( 有的是 app key )等信息,填写到友盟相应的Handler中。比如UMWXHandler。
4、调用handler的addToSocialSDK()方法将平台加入到SDK中。
5、在AndroidManifest.xml中注冊Activity等,使得分享时能够跳转到目标activity中。

自己定义平台

假设友盟社会化分享组件中没有你想要的平台,那么你能够把自己的平台加入到友盟的SDK中。整个过程也非常easy。

示比例如以下 :

                // 构造平台,參数1为平台名字,參数2为平台图标
CustomPlatform myCustomPlatform = new CustomPlatform("我的平台",
R.drawable.ic_launcher);
// 平台点击事件处理
myCustomPlatform.mClickListener = new OnSnsPlatformClickListener() { @Override
public void onClick(Context arg0, SocializeEntity arg1, SnsPostListener arg2) {
// 在这里处理平台的点击事件,一般为调用目标设计平台的分享或者授权方法.
}
}; // 将平台加入到SDK中
mController.getConfig().addCustomPlatform(myCustomPlatform);

这样就加入成功了。注意,此时假设你须要设置各个平台在分享面板中的顺序,那么你就不要使用
 mController.getConfig().setPlatforms(SHARE_MEDIA.SINA, SHARE_MEDIA.TENCENT,
SHARE_MEDIA.DOUBAN, SHARE_MEDIA.RENREN)

这样的方式来进行排序了,由于你有了自己定义平台。通过上面的设置方法的话自己定义平台则无法显示在分享面板上。此时,应该使用例如以下方法。

        mController.getConfig().setPlatforms(SHARE_MEDIA.SINA.toString(), SHARE_MEDIA.TENCENT.toString(),,
SHARE_MEDIA.DOUBAN.toString(),"我的平台" ) ;

效果例如以下 :


图15

总结

看似整个过程比較的复杂,事实上这也都是各个设计平台为了用户信息的安全所设置的一些安全机制导致的。

比如应用的包名和签名、审核机制等。这些机制导致了集成的失败率大大添加。而各个平台的申请、接口不一致也导致了SDK设计上存在一些不合理的问题。总的来说。友盟社会化组件还是不错的。包括了眼下的主流平台。即使没有包括你所须要的平台也能够通过自己定义平台来实现,这样就保证了扩展性。

集成时仅仅要遵循例如以下顺序则失败率会大大减小:
1、到各个平台的开发平台申请应用,获得app id, app key等信息,假设要填写包名和签名时千万要保证正确性,否则会消耗非常多时间在上面;
2、得到app id, app key等信息到友盟官网看看该平台是否须要绑定这些信息。一般来说通过client分享的平台都不须要绑定,比如微信;而通过api进行分享的基本上都须要绑定,比如人人网、新浪等;
3、将平台加入到sdk中(通过各种友盟的Handler);
4、在AndroidManifest.xml中注冊权限或者activity。

图16

在Android中使App高速、简单地支持新浪微博、微信、QQ、facebook等十几个主流社交平台的分享功能的更多相关文章

  1. Android 中如何计算 App 的启动时间?

    (转载) 已知的两种方法貌似可以获取,但是感觉结果不准确:一种是,adb shell am start -w packagename/activity,这个可以得到两个值,ThisTime和Total ...

  2. Android中为APP创建快捷方式的原理(自己的理解)

    我们首先来看Android中为APP创建快捷方式的原理: 从图上可以看出,Android大致分7步完成快捷方式的创建: 第一步:Android系统的launcher程序会调用它的pickShortcu ...

  3. Android中实现APP文本内容的分享发送与接收方法简述

    谨记(指定选择器Intent.createChooser()) 开始今天的内容前,先闲聊一下: (1)突然有一天头脑风暴,对很多问题有了新的看法和见解,迫不及待的想要分享给大家,文档已经写好了,我需要 ...

  4. Android测试(一):在Android中测试App

    原文:https://developer.android.com/training/testing/index.html 测试你的App是开发过程中的重要组成部分.通过对应用程序持续的运行测试,你可以 ...

  5. Android中GPS定位的简单应用

    在Android中通过GPS获得当前位置,首先要获得一个LocationManager实例,通过该实例的getLastKnownLocation()方法获得第一个的位置,该方法的说明如下: void ...

  6. Android中通过Fragment进行简单的页面切换

    首先是activity中的布局 <?xml version="1.0" encoding="utf-8"?> <androidx.constr ...

  7. App分享之微信微博等各个社交平台的分享授权规则和常见问题

    一.新浪微博分享规则 新浪微博支持分享类型: 应用内分享也就是网页分享支持: 文字,文字+图片,要分享链接需要链接添加在text里分享 客户端分享支持:文字,图片,文字+图片,图片+文字+链接 参数说 ...

  8. 【IOS】ios中NSUserDefault与android中的SharedPreference用法简单对比

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/3405308.html 有Android开发经验的朋友对Shar ...

  9. Android中实现app版本更新

    1,获取本地程序apk版本,并开启服务(下面这段代码一般在主Activity中的onCreate()方法中执行的,并开启后台服务下载新版本的apk) //获取apk包文件的管理者对象 PackageM ...

随机推荐

  1. hdu 3613 KMP算法扩展

    Best Reward Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  2. Linq技巧2——限制返回数据中的继承类型

    假如有像下面这样的一个模型, 怎样在查询时仅仅需要的Cars呢? 这样的几个继承关系的实体中,查询时Where 条件可以加入OfType<SubType>(),你可以这样来写: var o ...

  3. PXC部署,配置,操作原理

    参考:https://www.cnblogs.com/kevingrace/p/5685371.html?utm_source=itdadao&utm_medium=referra       ...

  4. C++11学习笔记(5) —— override and final (转)

    原文转自 http://blog.csdn.net/fire_lord/article/details/8540592 1.简介 C++为我们提供了继承和虚函数的重写特性. 在派生类中,重写虚函数不强 ...

  5. How to build and run ARM Linux on QEMU from scratch

    This blog shows how to run ARM Linux on QEMU! This can be used as a base for later projects using th ...

  6. 标准C程序设计七---72

    Linux应用             编程深入            语言编程 标准C程序设计七---经典C11程序设计    以下内容为阅读:    <标准C程序设计>(第7版) 作者 ...

  7. phpcms V9 安装黄页模块后,注册为普通会员并登录,点立即免费入驻企业库出现白板

    解决步骤: 1. 将php.ini修改: display_errors = On 2. 再次尝试,显示出错误: Fatal error: require(): Failed opening requi ...

  8. iOS-开发者账号失效后是否还可以打包

    参考链接:https://www.jianshu.com/p/601f596e8550

  9. react-native 判断是不是IPhone X

    import { Platform, Dimensions } from 'react-native'; // iPhoneX const X_WIDTH = 375; const X_HEIGHT ...

  10. OS | Process

    linux多进程 1. fork()创建进程,创建一份父进程的拷贝:在父进程中返回的是子进程id,在子进程中返回的是0:失败时返回-1: 2. fork()经常和exec()结合,exec() 覆盖了 ...