近期刚过完年,一回公司又赶着为项目添加分享功能,搞得焦头烂额,现在在这里记录一下过程中发生的问题,方便下次查阅。
首先,分享功能有两个方式实现:
1:到各个平台注册开发者、下载sdk、阅读文档、查看官方Demo、集成sdk、写代码测试、修复bug、优化。
好吧,看到这么一长串步骤,而且是每个想要集成的平台都得跑一遍流程,想死的心都有了,方案1直接放弃。
2:使用第三方已集成好各个平台的sdk。
这个方案也是现在绝大多数应用所采用的,原因很简单:免费!方便!快捷!
而第三方sdk也有几个可以选,用的比较多的是mob的ShareSdk、友盟的、好像百度也有。
我最终用了mob的,原因很简单,最多人用。
开始集成:
ShareSdk的集成很简单,我们按照官方文档说明直接走一遍流程就行了:
一、获取AppKey
注册Mob的账号并且填写一些你的应用的基本信息,获得AppKey,这个AppKey后面有用,先记着,注意最好是用公司的邮箱而不要用个人邮箱注册,说不定那天你就跑了呢。
二、下载sdk
这个没啥好说的,选好你想要的平台,然后点击“下载SDK”就行了
三、快速集成
3.1使用QuickIntegrate.jar
Mob提供了一个快速集成工具QuickIntegrate.jar来按照你选取的平台来快速生成所需要的代码和资源,关于QuickIntegrate.jar有两点要注意:
(1)无法打开QuickIntegrate.jar
文档上说在windows下配置好java环境后可以直接双击打开jar,反正我的电脑是不行。解决方法很简单,直接用命令行来打开就行了:cd 到QuickIntegrate.jar所在目录,运行“java -jar QuickIntegrate.jar”命令。QuickIntegrate运行成功后就会在其所在目录生成一个Sample文件夹,Sample文件夹下会有4个子文件夹:assets,libs,res,src。
把这4个子文件夹里的东西放复制到你的工程里就ok了!
(2)打开QuickIntegrate.jar后无任何平台可以选
这个是因为在第二步下载sdk时你选的是“下载官方demo”,这时虽然解压后文件夹里也有QuickIntegrate.jar,但是这个QuickIntegrate.jar用不了,你应该点的是”下载SDK“。
3.2配置AndroidManifest.xml
添加权限和Activity什么的直接复制就行了,注意权限不要重复(好像重复了也没事,不过检查一下也是个好习惯),有集成微信和易信的话需要注册额外的两个Activity,微信的WXEntryActivity和易信的YXEntryActivity。要注意name属性对应的包路径,官方文档上是直接用”.“开头,表示当前包名,一般为你的项目的包名,而这两个Activity放在cn.sharesdk.demo下,要不就改name属性为正确的包路径,要不就把这两个Activity放在你的项目中对应的包,不然会报ActivityNotFound异常。
其实这一步最烦的是最后一小步:替换mob后台申请的Appkey与各个平台申请的key
这一步你就得到各个你集成的平台去注册开发者了,当然你也可以直接用Mob申请的各个平台的AppKey,但这毕竟是别人的东西,难保不会出现问题,我现在除了一些注册开发者失败的平台用着Mob的Appkey之外,其它的都是自己去注册的。而且有些平台基于安全原因,会去验证签名,这些平台我们必须自己去注册,并且提交应用信息通过审核后才可以用。
各个平台的注册地址可以自行百度,或者在assets的ShareSDK.xml里有总结,或者查看网页版总结:应用信息注册地址列表
需要自己注册的:
(1)新浪微博SSO
SSO其实就是类似一键登录,如果你当前手机上已经装有新浪微博客户端的话,那么开启SSO可以直接进行简单的一键授权进行分享,而不用再进行账号密码的输入。虽然很方便,但是为了安全起见,新浪添加了对应用签名的验证。所以我们必须将我们的应用和签名信息提交给新浪并通过审核后才可以进行SSO免登陆功能。
注意填写应用信息时要求填写签名的MD5值,跟其它MD5值一样,这是你的签名的唯一标识,在生成签名文件KeyStone时可以看到,如果你当时没记下来的话,也可以用新浪或者微信等开发的一个简单应用去获取。新浪工具的git-hub地址:点击打开链接
注意不管你是用新浪的还是微信的还是其它的平台提供的工具,你的签名MD5值只有一个,你用哪个工具得到的结果都一样,你提取一次然后记住就可以在各个平台上用了。
(2)微信、微信朋友圈
微信和其朋友圈同样要对应用签名进行验证,并且是验证过后才给你AppId。在你分享内容时会在服务器端对你的包名和签名进行对应验证,如果在微信服务器端没有你的包名和签名信息或者对应不上的话,就会报错导致分享失败。
注意在测试微信分享时要先用你在微信上填的那个签名文件签完名后打包才进行测试,像上面说过的,微信会验证你的包名和签名,不这样做的话微信不让你分享。
(3)易信,易信朋友圈
基本跟微信一样。
注意要通过审核,不然的话会对分享内容进行限制或者根本不让你分享。微信的我通过审核了,新浪的和易信的还没通过(好吧,写到一半新浪的也审核通过了,就差易信了),如果失败的话会告诉你原因,多申请几次吧。
3.3开始添加分享代码
简单的一键分享代码很简单,把文档上的示例代码直接复制过来用都行。注意如果你的应用还没通过审核的话,最好关闭sso授权。
做完上面几步基本就实现简单的分享功能了,但是我觉得有一个高级自定义功能很有必要实现,就是为不同平台定义差异化分享内容:
不同平台的分享内容格式不同,比如微博只支持图文分享,微信和易信支持网页分享等。所以最好为不同平台设置不同的分享内容。
Mob的sdk也提供了一个简单的回调接口来实现这个功能。
具体参考:官方文档的第6点
各个平台的内容格式参考:不同平台分享内容的详细说明
不定时更新补充:
2015-03-04
QQ和QQ空间回调问题
之前在QQ和QQ空间开发者网站一直创建新应用失败,所以用了Mob的appid和appkey,然后就出现问题了。
在QQ空间分享成功返回后居然弹出了一个应用选择窗口,即那个有多个应用符合当前intent信息,系统弹出让用户选择一个应用来打开的窗口。看了下文档,发现原因如下:
QQ和QQ空间分享成功后会有一个回调,回调的方式是启动一个有特殊scheme的intent,先解释下:scheme是Uri的一部分,比如“http”就是最常见的scheme之一。Android支持Activity去监听特定格式的Uri,包括自定义Uri。而QQ空间回调时的intent的data属性就会为腾讯事先约定好的scheme,即tencent+分享时所用的appid,我们只要注册一个Activity,然后去监听这个scheme,就可以接受到QQ的回调了。类似下面这样
<activity
android:name="cn.sharesdk.framework.ShareSDKUIShell"
android:configChanges="keyboardHidden|orientation|screenSize"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:windowSoftInputMode="stateHidden|adjustResize" >
<intent-filter>
<data android:scheme="tencent111111111" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
注:把scheme改成“http”,就是一般浏览器注册Activity的样子了
注2:利用这个可以实现从网页跳转到应用,在网页跳转到一个自定义Uri,如myapp://aaaaa,然后注册一个Activity监听myapp的scheme就行了,携带数据跟http的get请求一样,如myapp://aaaaa?data1=wo&data2=ni,在Activity中这样取数据:
String s = getIntent().toURI();
Uri parse = Uri.parse(s);
String data1 = parse.getQueryParameter("data1");
String data2 = parse.getQueryParameter("data2");
扯得有点远了,回到发生的问题,弹出应用选择窗口的原因就是我手机装了另一个应用同样用了Mob来集成分享,而且那个开发人员跟我一样懒,用了Mob的appid,于是我们监听的scheme是一样的,当QQ回调时我们两个都符合这个intent,于是系统让用户选择那个打开。
解决方法:申请自己的appid,这样你的scheme就是独一无二的(腾讯那边不出错给你跟别人一样的appid的情况下),就不会有这个问题了。还有好处就是分享的时候会显示分享来源。
好吧,只能认真再试下注册开发者了,发现之前没看到是要上传身份证图片的,我去,注册个开发者都要上传身份证了。。。没办法,只能屈服了,终于审核通过了。
这一篇是纯文字版的,因为各个平台的页面总是换来换去的,发图片也没啥意思。