一、前言
最近做了个项目,需要集成分享功能,距离上一个项目集成分享功能不到两个月,原以为分分钟可以搞定的事情,但是却花费了大半天功夫(简直就是浪费生命啊......),集成过程还是遇到了一些坑,导致浪费了一些不必要的时间,所以,有的时候学过、用过的东西还是得记录总结一下,便于以后遇到类似问题时快速解决,提高效率。
二、爬坑
具体步骤参考官网的ShareSDK官方快速集成文档 V3.x,这里只说一些注意事项:
第一步、获取ShareSDK;
第二步:导入ShareSDK;
这一步比较简单,只说一下ShareSDK.xml需要注意的一些小点,AppId和AppSecret替换成自己申请的, BypassApproval设置为"false",即不绕过审核,这样才能正确的分享,如果为true,分享出去的图片就是一个文件。只要是正式环境分享,BypassApproval的值都应该为false。
<Wechat
Id="4"
SortId="1"
AppId="xxx"
AppSecret="xxx"
userName="gh_afb25ac019c9"
path="pages/index/index.html?id=1"
BypassApproval="false"
Enable="true" />
第三步:配置Android Manifest.xml;
3.1 官方的文档上少了一个读SD卡的权限,需要自己加一下,该权限应该是用来读取手机中是否安装了分享的App(QQ、微信等),而且如果是6.0+的系统需要动态申请该权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
3.2 Application配置,官方给出了说明,但是不太好找,所以我也把它汇总进来:
其他的基本上参照上面给的官方文档来就行了,我们项目中只集成了微信好友、微信朋友圈、QQ好友、QQ空间,我贴一下我们项目中的集成ShareSDK的Android Manifest.xml部分:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<application
android:name=".App"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<!-- 微信分享回调 -->
<activity
android:name=".wxapi.WXEntryActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:exported="true"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
<activity
android:name="cn.sharesdk.tencent.qq.ReceiveActivity"
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="tencentxxx" />
</intent-filter>
</activity>
<meta-data
android:name="Mob-AppKey"
android:value="xxx" />
<meta-data
android:name="Mob-AppSecret"
android:value="xxx" />
<!-- ShareSdk end -->
3.3 其中有3项需要替换的地方,“xxx”替换成自己应用的相关key即可,注意第一个一定要保留
“tencent”前缀:
<data android:scheme="tencentxxx" />
<meta-data
android:name="Mob-AppKey"
android:value="xxx" />
<meta-data
android:name="Mob-AppSecret"
android:value="xxx" />
至此,Android Manifest.xml部分配置完成。
第四步:添加分享代码;
private void showShare() {
OnekeyShare oks = new OnekeyShare();
//关闭sso授权
oks.disableSSOWhenAuthorize();
// 分享时Notification的图标和文字 2.5.9以后的版本不 调用此方法
//oks.setNotification(R.drawable.ic_launcher, getString(R.string.app_name));
// title标题,印象笔记、邮箱、信息、微信、人人网和QQ空间使用
oks.setTitle(getString(R.string.app_name));
// titleUrl是标题的网络链接,仅在人人网和QQ空间使用
oks.setTitleUrl("www.qq.com");
// text是分享文本,所有平台都需要这个字段
oks.setText("Text文本内容 www.qq.com");
// imagePath是图片地址,Linked-In以外的平台都支持此参数
// 如果不用本地图片,千万不要调用这个方法!!!
// oks.setImagePath("http://f1.sharesdk.cn/imgs/2014/02/26/owWpLZo_638x960.jpg");
oks.setImageUrl("http://f1.sharesdk.cn/imgs/2014/02/26/owWpLZo_638x960.jpg");
// url仅在微信(包括好友和朋友圈)中使用
oks.setUrl("www.qq.com");
// comment是我对这条分享的评论,仅在人人网和QQ空间使用
oks.setComment("我是测试评论文本");
// site是分享此内容的网站名称,仅在QQ空间使用
oks.setSite(getString(R.string.app_name));
// siteUrl是分享此内容的网站地址,仅在QQ空间使用
oks.setSiteUrl("www.qq.com");
oks.setCallback(new PlatformActionListener() {
@Override
public void onComplete(Platform platform, int i, HashMap<String, Object> hashMap) {
KLog.i("share onComplete...");
}
@Override
public void onError(Platform platform, int i, Throwable throwable) {
KLog.i("share onError..." + throwable);
}
@Override
public void onCancel(Platform platform, int i) {
KLog.i("share onCancel...");
}
});
// 启动分享GUI
oks.show(getActivity());
}
4.1 其中有一个坑是尤其需要注意的,就是这行代码:
// 如果不用本地图片,千万不要调用这个方法!!!
oks.setImagePath("http://f1.sharesdk.cn/imgs/2014/02/26/owWpLZo_638x960.jpg");
分享到QQ好友的时候,如果你的图片不是本地图片,千万不要调用这个方法!!!
分享到QQ好友的时候,如果你的图片不是本地图片,千万不要调用这个方法!!!
分享到QQ好友的时候,如果你的图片不是本地图片,千万不要调用这个方法!!!
否则分享失败,这是我这次分享遇到的最大的坑,其他分享加上这行代码没有问题,分享到QQ好友死活不行,最后把这行代码注释掉之后终于成功了,心中顿时一万头草泥马奔腾而过......
4.2 涉及到URL相关的时候,最好先用正规的链接测试,因为你的链接如果是那个平台的黑名单也是会分享失败的,确保分享功能正常之后,再替换回自己的链接进行测试。比如
oks.setTitleUrl("www.qq.com");
4.3 微信分享一定要打签名包才能成功;
4.4 不时清空数据。 亲测:如果微信开发者平台的签名做了修改,可能需要清空微信数据或者卸载重装才能分享成功,就问你怕不怕?所以还是先备份好数据吧。
4.5 多准备两台手机测试,为什么这么说呢?
由于在这个项目中我只负责把分享功能调通,具体的分享内容是其他童鞋负责,其中有一个童鞋在使用我写的分享功能分享到QQ好友的时候,死活不成功,分享出来的内容各种不对劲,但是另外一个童鞋是已经成功了的,所以我相信代码应该是ok的,然后我让他自己调试一下,各种debug、打log无果之后,我让他换台手机,最终终于成功了!我问他怎么成功的,他说新手机装了手机QQ,旧手机没装。。。。。。。。那一刻,我喷了满屏鲜血,感觉整个身体被掏空,我终于体会到了:不怕神一样的对手,就怕没装手机QQ的队友还要强行分享到QQ好友!
第五步:完成;
三、后记
总的来说,使用ShareSDK实现第三方分享还是比较简单的,只是有些小坑需要我们注意一下,就能顺利集成。有问题欢迎留言反馈,最后附上官方爬坑指南,希望老司机早日脱坑。