sharesdk 微信登陆分享点击留在微信回调解决方案

前言

最近碰到一个需求,应用分享后需要知道是否已经分享成功了。因为用的是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,因为我们不需要这个回调,自己能处理了。其它的就正常执行。

到这里就处理完成了。

方法比较麻烦,也没去看过官方文档有没有更好的方法,如果大家有更好的方法,请分享下给我。











 
  

你可能感兴趣的:(android,sharesdk)