最近由于相关需求,需要将微信分享集成到项目中,但在过程中遇到很多问题,现大致整理与此
此次过程中还有些许遗留问题(如无法分享app类型消息),待解决后会来此更新
(希望能有知晓的简友,给与指导解答,能早点解决)
<h2 id="1">一. APP申请审核</h2>
首先项目集成微信SDK,需要到官网注册,因为微信对第三方的调用有着严格的验证:App ID,包名,及应用签名,只有这三个跟申请的都完全匹配,才能调用分享。
按官网(微信开发平台)提示步骤申请移动应用,步骤都比较简单,按提示即可,需要说明的如下:
1) 应用官网那栏可以直接填写你的博客地址或其他
2) 包名需填写你所要集成项目的包名,后续可修改
3) 应用签名格式为小写连续,并且注意填写签名的版本
-
1.1 查看项目的应用签名
-
Eclipse 中查看
-
顶部菜单Window -> Preferences -> Build,打开面板即可看到应用签名(debug版),如图
- tip:运行下载的官网demo时,需要将签名文件替换为demo工程目录中的debug.keystore文件
-
-
Android Studio 中查看
- 找到打包生成应用签名(
Build-->Generate Signed APK...
)时候所产生的.jks文件
- 打开
Terminal
面板,输入以下命令行,再输入生成签名打包时候的密码即可:
keytool -list -v -keystore "E:...\签名文件.jks"
> ![命令行:最后引号中的路径即为.jks的文件路径](http://upload-images.jianshu.io/upload_images/1814468-0f980f06e336b064.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
- 找到打包生成应用签名(
-
Tips
- 签名格式:小写连续不冒号
由于以上两个方式查看到的应用签名都是大写冒号间隔,如:
CE:18:7E:D6:7E:05:C2:D8:87:9B:F6:6B:BF:DF:C8:B9
但是申请时填写的应用签名需转换为小写连续不冒号,既:
ce187ed67e05c2d8879bf66bbfdfc8b9
不然会因应用签名不匹配而调起微信失败,闪回原程序 - 申请的签名与调试时所用版本是否匹配:
release
/debug
注意调试时项目是debug的还是打包的relaese版,两者所对应的签名不同, - 清除缓存:
若因签名不同,待确认所填写签名与使用版本的签名一致后,清除本地微信缓存或卸载重装微信后再调试 - 官网说明:Android常见问题
-
二. 环境配置
-
2.1 搭建环境
- 在Eclipse中建立你的工程。
- 在工程中新建一个libs目录,将开发工具包中libs目录下的libammsdk.jar复制到该目录中(如下图所示,建立了一个名为SDK_Sample 的工程,并把jar包复制到libs目录下)。
3. 右键单击工程,选择Build Path中的Configure Build Path...,选中Libraries这个tab,并通过Add Jars...导入工程libs目录下的libammsdk.jar文件。(如下图所示)
>
在你需要使用微信终端API的文件中导入相应的类:
import com.tencent.mm.sdk.openapi.WXTextObject;
- AndroidManifest.xml 设置添加必要的权限支持:
<code class="code"> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> </code>
以上摘至官方文档,具体详见Android接入指南
资源下载可至:Android资源下载
三. 分享集成
-
3.1 接口方法类及属性
- WXMediaMessage -- 微信媒体消息内容
- mediaObject描述一个媒体对象的基类
- 媒体对象包括WXTextObject,WXImageObect 等
- 分享或收藏的目标场景,通过修改scene场景值实现
发送到聊天界面 —— WXSceneSession
发送到朋友圈 —— WXSceneTimeline
添加到微信收藏 —— WXSceneFavorite
- WXMediaMessage -- 微信媒体消息内容
-
3.2 集成:
要使你的程序启动后微信终端能响应你的程序,必须在代码中向微信终端注册你的id:
api = WXAPIFactory.createWWXAPI(this,APP_ID,ture);// 第三个参数作用? api.registerApp(APP_ID)
1. #### Steps:
> 1. 将要分享的内容shareContent,传给新建出来的相应类型媒体对象
```
WXTypeObject typeObj = new WXTypeObject(); // typeObj为分享内容类型
typeObj = shareContent;// 分享内容
```
>2. 初始化WXMediaMessage对象,并将带有分享内容的类型媒体对象typeObj赋值给其mediaObject属性
```
WXMediaMessage msg = new WXMediaMessage();
msg.mediaObject = typeObject;
```
>3. 构造Req,并选择分享的目标场景**scene**
```
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = buildTransaction("text");// 用于唯一标识一个请求
req.message = msg;
req.scene = SendMessageToWX.Req.WXSceneSession;
```
>4. 调用api.sendReq(req);
```
api.sendReq(req);
```
> 每个类型的分享流程大致都如上,只是需要根据具体的分享类型修改第1,2步骤
2. #### Code
>- 文字分享
```
// 初始化一个WXTextObject对象,并填写分享的内容
WXTextObject textObject = new WXTextObject();
textObject.text = "textObject.text"; // 分享的内容,即对方收到的消息
// 用WXTextObject对象初始化WXMediaMessage对象
WXMediaMessage msg = new WXMediaMessage();
msg.mediaObject = textObject;
msg.description = "description"; // 分享框的title文字
// 构造一个Req
SendMessageToWX.Req req = new SendMessageToWX.Req();
// 用于唯一标识一个请求
req.transaction = buildTransaction("text");
req.message = msg;
req.scene = SendMessageToWX.Req.WXSceneSession;// 聊天界面
// 调用api接口发送数据到微信
Toast.makeText(this,"" + api.sendReq(req),Toast.LENGTH_SHORT).show();
```
>- 图片分享
```
// 获取索要分享的图片
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.little);
// 初始化WXImageObject,并将图片传入
WXImageObject imgObject = new WXImageObject(bmp);
// 初始化WXMediaMessage对象,并将imgObj赋值给媒体对象mediaObject
WXMediaMessage msg = new WXMediaMessage();
msg.mediaObject = imgObject;
Bitmap thumbBmp = Bitmap.createScaledBitmap(bmp, 150, 150, true);
bmp.recycle();
msg.thumbData = bmpToByteArray(thumbBmp, true);
// 构造一个Req
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = buildTransaction("img");
req.message = msg;
req.scene = SendMessageToWX.Req.WXSceneSession;
// 调用api接口发送数据到微信
Toast.makeText(this,"" + api.sendReq(req),Toast.LENGTH_SHORT).show();
```
>- 其余媒体类型可具体参照-- 微信官方文档:[分享与收藏功能开发文档(Android应用)](https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419317340&token=09e51320315d0c4a38675f1214ff706ea4a56260&lang=zh_CN)
3. ####Tips:
>- 注意所分享类型的限制条件,例如分享的文字及图片有大小限制,所以若图片缩略图大于32k则分享不成功,以下有网上找的解决方法:
-
3.3 问题:无法分享App类型消息
- 项目无法分享App,参照微信提供Demo,分享
WXAppExtendObject
类型对象,却分享失败,结果如下:
有哪位大神知晓原因或有做过的,希望能给予解答
- 项目无法分享App,参照微信提供Demo,分享
四. 分享消息回调APP
-
4.1 网页调起
貌似由于微信加载WebView时添加过滤,所以利用scheme打开APP的方式在微信中失效
-
原理图示
-
代码
- HTML
<html> <head></head> <body> <a href=testapp://><span>lunch</span></a> <a href=testapp://id=1><span>lunch</span></a> </body> </html>
>- Android
<intent-filter > <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.BROWSER"/> <data android:scheme="testapp"/> </intent-filter>
- HTML
-
扩展
可以根据不同的需求,在网页上配置不同的scheme字段,并在AndroidManifest.xml相应的Activity中配置所匹配的scheme,从而可以实现根据网页打开特定界面的需求
-
遗留:其他App参考
京东/CSDN/知乎等APP,在微信中点击其分享的消息,跳转的webview顶部有控件,从而实现跳转
-
-
4.2 遗留:微信API调起
微信提供Demo中,能在微信中点击由Demo分享的app类型消息,从而跳回Demo,但本地集成中:
- 无法分享App类型消息,既无法分享WXAppExtendObject类型消息
-
按官网提供文档(4.[3] 接收微信的请求及返回值),新建WXEntryActivity类实现IWXAPIEventHandler接口,APP成功接收分享至微信的结果返回值,但微信发送的请求无反应,既如图:
百思百度谷歌都无过,不知是否遗漏了什么要点,希望能有高人点解
-
4.3 未添加:判断是否安装并根据结果进行下载或直接打开
扩展
- <span id="api">微信API接口</span> -- 以下摘至:[转载]Android平台第三方应用分享到微信开发
-
微信开放平台的一些公共类
- 微信SDK会用到的主要类的类图
上面这张图展示的是与微信通信过程中的请求类和响应类。第三方应用通过他们
附带的message字段来携带消息传输给微信进程。其中BaseResp有个内部类是ErrCode,它里面定义了几个常量字段,当我们向微信发送请求后它会作为返回字段返回到我们的应用中来,我们可以根据这个做相应的处理(比如弹个toast来提醒用户分享的状态)。- Message相关的类图
上面提到过,第三方应用是通过请求类和响应类中的message字段来和微信通信的,那么下面的图就展示了Message相关类的类图:
第三方应用和微信就是通过上面的不同种类的Message对象来与微信进行通信,从而能达到想要的效果。
- 通信相关类
上面的IWXAPI就是所说的通信类,所有与微信进行通信的工作都是他在做,我们可以通过下面的工厂类来生成一个IWXAPI对象。旁边的IWXAPIEventHandler接口是需要我们第三方应用来实现的,如果我们想处理微信的请求信息或是我们向他发请求后他返回的标识字段,我们可以按照实现这个接口(可以参考微信开放平台文档上有详细说明http://open.weixin.qq.com/document/gettingstart/android/?lang=zh_CN)。 -
微信与第三方应用通信时序图
- 第三方应用向微信发送消息时的时序图
应用只需要进行一次注册就行了,我们可以在一个Acitivity的onCreate()中注册。然后在以后的使用中只需要封装消息,让通信类发送即可。从前面的类图中可以看到,封装消息的顺序是首先生成需要发送的媒体对象,然后将媒体对象附加到消息对象中,接着建立请求对象,最后使用通信类发送即可。
在向微信发送消息的时候,会弹出一个分享到微信的弹框,包括分享到微信之后的消息展示,都是微信自己定义的UI展示,第三方应用是无法控制的(只是对不同消息类型,微信的展示也是不同的)。- 第三方应用接收微信请求信息的时序图
微信向第三方发送的请求信息分为两种:一种是第三方应用注册到微信后在聊天界面出现的应用图标(如下图所示)。然后点击这个图标能向第三方应用发送请求,第二种是针对微信的WXAppExtendObject类型的对象的,当用户点击了微信中的消息之后,微信就会去请求第三方应用完成请求。
它的时序图如下所示:
-
Refs:
android 微信 sdk api调用不成功解决方案运行
Android APP分享功能实现
Android:微信授权登录与微信分享全解析
Android利用微信SDK分享到微信教程,回调分享结果错误解决和注意点,androidsdk
接收微信的请求信息
解决微信开放平台分享图片失败问题
解决微信分享图片,网址失效的Bug -- 不完美解决
[转载]Android平台第三方应用分享到微信开发
Android平台好友点击微信分享的内容后跳转来源App的实现方案研究
微信直接打开App
Android平台好友点击微信分享的内容后跳转来源App的实现方案研究