微信SDK分享功能集成的大坑小坑

最近由于相关需求,需要将微信分享集成到项目中,但在过程中遇到很多问题,现大致整理与此

此次过程中还有些许遗留问题(如无法分享app类型消息),待解决后会来此更新
(希望能有知晓的简友,给与指导解答,能早点解决)

<h2 id="1">一. APP申请审核</h2>

首先项目集成微信SDK,需要到官网注册,因为微信对第三方的调用有着严格的验证:App ID,包名,及应用签名,只有这三个跟申请的都完全匹配,才能调用分享。

按官网(微信开发平台)提示步骤申请移动应用,步骤都比较简单,按提示即可,需要说明的如下:

1) 应用官网那栏可以直接填写你的博客地址或其他
  2) 包名需填写你所要集成项目的包名,后续可修改
  3) 应用签名格式为小写连续,并且注意填写签名的版本

  • 1.1 查看项目的应用签名

    1. Eclipse 中查看

      • 顶部菜单Window -> Preferences -> Build,打开面板即可看到应用签名(debug版),如图


        Preferences - >Build
      • tip:运行下载的官网demo时,需要将签名文件替换为demo工程目录中的debug.keystore文件
    2. Android Studio 中查看

      • 找到打包生成应用签名(Build-->Generate Signed APK...)时候所产生的.jks文件
      Generate Signed APK...
      • 打开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)
      
      
    3. 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 搭建环境

    1. 在Eclipse中建立你的工程。
    2. 在工程中新建一个libs目录,将开发工具包中libs目录下的libammsdk.jar复制到该目录中(如下图所示,建立了一个名为SDK_Sample 的工程,并把jar包复制到libs目录下)。

    libs
    libs

    3. 右键单击工程,选择Build Path中的Configure Build Path...,选中Libraries这个tab,并通过Add Jars...导入工程libs目录下的libammsdk.jar文件。(如下图所示)
    >
    Referenced Libraries
    Referenced Libraries

    在你需要使用微信终端API的文件中导入相应的类:
    import com.tencent.mm.sdk.openapi.WXTextObject;

    1. 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

  • 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则分享不成功,以下有网上找的解决方法:

解决微信分享图片,网址失效的Bug -- 不完美解决

  • 3.3 问题:无法分享App类型消息

    • 项目无法分享App,参照微信提供Demo,分享WXAppExtendObject类型对象,却分享失败,结果如下:
    分享App失败

    有哪位大神知晓原因或有做过的,希望能给予解答

四. 分享消息回调APP

  • 4.1 网页调起

    貌似由于微信加载WebView时添加过滤,所以利用scheme打开APP的方式在微信中失效

    1. 原理图示

    网页打开APP
    1. 代码

      • 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>
    2. 扩展

    可以根据不同的需求,在网页上配置不同的scheme字段,并在AndroidManifest.xml相应的Activity中配置所匹配的scheme,从而可以实现根据网页打开特定界面的需求

    1. 遗留:其他App参考

    京东/CSDN/知乎等APP,在微信中点击其分享的消息,跳转的webview顶部有控件,从而实现跳转

  • 4.2 遗留:微信API调起

    微信提供Demo中,能在微信中点击由Demo分享的app类型消息,从而跳回Demo,但本地集成中:

    1. 无法分享App类型消息,既无法分享WXAppExtendObject类型消息
    2. 按官网提供文档(4.[3] 接收微信的请求及返回值),新建WXEntryActivity类实现IWXAPIEventHandler接口,APP成功接收分享至微信的结果返回值,但微信发送的请求无反应,既如图:


      官网文档截图

      百思百度谷歌都无过,不知是否遗漏了什么要点,希望能有高人点解

  • 4.3 未添加:判断是否安装并根据结果进行下载或直接打开

扩展

