前言

最近碰到一个需求,应用分享后需要知道是否已经分享成功了。因为用的是sharesdk的分享,里面有一个PlatformActionListener监听器是可以实现回调监听的,所以实现了这个监听器(WXEntryActivity并没有执行回调,不知道是我设置问题还是微信太坑了)

 

public class MySharedListener implements PlatformActionListener{
        @Override
        public void onComplete(Platform platform, int i, HashMap<String, Object> 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<Object> checkPlatforms) {
                  
                }
            });



往上面翻一翻


翻到了这段


public void onClick(View v) {
		long time = System.currentTimeMillis();
		if (time - lastClickTime < MIN_CLICK_INTERVAL) {
			return;
		}
		lastClickTime = time;

		ArrayList<Object> platforms = new ArrayList<Object>(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<Object> 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<String, Object> 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();
            }
        }

    }


 


好了,这里判断就完成了。可以正常的判断微信分享回调了,但是还有一种情况,就是微信分享后,再点“返回***”就是分享后不留在微信,返回本应用。


 


那样回调也会正常执行了,这里就做一下处理,在onComplete方法中判断一下


 


if(mShareUtils!=null&&!cancel){
                if(mShareUtils.sharedByWechat){
                    return;
                }
            }
            getCoupon();


 


到这里就处理完成了。


 


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