一.接入
APP申请审核
首先项目集成微信SDK,需要到官网注册,因为微信对第三方的调用有着严格的验证:App ID,包名,及应用签名,只有这三个跟申请的都完全匹配,才能调用分享。
需要注意点:
1) 应用官网那栏可以直接填写你的博客地址或其他
2) 包名需填写你所要集成项目的包名,后续可修改
3) 应用签名格式为小写连续,并且注意填写签名的版本
二.搭建开发环境
Android Studio环境下:
在build.gradle文件中,添加如下依赖即可:
dependencies {
compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
}
或
dependencies {
compile 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'
}
[1] AndroidManifest.xml 设置
添加必要的权限支持:
三.分享集成
3.1 接口方法类及属性
WXMediaMessage -- 微信媒体消息内容
mediaObject描述一个媒体对象的基类
媒体对象包括WXTextObject,WXImageObect 等
3.2 分享或收藏的目标场景,通过修改scene场景值实现
发送到聊天界面 ——WXSceneSession
发送到朋友圈 ——WXSceneTimeline
添加到微信收藏 ——WXSceneFavorite
3.3 集成
要使你的程序启动后微信终端能响应你的程序,必须在代码中向微信终端注册你的id:
api = WXAPIFactory.createWWXAPI(this,APP_ID,ture);// 第三个参数作用?
api.registerApp(APP_ID)
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. 文字分享
// 初始化一个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();
>- 其余媒体类型可具体参照-- 微信官方文档:(分享与收藏功能开发文档)
3. Tips: >- 注意所分享类型的限制条件,例如分享的文字及图片有大小限制,所以若图片缩略图大于32k则分享不成功。
3.4.跳转小程序
val miniProgramObj = WXMiniProgramObject()
miniProgramObj.webpageUrl = "http://www.qq.com"
// 兼容低版本的网页链接
miniProgramObj.miniprogramType = WXMiniProgramObject.MINIPROGRAM_TYPE_PREVIEW // 正式版:0,测试版:1,体验版:2
miniProgramObj.userName = "gh_b7a83a16c048" // 小程序原始id
miniProgramObj.path = "pages/index/index" //小程序页面路径
val msg = WXMediaMessage(miniProgramObj)
msg.title = "小程序消息Title" // 小程序消息title
msg.description = "小程序消息Desc" // 小程序消息desc
msg.thumbData = getThumb() // 小程序消息封面图片,小于128k
val req = SendMessageToWX.Req()req.transaction = buildTransaction("webpage")
req.message = msgreq.scene = SendMessageToWX.Req.WXSceneSession // 目前只支持会话
api.sendReq(req)
3.5接收微信的请求及返回值(从小程序跳回app必须要实现)
如果你的程序需要接收微信发送的请求,或者接收发送到微信请求的响应结果,需要下面3步操作:
a. 在你的包名相应目录下新建一个wxapi目录,并在该wxapi目录下新增一个WXEntryActivity类(保命,类名不可改),该类继承自Activity
并在manifest文件里面加上exported属性,设置为true,例如:
b. 实现IWXAPIEventHandler接口,微信发送的请求将回调到onReq方法,发送到微信请求的响应结果将回调到onResp方法
c. 在WXEntryActivity中将接收到的intent及实现了IWXAPIEventHandler接口的对象传递给IWXAPI接口的handleIntent方法,示例如下图:
当微信发送请求到你的应用,将通过IWXAPIEventHandler接口的onReq方法进行回调,类似的,应用请求微信的响应结果将通过onResp回调。
四. 点击微信分享的内容后跳转来源App的实现
方案一
从WebView(该WebView从属于另一个App,并非我们自己的App)跳转到MyApp的某个界面(这里以跳转到MyApp的Acticity A为例)。具体的实现逻辑如下:
(1)该WebView显示的网页内容只是一个超链接,自定义了一个scheme=myapp://,后边可以附加一些参数,如果需要从网页向App传值的话。
(2)MyApp中的Activity A需要配置特定的infliter,如下:
(3)当在WebView上点击上述自定义的超链接时就可以打开MyApp的A界面,所传递的参数也可以在所跳转到的Activity中获取,方法如下:
getIntent().getScheme();//获得Scheme名称
getIntent().getDataString();//获得Uri全部路径,根据自定义的格式解析字符串即可获取我们上面附加的参数。
问题1:如果用户安装了MyApp,就可以点击网页跳转,如果没有安装MyApp的话,WebView就会提示找不到该页面。制作网页时可以在网页中做检测,没安装MyApp的话,页面就重定向到应用的下载页面。
问题2:在普通App的WebView中和浏览器中上述机制是可以的,但是在微信的WebView是不可以点击直接跳转我们的应用的,可能是微信做了某些过滤,且仅仅支持跟微信有深度合作的应用的跳转,如大众点评是可以的。针对这种情况,我们可以引导用户使用浏览器打开所分享的网页,然后点击就可以跳转应用了。
方案二
使用微信SDK分享WXAppExtendObject数据给好友,好友点击跳转MyApp的某个页面(需要在分享时传递构造跳转Intent的参数)。
1.该类型的分享(具体请参考微信分享SDK)可以带几个参数,参数中必须附带一些构造跳转Intent的数据。
2.好友点击分享的内容,回调IWXAPIEventHandler接口的类的onReq方法,具体为
ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX:这种情况才会调用,此时可以取出分享时附带在参数中的一些数据,构造一个跳转Intent,调用startActivity(intent) 来打开MyApp。
问题0:现版本无法分享App类型消息(低版本可以,微信抽风)
问题1:该分享方式只能分享给好友,不能分享到朋友圈。
问题2:如果好友没安装MyApp,点击微信中好友分享过来的消息后无反应,无法提醒“未安装MyApp,请下载”,因为这些逻辑要实现的话本身就是在MyApp里面写的,原本没装的话根本无法检测。
问题3:WXAppExtendObject类型的分享,数据有大小限制,
extInfo(String)限制2KB;
fileData(byte[])供第三方使用的文件二进制数据,最大10M;
filePath:(String)Local directory of the file provided for applications,本身长度最大10KB,文件大小同上,不超过10M。
五.目前存在问题
1.无法分享App类型消息
解决方式:用老版本的微信,新版本的微信不支持WXAppExtendObject
疑问:但是微信分享的官方demo是可以分享app类型消息的,猜测是否微信官方对app类型消息做了过滤。