Creator中使用Android微信分享

摘要

一般我们做Android项目会涉及到微信分享朋友圈,微信好友功能,在使用该功能前需要先在微信开放平台进行申请。链接地址https://open.weixin.qq.com申请时间一般在七到十四个工作日。

版本说明

使用 CocosCreator 的 2.4.3 版本。

分享文字

分享图片

Android代码

特别注意

在开发测试阶段需要用官方给的工具进行生成应用签名,并在微信开放平台->管理中心->应用详情->开发信息进行修改,签名工具下载地址https://open.weixin.qq.com/zh_CN/htmledition/res/dev/download/sdk/Gen_Signature_Android.apk

代码开始

  1. 引入微信依赖,在项目的build.gradle文件中 dependencies 对象中添加依赖即以下代码:

    implementation 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'
    
  2. AndroidManifext添加必要的权限支持(其中网络权限如果没有使用扫码登录功能非必要;后三个权限,如果没有使用 mta,也非必要,即使有使用 mta,去掉也不影响功能):

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    
  3. 注册到微信,要使你的程序启动后微信终端能响应你的程序,必须在代码中向微信终端注册你的 id。(如下图所示,可以在程序入口 Activity 的 onCreate 回调函数处,或其他合适的地方将你的应用 id 注册到微信

    以下皆为WeChatSDK类方法

    • 在类的开始处定义以下变量:
    	private static AppActivity mActivity = null;
    	// 相应的包,请集成SDK后自行引入
        private static IWXAPI api; 
        
        private static final int THUMB_SIZE = 120;
        // 分享微信好友
        private static final int SceneSession = 0;
        // 分享微信朋友圈
        private static final int SceneTimeline = 1;
    	// APP_ID
    	public static final String APP_ID = "wx00000000000000";
    
    • 声明setContext()方法,并在主AppActivity的onCreate()方法中进行调用该方法并传入this
    	public static void setContext(AppActivity mActivity) {
            WeChatSDK.mActivity = mActivity
            api = WXAPIFactory.createWXAPI(mActivity, APP_ID,true);
            // 将该app注册到微信
            api.registerApp(APP_ID);
        }
    
    • 微信分享文字方法
        /**
         * 微信分享文字
         * @param text  需要分享的文字
         * @param type  分享类型 微信好友,微信朋友圈
         */
        private static void shareTextWx(String text,int type){
            // 初始化一个 WXTextObject 对象,填写分享的文本内容
            WXTextObject textObj = new WXTextObject();
            // 分享内容
            textObj.text = text;
            // 用 WXTextObject 对象初始化一个 WXMediaMessage 对象
            WXMediaMessage msg = new WXMediaMessage();
            msg.mediaObject = textObj;
            // 消息描述
            msg.description = "测试";
            SendMessageToWX.Req req = new SendMessageToWX.Req();
            //transaction字段用与唯一标示一个请求
            req.transaction = buildTransaction("text");
            req.message = msg;
            // 发送的目标场景
            // 分享到对话:SendMessageToWX.Req.WXSceneSession
            // 分享到朋友圈:SendMessageToWX.Req.WXSceneTimeline
            // 分享到收藏:SendMessageToWX.Req.WXSceneFavorite
            if( type == SceneTimeline )
            {
                req.scene = SendMessageToWX.Req.WXSceneTimeline;
            }
            else if( type == SceneSession )
            {
                req.scene = SendMessageToWX.Req.WXSceneSession;
            }
            //调用api接口,发送数据到微信
            api.sendReq(req);
        }
    
    • 微信分享图片方法
        /**
         *  微信分享图片
         * @param imgPath 图片地址
         * @param type   分享类型 微信好友,微信朋友圈
         */
        public static void shareImgWx (String imgPath,int type) {
            // 获取cocos路径下的 这里在cocos中用 asset.nativeUrl进行获取图片的路径(在后面会说到)
            Bitmap bitmap=null;
            try {
                // 获取Assets下的文件
                InputStream is = mActivity.getAssets().open(imgPath);
                bitmap = BitmapFactory.decodeStream(is);
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            //初始化 WXImageObject 和 WXMediaMessage 对象
            WXImageObject imgObj = new WXImageObject(bitmap);
            WXMediaMessage msg = new WXMediaMessage();
            msg.mediaObject = imgObj;
            //设置缩略图
            Bitmap thumbBmp = Bitmap.createScaledBitmap(bitmap, THUMB_SIZE, THUMB_SIZE, true);
            bitmap.recycle();
            // 建一个字节数组缓冲区WxUtil为单独一个工具类
            msg.thumbData = WxUtil.bmpToByteArray(thumbBmp, true);
            //构造一个Req
            SendMessageToWX.Req req = new SendMessageToWX.Req();
            req.transaction = buildTransaction("img");
            req.message = msg;
            if( type == SceneTimeline )
            {
                req.scene = SendMessageToWX.Req.WXSceneTimeline;
            }
            else if( type == SceneSession )
            {
                req.scene = SendMessageToWX.Req.WXSceneSession;
            }
            //调用api接口,发送数据到微信
            api.sendReq(req);
        }
    
    • 对应该请求的事务 ID
        /**
         * 微信分享类型转换
         * @param type {text,img}
         * @return
         */
        private static String buildTransaction(final String type) {
            return (type == null) ? String.valueOf(System.currentTimeMillis()) : type + System.currentTimeMillis();
        }
    
    • WxUtil类内容

      public class WxUtil {
          public static final int IMAGE_SIZE=32768;
          public static byte[] bmpToByteArray(final Bitmap bmp, final boolean needRecycle) {
              ByteArrayOutputStream output = new ByteArrayOutputStream();
              bmp.compress(Bitmap.CompressFormat.JPEG, 100, output);
              int options = 100;
              while (output.toByteArray().length > IMAGE_SIZE && options > 10) {
                  options -= 10;
                  output.reset();
                  bmp.compress(Bitmap.CompressFormat.JPEG, options, output);
              }
              if (needRecycle) {
                  bmp.recycle();
              }
              byte[] result = output.toByteArray();
              try {
                  output.close();
              } catch (Exception e) {
                  e.printStackTrace();
              }
              return result;
          }
      }
      

cocos crertor代码

// 定义Asset资源,并在面板中拖拽
@property(cc.Asset) yy:cc.Asset = undefined;

// 调用微信图片分享到微信朋友圈,修改为0则是分享给好友
// this.yy.nativeUrl则为获取图片资源路径
jsb.reflection.callStaticMethod("包名的路径", "方法名", "(Ljava/lang/String;I)V",this.yy.nativeUrl,1);

// 调用微信文字分享
jsb.reflection.callStaticMethod("包名的路径", "方法名", "(Ljava/lang/String;I)V","我是测试内容",0);

原链接:https://www.zhita.wang/2021/02/02/wxSdk

1赞

楼主 你好, 麻烦请教一下。 使用你提供的微信分享图片, 在cocos creator 中热更的时候,
InputStream is = mActivity.getAssets().open(imgPath); 这行代码只能获取assets , 无法获取沙盒热更的最新资源呢 请问有好的办法吗