社会化分享每一个app必备的推广需求,不管是拉新,邀请,游戏奖励,等等都离不开分享的影子,下面咱们介绍下社会化分享的插件;php
首先要说下,如今的社交App,社区App等,国内外的状况都是从之前的百花齐放到如今的几个巨头,如今可以真正存活下来的或者说用户群体大的,也就微信、QQ、微博、Facebook,因此,咱们就简单的从这几个平台的社会化分享集成到app来对比下;android
市面上社会化分享的插件仍是比较多的,好比ShareSDK(Mob),U-Share(友盟+),极光等等,不过用的比较多的如今是ShareSDK的了,毕竟友盟主打的是统计,极光主打的是推送,Mob主打的ShareSDK,不过咱们仍是选取ShareSDK和友盟+对比下;web
集成准备:须要作这几个平台的分享,或者第三方登陆,必需要先去对应的第三方开发者或者开放平台申请对应的应用获得id或者key等;api
QQ:http://open.qq.com微信
微信:http://open.qq.weixin.com网络
新浪:http://open.weibo.comapp
Facebook:https://developers.facebook.comide
这个论坛中有申请流程能够参考一下:测试
http://bbs.mob.com/forum.php?mod=viewthread&tid=275&page=1&extra=#pid860gradle
须要说明的QQ,若是只须要作分享的话能够不经过审核,则登陆须要;
Fb作分享和登陆目前均可以不须要审核;
微信和新浪必需要经过审核才能够,新浪没经过审核前能够测试,可是微信不能够;
好了上面若是准备好了咱们继续往下说;
下载地址:https://developer.umeng.com/sdk/android
集成文档:
https://developer.umeng.com/docs/66632/detail/66639#h1-u96C6u6210u51C6u59073
须要吐槽下,那个自动集成千万别浪费时间,我找了很久,最后问了客服,那个是统计的,分享的话目前只支持手动集成哦;
首先看下面的图片,友盟这里作的仍是不错的;
如上图能够看到,在微博和QQ、微信都作了精简版,咱们这里只须要分享顾只下载精简版便可,具体差别能够将鼠标放到问号处本身查看;
如今下载完以下图所示:
这个类是微信规定的,因此必修要放到包名.wxapi目录下;
QQ和微博不须要添加activity,可是须要在分享和登陆的Activity中添加以下代码;
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); UMShareAPI.get(this).onActivityResult(requestCode, resultCode, data); }
注意onActivityResult不可在fragment中实现,若是在fragment中调用登陆或分享,须要在fragment依赖的Activity中实现
新浪:
<activity android:name="com.umeng.socialize.media.WBShareCallBackActivity" android:configChanges="keyboardHidden|orientation" android:theme="@android:style/Theme.Translucent.NoTitleBar" android:exported="false" > </activity> <activity android:name="com.sina.weibo.sdk.web.WeiboSdkWebActivity" android:configChanges="keyboardHidden|orientation" android:exported="false" android:windowSoftInputMode="adjustResize" > </activity> <activity android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" android:launchMode="singleTask" android:name="com.sina.weibo.sdk.share.WbShareTransActivity"> <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=".wxapi.WXEntryActivity" android:configChanges="keyboardHidden|orientation|screenSize" android:exported="true" android:theme="@android:style/Theme.Translucent.NoTitleBar" />
QQ:
<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" /> </intent-filter> </activity> <activity android:name="com.tencent.connect.common.AssistActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar" android:configChanges="orientation|keyboardHidden|screenSize"/>
权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.INTERNET" />
若是须要使用QQ纯图分享或避免其它平台纯图分享的时候图片不被压缩,能够增长如下权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
Android6.0权限适配
请查看你的build.gradle文件,若是 targetSdkVersion小于或等于22,能够忽略这一步,若是大于或等于23,须要作权限的动态申请:
if(Build.VERSION.SDK_INT>=23){ String[] mPermissionList = new String[]{ Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.CALL_PHONE,Manifest.permission.READ_LOGS,Manifest.permission.READ_PHONE_STATE, Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.SET_DEBUG_APP,Manifest.permission.SYSTEM_ALERT_WINDOW,Manifest.permission.GET_ACCOUNTS,Manifest.permission.WRITE_APN_SETTINGS}; ActivityCompat.requestPermissions(this,mPermissionList,123); }
其中123是requestcode,能够根据这个code判断,用户是否赞成了受权。若是没有赞成,能够根据回调进行相应处理:
@Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { }
好了到这里就集成完了,虽然是复制复制的,可是仍是有点小麻烦,集成时间大概十分钟左右;
初始化代码,Facebook有些特殊,不是在代码中配置,以下图所示,文档还乱了,不吐槽了,理解万岁;
new ShareAction(MainActivity.this) .setPlatform(SHARE_MEDIA.QQ)//传入平台 .withText("hello")//分享内容 .setCallback(shareListener)//回调监听器 .share();
如上代码所示,其余的平台大同小异,只要换了传入的平台对象便可;
下面咱们来看下jar包的大小
umeng-common-1.5.4.jar(公共jar) |
352k(比ShaerSDK小) |
umeng-share-core-6.9.3.jar(Ushare所需) umeng-sharetool-6.9.3.jar(Ushare所需) |
282k(比ShareSDK大) |
umeng-share-facebook-6.9.3.jar |
510k(比ShareSDK大) |
umeng-share-QQ-simplify-6.9.3.jar |
78k(比ShareSDK大) |
umeng-share-sina-simplify-6.9.3.jar |
81k(比ShareSDK大) |
umeng-share-wechat-simplify-6.9.3.jar |
31k(比ShaerSDK小) |
总大小: |
1634k(比ShareSDK大) |
集成文档:http://wiki.mob.com/sdk-share-android-3-0-0/
ShareSDK采用的是gradle集成的方式,终于不用手动集成了,也不须要下载资源和jar包了,哈哈哈,让我先笑一会,好了咱们继续;
classpath "com.mob.sdk:MobSDK:2018.0319.1724"
以后在想要调用分享的模块中配置以下内容:
apply plugin: 'com.mob.sdk' MobSDK { appKey "d580ad56b4b5" appSecret "7fcae59a62342e7e2759e9e397c82bdd" ShareSDK { //平台配置信息 devInfo { SinaWeibo { appKey "568898243" appSecret "38a4f8204cc784f81f9f0daaf31e02e3" callbackUri "http://www.sharesdk.cn" shareByAppClient false } Wechat { appId "wx4868b35061f87885" appSecret "64020361b8ec4c99936c0e3999a9f249" } WechatMoments{ appId "wx4868b35061f87885" appSecret "64020361b8ec4c99936c0e3999a9f249" bypassApproval true } QQ { appId "100371282" appKey "aed9b0303e3ed1e27bae87c33761161d" shareByAppClient true } QZone { appId "100371282" appKey "aed9b0303e3ed1e27bae87c33761161d" bypassApproval true } Facebook { appKey "1412473428822331" appSecret "a42f4f3f867dc947b9ed6020c2e93558" callbackUri "https://mob.com" } } } }
如上所示,ShareSDK将微信的几个平台,还有QQ和QZone都分开处理了,这样须要更多的配置了,可是也就更灵活了,不须要的资源彻底能够不须要加进来了,各有各的好处;
其次,上面的字段的说明,能够看ShareSDK的集成文档便可,里面都有说明;将本身的key申请好后,替换上面默认的便可,而后从新编译一下,就集成完成了,是的你没有听错,集成完了,不须要加任何jar包,不须要加任何act的配置,gradle的好处大大的体现出来了;
时间成本大大的减小了,而且在回调的配置方面减小了本身的配置上的操做失误,下降了错误的可能性,并且还不须要初始化哦,亲测可靠,下面咱们开始调用代码分享吧;
Platform.ShareParams sp = new Platform.ShareParams(); sp.setTitle("测试分享的标题"); sp.setTitleUrl("http://sharesdk.cn"); // 标题的超连接 sp.setText("测试分享的文本"); sp.setImageUrl("http://www.someserver.com/测试图片网络地址.jpg"); sp.setSite("发布分享的网站名称"); sp.setSiteUrl("发布分享网站的地址"); Platform qzone = ShareSDK.getPlatform (QZone.NAME); // 设置分享事件回调(注:回调放在不能保证在主线程调用,不能够在里面直接处理UI操做) qzone.setPlatformActionListener (new PlatformActionListener() { public void onError(Platform arg0, int arg1, Throwable arg2) { //失败的回调,arg:平台对象,arg1:表示当前的动做,arg2:异常信息 } public void onComplete(Platform arg0, int arg1, HashMap arg2) { //分享成功的回调 } public void onCancel(Platform arg0, int arg1) { //取消分享的回调 } }); // 执行图文分享 qzone.share(sp);
如上所示,代码调用完成,不一样的平台更换不一样的第三方对象便可,能够在快速集成文档中查看,而后就是分享类型,也能够在文档中查看《各平台分享内容说明》
785K
MobTools-2018.0911.1425.jar MobCommons-2018.0918.1444.jar(公共jar) |
464k(比Ushare大) |
ShareSDK-Core-3.3.0.jar |
120k(比Ushare小) |
ShareSDK-QQ-3.3.0.jar ShareSDK-QZone-3.3.0.jar |
74k(比Ushare小) |
ShareSDK-SinaWeibo-3.3.0.jar |
70k(比Ushare小) |
ShareSDK-Wechat-3.3.0.jar ShareSDK-Wechat-Core-3.3.0.jar ShareSDK-Wechat-Moments-3.3.0.jar |
57k(比Ushare大) |
ShareSDK-Facebook-3.3.0.jar |
36k(比Ushare小) |
总大小: |
821k |
对比项 |
Ushare |
ShareSDK |
集成时间 |
10min |
2min |
集成jar包的大小 |
1634k(fb的jar太大) |
821k |
集成方式 |
手动jar包集成 |
Gradle集成 |
配置项 |
配置的比较多(毕竟不是gradle集成) |
配置项比较少,节省时间 |
客服(满分10分) |
6分(无技术客服,而且回复比较慢) |
9分(有技术客服,回复较快) |
更新周期 |
平均三个月更新一次 |
平均一个多月更新一次 |
须要说明的是大小问题,虽然jar包对比差了一倍,可是U-share的fb的jar比较大,若是不集成fb的状况下,二者相差很少;