返回3.1

  • <span id="api">微信API接口</span> -- 以下摘至:[转载]Android平台第三方应用分享到微信开发
    1. 微信开放平台的一些公共类

      1. 微信SDK会用到的主要类的类图
      Paste_Image.png

      上面这张图展示的是与微信通信过程中的请求类和响应类。第三方应用通过他们
      附带的message字段来携带消息传输给微信进程。其中BaseResp有个内部类是ErrCode,它里面定义了几个常量字段,当我们向微信发送请求后它会作为返回字段返回到我们的应用中来,我们可以根据这个做相应的处理(比如弹个toast来提醒用户分享的状态)。

      1. Message相关的类图

      上面提到过,第三方应用是通过请求类和响应类中的message字段来和微信通信的,那么下面的图就展示了Message相关类的类图:



      第三方应用和微信就是通过上面的不同种类的Message对象来与微信进行通信,从而能达到想要的效果。

      1. 通信相关类


      上面的IWXAPI就是所说的通信类,所有与微信进行通信的工作都是他在做,我们可以通过下面的工厂类来生成一个IWXAPI对象。旁边的IWXAPIEventHandler接口是需要我们第三方应用来实现的,如果我们想处理微信的请求信息或是我们向他发请求后他返回的标识字段,我们可以按照实现这个接口(可以参考微信开放平台文档上有详细说明http://open.weixin.qq.com/document/gettingstart/android/?lang=zh_CN)。

    2. 微信与第三方应用通信时序图

      1. 第三方应用向微信发送消息时的时序图

      应用只需要进行一次注册就行了,我们可以在一个Acitivity的onCreate()中注册。然后在以后的使用中只需要封装消息,让通信类发送即可。从前面的类图中可以看到,封装消息的顺序是首先生成需要发送的媒体对象,然后将媒体对象附加到消息对象中,接着建立请求对象,最后使用通信类发送即可。
      在向微信发送消息的时候,会弹出一个分享到微信的弹框,包括分享到微信之后的消息展示,都是微信自己定义的UI展示,第三方应用是无法控制的(只是对不同消息类型,微信的展示也是不同的)。

      1. 第三方应用接收微信请求信息的时序图

      微信向第三方发送的请求信息分为两种:一种是第三方应用注册到微信后在聊天界面出现的应用图标(如下图所示)。然后点击这个图标能向第三方应用发送请求,第二种是针对微信的WXAppExtendObject类型的对象的,当用户点击了微信中的消息之后,微信就会去请求第三方应用完成请求。



      它的时序图如下所示:


返回3.1

Refs:

android 微信 sdk api调用不成功解决方案运行
Android APP分享功能实现
Android:微信授权登录与微信分享全解析
Android利用微信SDK分享到微信教程,回调分享结果错误解决和注意点,androidsdk
接收微信的请求信息
解决微信开放平台分享图片失败问题
解决微信分享图片,网址失效的Bug -- 不完美解决
[转载]Android平台第三方应用分享到微信开发
Android平台好友点击微信分享的内容后跳转来源App的实现方案研究
微信直接打开App
Android平台好友点击微信分享的内容后跳转来源App的实现方案研究

Top

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,378评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,356评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,702评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,259评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,263评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,036评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,349评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,979评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,469评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,938评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,059评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,703评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,257评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,262评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,501评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,792评论 2 345

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,510评论 25 707
  • 前言 最近项目中需要分享功能,就集成官方的分享,特此记录下,便于自己后续回顾。注意:我都是分享的网址即URL,其他...
    Jsonzhang阅读 6,111评论 2 11
  • 我爱你,默默的
    小强哈哈阅读 121评论 1 1
  • 1. 这个主题你不能再钻了,你做不出的。年近六十的数学教授,将一叠厚厚的稿纸缓缓放下,目光决然地望着面前那个瘦长的...
    写乐保介介阅读 3,037评论 6 4
  • 三大阶段: 第一阶段、同心协力,把会长赶下台 第二阶段、反目成仇,争抢向老师献花 第三阶段、同心协力,捉弄保安 第...
    苍穹一君阅读 1,523评论 2 4