Android 微信的回调跨进程间的调用 (分享)

2019-03-02 00:49|来源: 网路

微信平台开放后倒是挺火的,许多第三方应用都想试下,毕竟可以利用微信建立起来的关系链来拓展自己的应用还是挺不错的,可以节约很多在社交方面的开销,我最近由于实习需要也在研究这个东西,不过发现网上的相关资料还是挺少的,这里把我的整个研究情况给出来,希望可以共同学习。

第三方应用接入微信平台(1)

二、第三方应用与微信通信的时序图

2、接收微信的请求信息


前面四步和之前的“1、向微信发送消息”是一样的,不需要重复执行,这里给出来只是为了

流程的整体性。当我们注册后,应用图标会出现在微信聊天的列表中,点击加号即可去添加,

添加后,如果聊天时点击应用图标将会回调第三方应用,如上面时序图所示。这里补充一点,

当我们向微信发消息的媒体类型是appdata类型,即WXAppExtendObject对象时,好友在

收到消息时点击消息,会出现类似的回调过程,需要修改的就是此时onReq被调用时,type

为ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX而不是ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX 。

当我们在onReq方法中接到ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX

类型的消息时,如果想要把响应发回微信,可用如下代码段来实现


可以发现响应的消息对象和发请求是一样的,下面看看效果图

这是聊天窗口,前提是你已经点击加号将应用添加到下面的列表中


此时,如果点击第三方应用,会回调我们设置好的界面


这个界面是自己定义的,你可以在接到微信的请求后自定义响应界面。

说了半天,还没说到onReq方法或是前面讲的onResp方法的由来,

也就是说如果我们想要处理给微信发请求后的回馈或是响应微信的请求

应该怎么做,我们需要下面3步操作:

a. 可以在你的包名相应目录下新建一个wxapi目录,并在该wxapi目录下新增一个
WXEntryActivity类,该类继承自Activity(当然这个路径是自定义的,随便你自己)

并在manifest文件里面加上exported属性,设置为true,例如:

复制代码 代码如下:

<activity
android:name=".wxapi.WXEntryActivity"
android:exported="true"
android:label="@string/app_name"
android:launchMode="singleTop" >

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

 

终于出现了这两个神奇的方法,可以看看他们的大致用法

 @Override 
public void onReq(BaseReq req) {
switch (req.getType()) {
case ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX:
goToGetMsg();
break;
case ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX:
goToShowMsg((ShowMessageFromWX.Req) req);
break;
default:
break;
}
}

复制代码 代码如下:

<SPAN style="FONT-SIZE: 18px; FONT-FAMILY: Microsoft YaHei"> @Override
public void onResp(BaseResp resp) {
int result = 0;

switch (resp.errCode) {
case BaseResp.ErrCode.ERR_OK:
result = R.string.errcode_success;
break;
case BaseResp.ErrCode.ERR_USER_CANCEL:
result = R.string.errcode_cancel;
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED:
result = R.string.errcode_deny;
break;
default:
result = R.string.errcode_unknown;
break;
}

Toast.makeText(this, result, Toast.LENGTH_LONG).show();
}

c. 在WXEntryActivity中将接收到的intent及实现了IWXAPIEventHandler接口的对
象传递给IWXAPI接口的handleIntent方法:
复制代码 代码如下:

api.handleIntent(intent, this);

ok,这三步可以结合时序图一起来理解,都可以一一对应的。

 

最后给出一些注意点,也是容易混淆的,我都写过Demo验证过了,如果大家觉得有不对的,欢迎指出,欢迎讨论

1、注册是本地注册,且只需要注册一次,但是在发送的时候微信服务器会检测第三方应用的合法性

2、说白了就是在本地第三方应用将要发送的内容先发给微信进程,微信进程收到后再将消息发给自己的微信好友

3、卸载或者反注册后,第三方应用将不会出现在本机微信的可添加应用列表中

4、使用微信开放平台发送的媒体对象中,网页,音频和视频只能是网络URL,图片可发送本地路径,本地字节数据,网络URL,文件可以发送本地字节数据和本地路径,附带在媒体对象中的字节数组,微信默认会是点击则给出下载界面,下载后存储的路径是在/sdcard/Tecent/MicroMsg/本机微信帐号(一般是一串字母数字的组合体)/attachment文件夹下,这个路径不需要自己去记录,微信会在媒体对象的filepath字段中记录,此时一定注意的是当你响应微信的show请求时,媒体对象中的filedata字段是为空的,即使你在发送的时候附带在了这个字段中,如前面所说,只能用filepath这个字段。

