Android 微信分享成功后回调问题

如何让我们的App接收到微信的反馈?

1. 在你的包名相应目录下新建一个wxapi目录,并在该wxapi目录下新增一个WXEntryActivity类,该类继承自Activity,并在manifest文件里面加上exported属性,设置为true,允许该Activity被其他应用调用,这句话很重要。

        <activity
                android:name="你的APP包名.wxapi.WXEntryActivity"
                android:launchMode="singleTop"
                android:exported="true"
                android:theme="@style/comment_activity">
            <intent-filter>
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <data android:scheme="sdksample"/>
            intent-filter>
        activity>

 

2. 实现IWXAPIEventHandler接口,微信发送的请求将回调到onReq方法,发送到微信请求的响应结果将回调到onResp方法。

3. 在WXEntryActivity中将接收到的intent及实现了IWXAPIEventHandler接口的对象传递给IWXAPI接口的handleIntent方法。当微信发送请求到你的应用,将通过IWXAPIEventHandler接口的onReq方法进行回调,类似的,应用请求微信的响应结果将通过onResp回调。

其中,必须要新建WXEntryActivity类,实现IWXAPIEventHandler接口,同时该文件必须在${yourAppPackageName}.wxapi包下,回调才有作用

 

    在程序中我们并不需要自己主动的去启动WXEntryActivity,只需要把回调后的逻辑处理代码在onResq()这个回调接口中实现,处理完逻辑后将该Activity finish()掉就可以了. 

    在WXEntryActivity中一定要参考官方的文档,实现onNewIntent(Intent intent)方法,这个方法为微信客户端分享成功后回调我们应用中的WXEntryActivity类,通过newintent(Intent intent)来启动WXEntryActivity类,并在newIntent方法中通过IWXAPI接口中的handleIntent方法,注册监听

 

下面普及newIntent()方法的解释: 

Android onNewIntent的应用

onCreate是用来创建一个Activity也就是创建一个窗体,但一个Activty处于任务栈的顶端,若再次调用startActivity去创建它,则不会再次创建。若你想利用已有的Acivity去处理别的Intent时,你就可以利用onNewIntent来处理。在onNewIntent里面就会获得新的Intent.

如果IntentActivity处于任务栈的顶端,也就是说之前打开过的Activity,现在处于onPause onStop状态的话,其他应用再发送Intent的话,执行顺序为:
onNewIntent -> onRestart -> onStart -> onResume

onNewIntent(Intent intent) 是Activity类的方法.它被调用发几种情况如下:

  1.  android:launchMode="singleTask" 配置在 Mainifest 中,它保证了栈中此Activity总是只有一个,无论你启动它多少次;Activiy配置成android:launchMode="singleTask" ,在点Home键退出Activity而再次启动新的Intent进来时onNewIntent(Intent intent) 方法会被调用到; 

  2. 利用已有的Acivity去处理别的Intent时,你就可以利用onNewIntent来处理,通常被用在有搜索请求的activity,而其该activity有好几个intent-filter,该方法被调用的前提:
    a、该activity设置如下属性 android:launchMode="singleTop"。
    b、该activity已经处在栈的顶端,通过其他的方法又重新启动该acitvity时被调用,如搜索,这时oncreate()方法不调用。  

 

看完onnewIntent()方法的介绍后,大家应该明白一点了,我们就是将WXEntryActivity设置成singleTop了。

 

示例代码:

