热门标签 | 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;
}
}

推荐阅读
  • 本文介绍了如何通过配置 Android Studio 和 Gradle 来显著提高构建性能,涵盖内存分配优化、并行构建和性能分析等实用技巧。 ... [详细]
  • QUIC协议:快速UDP互联网连接
    QUIC(Quick UDP Internet Connections)是谷歌开发的一种旨在提高网络性能和安全性的传输层协议。它基于UDP,并结合了TLS级别的安全性,提供了更高效、更可靠的互联网通信方式。 ... [详细]
  • 本文介绍如何在 Android 中通过代码模拟用户的点击和滑动操作,包括参数说明、事件生成及处理逻辑。详细解析了视图(View)对象、坐标偏移量以及不同类型的滑动方式。 ... [详细]
  • 深入理解OAuth认证机制
    本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ... [详细]
  • 2023 ARM嵌入式系统全国技术巡讲旨在分享ARM公司在半导体知识产权(IP)领域的最新进展。作为全球领先的IP提供商,ARM在嵌入式处理器市场占据主导地位,其产品广泛应用于90%以上的嵌入式设备中。此次巡讲将邀请来自ARM、飞思卡尔以及华清远见教育集团的行业专家,共同探讨当前嵌入式系统的前沿技术和应用。 ... [详细]
  • 深入理解 Oracle 存储函数:计算员工年收入
    本文介绍如何使用 Oracle 存储函数查询特定员工的年收入。我们将详细解释存储函数的创建过程,并提供完整的代码示例。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • 毕业设计:基于机器学习与深度学习的垃圾邮件(短信)分类算法实现
    本文详细介绍了如何使用机器学习和深度学习技术对垃圾邮件和短信进行分类。内容涵盖从数据集介绍、预处理、特征提取到模型训练与评估的完整流程,并提供了具体的代码示例和实验结果。 ... [详细]
  • 本文介绍了如何使用JavaScript的Fetch API与Express服务器进行交互,涵盖了GET、POST、PUT和DELETE请求的实现,并展示了如何处理JSON响应。 ... [详细]
  • 本文详细介绍了如何构建一个高效的UI管理系统,集中处理UI页面的打开、关闭、层级管理和页面跳转等问题。通过UIManager统一管理外部切换逻辑,实现功能逻辑分散化和代码复用,支持多人协作开发。 ... [详细]
  • 本文介绍如何使用 Angular 6 的 HttpClient 模块来获取 HTTP 响应头,包括代码示例和常见问题的解决方案。 ... [详细]
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
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社区 版权所有