如果要自行处理只能是appdata类型数据,理由下面给出

appdata类型的对象唯一特殊点就只是告诉微信这个消息点击时需要调用第三方应用,而其他类型的媒体对象被点击时所显示的是微信的默认页面

5、微信根据transaction字段决定消息在聊天框中的表现以及点击后的响应,只有appdata被点击时可以调用第三方应用的进程,所触发的方法是实现了IWXAPIEventHandler接口的类的onReq方法,类型是ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX而在微信中和好友聊天时点击第三方应用图标所所触发的方法是实现了IWXAPIEventHandler接口的类的onReq方法,类型是ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX

6、微信会根据第三方应用是否注册来给出应用安装的信息,比如传给微信好友一个音频消息时,当好友点击那个消息,微信会以一个WebView来load音频消息中的URL,不过在此前会在URL后面附加一些微信定义的信息,其中就会包括一个字段是isInstalled有关微信包装后的URL的具体格式,我们可以将网络断开,然后再去点击,这时自然就出现了那个经典界面,你也就可以看到URL的真面目了因为我自己写的demo都在实习结束后丢失了,所以给一个官方的demo下载,如果有不清楚的可以交流

谢谢合作,希望共同学习。


转自:http://www.cnblogs.com/wsfjlagr/p/3829156

相关问答

更多
  • 可以通过微信公众平台制作微信图文分享到朋友圈。制作方法:1.登录微信公众平台=》点击素材管理=》新建图文消息,如图:2.填写标题、封面图片、摘要、正文内容。如图3.点击保存。4.点击群发功能=》从素材库中选择=》选择刚创建的图文=》点击群发即可。PS:群发前,先关注此公众号。群发后接收后,可以分享到朋友圈。
  • 微信公众平台属于腾讯的产品,他们后台的代码自己应该是改不了的,你是想实现什么功能呢?可以联系微信客服给他们提建议的呀
  • 也许你想要一个更完整的答案,因为被接受的答案很短,我已经太晚了但是希望它仍然有用:) 所以这是处理多个意图的可能解决方案...... 1)您想知道意图的结果(例如成功或失败)? 只需使用以下行启动意图: startActivityForResult(intent, 1); //instead of startActivity(intent) 并通过重写onActivityResult来检索requestCode和resultCode: @Override public void onActivityRes ...
  • 最新的微信JSSDK分享接口是不是有问题呀?还是我的代码哪里错了 …我看根据网上教程调了一整天了。还是调不出分享图片和标题。不知道那个地方出错了。显示的进展是.
  • 我找到了答案。 提示是Param third_party_app_id必须是打开对话框时打印的有效应用程序ID错误消息。 问题是我在谷歌和Facebook上都使用app_id值,即使我在Facebook控制台中添加应用程序时Facebook创建了不同的应用程序ID。 解决方案是区分两个id并使用Facebook id作为清单文件中的Facebook元数据标记。 我不确定为什么Facebook会让你继续对话,即使他们知道它会失败但是...... I found the answer. The hint was ...
  • 使用下面的代码 - > Intent i = new TweetComposer.Builder(this) .text(content) .url(new URL(url)) .createIntent(); startActivityForResult(i, Constants.REQUEST_CODE_TWITTER); @Override prot ...
  • 问题出在weibo dev帐户上的应用程序类型错误,我重新创建应用程序,添加软件包和md5软件包散列,现在它工作。 但只有在手机上安装了weibo应用程序。 并且您不需要清单中的任何附加实体。 The problem was in wrong application type on weibo dev account, I recreated application, add package and md5 package hash, and now it works. But only if weibo ...
  • Google Plus尚未提供公开的API,但https://developers.google.com/+/mobile/android/上提供了一些选项 我强烈建议不要为每个社交网络使用唯一的SDK,因为它们包含很多错误,并且不是很可靠。 如果您只是想将应用程序中的简单文本分享到Facebook,Twitter,Google +等等......我建议创建一个选择器,让用户从他的手机中选择他想要用户共享的应用程序。 它简单,可靠,这通常是在android中完成的。 示例代码: Intent ...
  • 如果你正在使用facebook android API,你应该这样做 private Facebook mFacebook; private String mMessageToPost; ... function postToWall(urMessageAndLink) { Bundle parameters = new Bundle(); parameters.putString("me ...