热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

微信分享全指南

微信分享CSDN博客还头一次用markDown,没想到语法不一样,这边很多不支持,就这样了…https:open.weixin.qq.comcgi-binshowd

微信分享

CSDN博客还头一次用markDown,没想到语法不一样,这边很多不支持,就这样了…

https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419317340&token=&lang=zh_CN(官方文档)

1 . ### 前期准备工作
* 微信分享sdk准备好,和微信支付是同一个sdk
* 权限啊什么的
* APP_ID还有应用号什么的注册(最好在 application里面进行注册,这样 微信支付和微信分享都能直接获取微信api对象)

public static IWXAPI wXapi;

//微信支付,微信分享 注册
wXapi = WXAPIFactory.createWXAPI(this, Constants.WX_APPID);
wXapi.registerApp(Constants.WX_APPID);

2 . ### 与前端之前的交流沟通准备工作
微信分享分2种情况…
* #### 第一种:本地APP内进行微信分享(无需前端)

这种情况,需要本地创建popWindow布局,创建popWindow逻辑相关的类…

微信朋友和微信朋友圈icon资源:

https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419319171&token=&lang=zh_CN
需要注意的是,微信朋友圈的图片大小是600 x 600,需要找美工进行处理

通过自行创建的popWindow的点击监听,获取 点击的index,获知 点击的是 微信朋友还是微信朋友圈.传递给 分享逻辑使用…

  • #### 第二种:本地APP内html5页面内进行微信分享(需要与前端进行交流沟通)

这种情况,需要JS调用JAVA端代:

JAVA端

/**
*"Android"可自行修改,并与前端一致
*API17以上时,需要添加@JavascriptInterface注解
*webView设置settings.setJavascriptEnabled(true);
*/

webView.addJavascriptInterface(new JSInterface (),"Android");

class JSInterface {
@JavascriptInterface
public void shareToWX(String title, String description, String url, String shareIndex, String imgurl){
//这里是 分享的具体逻辑,由JS调用
}
}

JS端

在对应的button | div等组件onclick对应的function内

var u = navigator.userAgent;
var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > -1; //android终端
var isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端
if(isAndroid) {
window.Android.shareToWX("这是标题", "这是描述", url, shareIndex, imgUrl);
} else if(isiOS) {
shareToWX("这是标题", "这是描述", url, shareIndex, imgUrl);
}

通过agent嗅探,获知当前OS.
window.约定好的名称.约定好的被调用方法名(需要的参数)
进行调用

JS端传递的参数正是微信分享需要的内容,因为是html5页面的内容,只能通过JS传递过来…


3 . ### api调用微信分享

WXWebpageObject webpage = new WXWebpageObject();
webpage.webpageUrl = url;

WXMediaMessage msg = new WXMediaMessage(webpage);
msg.title = title;
msg.description = description;

Bitmap bmp = BitmapUtils.getbitmap(imgurl);
Bitmap thumbBmp = Bitmap.createScaledBitmap(bmp, THUMB_SIZE, THUMB_SIZE, true);
bmp.recycle();
msg.thumbData = BitmapUtils.bmpToByteArray(thumbBmp, true);

SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = buildTransaction("webpage");
req.message = msg;

//0是分享到 微信朋友,1是分享到 微信朋友圈
if (Integer.parseInt(shareIndex) == 0) {
mTargetScene = SendMessageToWX.Req.WXSceneSession;
} else if (Integer.parseInt(shareIndex) == 1) {
mTargetScene = SendMessageToWX.Req.WXSceneTimeline;
}
req.scene = mTargetScene;
MyBaseApplication.wXapi.sendReq(req);

finish();

需要注意的是,根据分享的内容类型,在创建WXMediaMessage时,传入不同的值…

比如:网页 webpage,文本 text等…

scence的处理…

根据本地popWindow的点击监听或者通过JS端监听传递过来的index进行选择


4 . #### 微信分享结果回调处理
微信分享的结果回调处理和微信支付类似,必须在com.xxx.wxapi包名内创建一个 名称固定的 类名

微信支付的是 WXPayEntryActivity

微信分享的是 WXEntryActivity

和微信支付结果处理页面一样,实现IWXAPIEventHandler接口…重写2个方法.

主要是:

@Override
public void onResp(BaseResp baseResp) {
int result = 0;

switch (baseResp.errCode) {
case BaseResp.ErrCode.ERR_OK:
result = R.string.wx_share_notice_success;
break;
case BaseResp.ErrCode.ERR_USER_CANCEL:
result = R.string.wx_share_notice_cancel;
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED:
result = R.string.wx_share_notice_deny;
break;
default:
result = R.string.wx_share_notice_unkown;
break;
}

ToastUtils.show(this, result);
finish();
}

最后需要在清单文件中 注册该Activity,同时必须得添加上..
android:exported=”true”

OVER…..


5 . #### 代码的混淆

-keepclassmembers class 包名$方法名 {

public *;

}

-keepattributes *JavascriptInterface*

6 . #### 其他相关

private String buildTransaction(final String type) {
return (type == null) ? String.valueOf(System.currentTimeMillis()) : type + System.currentTimeMillis();
}



public class BitmapUtils {

public static byte[] bmpToByteArray(final Bitmap bmp, final boolean needRecycle) {
ByteArrayOutputStream output = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, output);
if (needRecycle) {
bmp.recycle();
}

byte[] result = output.toByteArray();
try {
output.close();
} catch (Exception e) {
e.printStackTrace();
}

return result;
}

public static Bitmap getbitmap(String imageUri) {
// 显示网络上的图片
Bitmap bitmap = null;
try {
URL myFileUrl = new URL(imageUri);
HttpURLConnection cOnn= (HttpURLConnection) myFileUrl
.openConnection();
conn.setDoInput(true);
conn.connect();
InputStream is = conn.getInputStream();
bitmap = BitmapFactory.decodeStream(is);
is.close();

} catch (OutOfMemoryError e) {
e.printStackTrace();
bitmap = null;
} catch (IOException e) {
e.printStackTrace();
bitmap = null;
}
return bitmap;
}
}

推荐阅读
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • JavaScript和HTML之间的交互是经由过程事宜完成的。事宜:文档或浏览器窗口中发作的一些特定的交互霎时。能够运用侦听器(或处置惩罚递次来预订事宜),以便事宜发作时实行相应的 ... [详细]
  • 使用eclipse创建一个Java项目的步骤
    本文介绍了使用eclipse创建一个Java项目的步骤,包括启动eclipse、选择New Project命令、在对话框中输入项目名称等。同时还介绍了Java Settings对话框中的一些选项,以及如何修改Java程序的输出目录。 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
  • 本文介绍了pack布局管理器在Perl/Tk中的使用方法及注意事项。通过调用pack()方法,可以控制部件在显示窗口中的位置和大小。同时,本文还提到了在使用pack布局管理器时,应注意将部件分组以便在水平和垂直方向上进行堆放。此外,还介绍了使用Frame部件或Toplevel部件来组织部件在窗口内的方法。最后,本文强调了在使用pack布局管理器时,应避免在中间切换到grid布局管理器,以免造成混乱。 ... [详细]
  • 本文总结了在编写JS代码时,不同浏览器间的兼容性差异,并提供了相应的解决方法。其中包括阻止默认事件的代码示例和猎取兄弟节点的函数。这些方法可以帮助开发者在不同浏览器上实现一致的功能。 ... [详细]
author-avatar
-而我知道阿信很忙
这个家伙很懒,什么也没留下!
Tags | 热门标签
RankList | 热门文章
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有