前言

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

到这里就处理完成了。

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

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