public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
    private static CreditManager.KGainCreditType gainCreditType;
    private static long dataShareId;
    private IWXAPI api;
 
    public static void setTypeAndDataShareId(CreditManager.KGainCreditType type, long srcId) {
        gainCreditType = type;
        dataShareId = srcId;
    }
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.wx_entry_activity);
        initData();
    }
 
    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        initData();
    }
 
    private void initData() {
        api = OpenUtils.instance().getIWXAPI();
        api.handleIntent(getIntent(), this);
    }
 
    @Override
    public void onReq(BaseReq req) {
    }
 
    @Override
    public void onResp(BaseResp resp) {
        String result = null;
        switch (resp.errCode) {
            case BaseResp.ErrCode.ERR_OK: {
                CreditManager creditManager = ShuiDi.instance().getCreditManager();
                creditManager.submitGainCreditEventToServer(gainCreditType, dataShareId);
                result = "分享成功";
            }
            break;
            case BaseResp.ErrCode.ERR_USER_CANCEL:
                result = "分享取消";
                break;
            case BaseResp.ErrCode.ERR_AUTH_DENIED:
                result = "分享被拒绝";
                break;
            default:
                result = "分享返回";
                break;
        }
 
        Toast.makeText(this, result, Toast.LENGTH_LONG).show();
        this.finish();
    }
}

 

 

  1 public class EntryActivity extends Activity implements IWXAPIEventHandler {
  2 
  3     @Override
  4     public void onCreate(Bundle savedInstanceState) {
  5         super.onCreate(savedInstanceState);
  6 
  7         if (Wechat.instance.getWxAPI() == null) {
  8             startMainActivity();
  9         } else {
 10             Wechat.instance.getWxAPI().handleIntent(getIntent(), this);
 11         }
 12     }
 13 
 14     @Override
 15     protected void onNewIntent(Intent intent) {
 16         super.onNewIntent(intent);
 17 
 18         setIntent(intent);
 19 
 20         if (Wechat.instance.getWxAPI() == null) {
 21             startMainActivity();
 22         } else {
 23             Wechat.instance.getWxAPI().handleIntent(intent, this);
 24         }
 25     }
 26 
 27     @Override
 28     public void onResp(BaseResp resp) {
 29         XYMLogUtil.d(Wechat.TAG, resp.toString());
 30 
 31         if (Wechat.instance.getCurrentCallbackContext() == null) {
 32             startMainActivity();
 33             return ;
 34         }
 35 
 36         switch (resp.errCode) {
 37             case BaseResp.ErrCode.ERR_OK:
 38                 switch (resp.getType()) {
 39                     case ConstantsAPI.COMMAND_SENDAUTH:
 40                         auth(resp);
 41                         break;
 42 
 43                     case ConstantsAPI.COMMAND_SENDMESSAGE_TO_WX: // 分享给好友、朋友圈
 44                     case ConstantsAPI.COMMAND_PAY_BY_WX:
 45                     default:
 46                         Wechat.instance.getCurrentCallbackContext().success();
 47                         break;
 48                 }
 49                 break;
 50             case BaseResp.ErrCode.ERR_USER_CANCEL:
 51                 Wechat.instance.getCurrentCallbackContext().error(Wechat.ERROR_WECHAT_RESPONSE_USER_CANCEL);
 52                 break;
 53             case BaseResp.ErrCode.ERR_AUTH_DENIED:
 54                 Wechat.instance.getCurrentCallbackContext().error(Wechat.ERROR_WECHAT_RESPONSE_AUTH_DENIED);
 55                 break;
 56             case BaseResp.ErrCode.ERR_SENT_FAILED:
 57                 Wechat.instance.getCurrentCallbackContext().error(Wechat.ERROR_WECHAT_RESPONSE_SENT_FAILED);
 58                 break;
 59             case BaseResp.ErrCode.ERR_UNSUPPORT:
 60                 Wechat.instance.getCurrentCallbackContext().error(Wechat.ERROR_WECHAT_RESPONSE_UNSUPPORT);
 61                 break;
 62             case BaseResp.ErrCode.ERR_COMM:
 63                 Wechat.instance.getCurrentCallbackContext().error(Wechat.ERROR_WECHAT_RESPONSE_COMMON);
 64                 break;
 65             default:
 66                 Wechat.instance.getCurrentCallbackContext().error(Wechat.ERROR_WECHAT_RESPONSE_UNKNOWN);
 67                 break;
 68         }
 69 
 70         finish();
 71     }
 72 
 73     @Override
 74     public void onReq(BaseReq req) {
 75         finish();
 76     }
 77 
 78     protected void startMainActivity() {
 79         Intent intent = new Intent();
 80         intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 81         intent.setPackage(getApplicationContext().getPackageName());
 82         getApplicationContext().startActivity(intent);
 83     }
 84 
 85     protected void auth(BaseResp resp) {
 86         SendAuth.Resp res = ((SendAuth.Resp) resp);
 87 
 88         XYMLogUtil.d(Wechat.TAG, res.toString());
 89 
 90         JSONObject response = new JSONObject();
 91         try {
 92             response.put("code", res.code);
 93             response.put("state", res.state);
 94             response.put("country", res.country);
 95             response.put("lang", res.lang);
 96         } catch (JSONException e) {
 97             XYMLogUtil.e(Wechat.TAG, e.getMessage());
 98         }
 99 
100         Wechat.instance.getCurrentCallbackContext().success(response);
101     }
102 }
项目实战代码

 

  

 

转载于:https://www.cnblogs.com/nyjcldxr/p/9712742.html

你可能感兴趣的:(Android 微信分享成功后回调问题)