前言
最近碰到一个需求,应用分享后需要知道是否已经分享成功了。因为用的是sharesdk的分享,里面有一个PlatformActionListener监听器是可以实现回调监听的,所以实现了这个监听器(WXEntryActivity并没有执行回调,不知道是我设置问题还是微信太坑了)
public class MySharedListener implements PlatformActionListener{
@Override
public void onComplete(Platform platform, int i, HashMap hashMap) {
// LogUtils.d("完成了");
dimissDialog();
}
@Override
public void onError(Platform platform, int i, Throwable throwable) {
// LogUtils.d("出错了");
dimissDialog();
}
@Override
public void onCancel(Platform platform, int i) {
// LogUtils.d("取消了");
dimissDialog();
}
}
通常情况下是可以回调的,但是一种情况下,回调不执行了,自己在测试微信分享后,点击“留在微信”后并不会执行这个回调了,即使是重新退出微信再回到本应用中,也是不会调用。(瞬间又觉得微信太坑了0.0)
解决
怎么办呢?自己在测试中无意间发现,当你点击微信分享后的“留在微信”后,会执行原来应用中,调起分享那个activity的生命周期方法,虽然不知道为什么会调用,但是感觉这是天意。
既然调用了生命周期方法了,说明,我们就可以知道微信分享成功了。
但是还有一个问题,我怎么才能知道是微信分享的呢?
因为使用的是sharesdk快速分享的方案,布局还有控件什么都是集成好的,所以并没有自己去设置各个分享的点击。
去看看调用过程,发现调用都是通过oks来设置
ShareSDK.initSDK(context);
OnekeyShare oks = new OnekeyShare();
它可以设置回调,就是前面实现的监听器,但它并不管用
oks.setCallback(new MySharedListener(){});
但是它还可以实现点击监听器
oks.setOnShareButtonClickListener(new PlatformListFakeActivity.OnShareButtonClickListener() {
@Override
public void onClick(View v, List checkPlatforms) {
}
});
往上面翻一翻
翻到了这段
public void onClick(View v) {
long time = System.currentTimeMillis();
if (time - lastClickTime < MIN_CLICK_INTERVAL) {
return;
}
lastClickTime = time;
ArrayList platforms = new ArrayList(1);
platforms.add(v.getTag());
parent.onPlatformIconClick(v, platforms);
}
这下清楚了,传递下来的platforms参数,其实就是点击的view控件的tag,打印出tag,你会发现,是以这样的格式
“cn.sharesdk.****”,
其中,****这部分,是各个平台,如qq、wechat,这就知道了吧,我们只要截取这段字符串,就知道是点击了哪个平台了。
测试后发现,微信的是"cn.sharesdk.wechat"
然后,自己去实现一下这个点击监听器
oks.setOnShareButtonClickListener(new PlatformListFakeActivity.OnShareButtonClickListener() {
@Override
public void onClick(View v, List checkPlatforms) {
mProgressDialog.show();
String tag=v.getTag()+"";
if(tag.contains("cn.sharesdk.wechat")){
sharedByWechat=true;//是微信分享,标记为true
}
// LogUtils.d(v.getTag()+"---tag");
}
});判断一下,如果是点击了微信,就给一个标记,说刚才点击的是微信。
然后还要考虑一下,就是微信点击了之后,用户可以取消,也有可能出错,所以就在上面的分享回调监听器中做下处理。
class SharedListener implements PlatformActionListener {
@Override
public void onComplete(Platform platform, int i, HashMap hashMap) {
}
@Override
public void onError(Platform platform, int i, Throwable throwable) {
cancelDialog();
cancel=true;
}
@Override
public void onCancel(Platform platform, int i) {
cancelDialog();
cancel=true;
}
}
这里给一个标记,cancel,标明微信分享是不是已经取消了或者出错了。这个标记用于后续的判断。
然后再创建一个方法,用来综合判断微信分享
/**
* 判断是不是微信分享
*/
public void sharedByWechat(){
if(mShareUtils!=null&&!cancel){
if(mShareUtils.sharedByWechat){
getCoupon();
}
}
}如果是微信分享了,并且没有取消或出错,就执行getCoupon(或者你想要执行的方法)方法,这里的mShareUtils是写的一个sharesdk分享工具类,为了方便调用分享功能。
好了,这里判断就完成了。可以正常的判断微信分享回调了,但是还有一种情况,就是微信分享后,再点“返回***”就是分享后不留在微信,返回本应用。
那样回调也会正常执行了,这里就做一下处理,在onComplete方法中判断一下
if(mShareUtils!=null&&!cancel){
if(mShareUtils.sharedByWechat){
return;
}
}
getCoupon();如果是微信分享的,就直接return,因为我们不需要这个回调,自己能处理了。其它的就正常执行。
到这里就处理完成了。
方法比较麻烦,也没去看过官方文档有没有更好的方法,如果大家有更好的方法,请分享下给我。