鸿蒙微博SDK分享

2,241 阅读3分钟

鸿蒙微博SDK分享

前言

因为公司想在鸿蒙九月份发布前把鸿蒙APP搞出来,最近一直在如牛马一样工作,其中就有几个SDK要从安卓迁移过来,虽然大部分SDK都还没什么消息,微博倒是挺快,这里记录下。

SDK下载

可以用下面链接下载鸿蒙的SDK,里面有 demo 和一个 har 包:

鸿蒙 SDK下载

创建一个 lib 目录,把 har 包放到里面:

entry/lib/core.har

然后在 terminal 执行安装,就集成好了微博SDK:

ohpm install .\entry\lib\core.har

申请 appKey

弄好 SDK 后,就可以去申请 appKey了,去微博开发平台登录你的开发者账号:

微博开放平台

然后创建APP,在我的应用 - 应用信息 - 基础信息右边的应用基础信息,点击编辑:

image.png

在下面勾选 Android 后,在 Android 的信息里面填写鸿蒙的信息(说实话这里卡了我好久,网上没教程),包括包名和签名:

image.png

点击保存就好了,应用就算没审核通过,也是可以分享的。

编写分享代码

官方的 demo 里面有代码可以参考,不过我这也整理了一下,读者也可以参考参考。

初始化

拿到你的 appKey 后,就可以编写代码了,下面是初始化:

  // 配置信息,填入你的appKey,其他感觉默认就OK
  private readonly APP_KEY = "xxx";
  private readonly REDIRECT_URL = "http://www.sina.com";
  private readonly SCOPE =
    "email,direct_messages_read,direct_messages_write,"
      + "friendships_groups_read,friendships_groups_write,statuses_to_me_read,"
      + "follow_app_official_microblog," + "invitation_write";
  private readonly CALLBACK_ABILITY = "EntryAbility";
  
  // 微博API
  private mWBAPI: IWBAPI | null = null;
  
   /**
   * 初始化sdk。
   * 理论上使用前只要初始化一次即可,具体分享及授权登录时将不需要再次初始化。
   */
  initSdk(context: Context): void {
    // 认证信息
    let authInfo = new AuthInfo(
      context,
      this.APP_KEY,
      this.REDIRECT_URL,
      this.SCOPE,
      this.CALLBACK_ABILITY
    );

    let listener: SdkListener = {
      onInitSuccess: () => {
        LogUtil.d("WeiboUtil", "init sdk success " );
      },
      onInitFail: (error: Error) => {
        LogUtil.d("WeiboUtil", "init sdk failed errmsg: " + error.message);
      }
    };

    WBAPI.getInstance().registerApp(authInfo, listener);
    this.mWBAPI = WBAPI.getInstance();
  }

分享

我这里就写一个文字带图的分享了,比较简单,但是也踩坑了挺久:

  async doWeiboShare(
    context: Context,
    title: string,
    url: string,
    description: string,
    image: string
  ): Promise<string> {
    return new Promise(async (resolve, reject) => {
      try {
        if (!this.mWBAPI) {
          this.initSdk(context);
        }

        let message: WeiboMultiMessage = new WeiboMultiMessage();

        // 文字部分
        let textObject = new TextObject();
        textObject.text = title + "\n" + description + "\n\n" + url;
        // textObject.text = "这些东西没有效果";
        // textObject.title = title;
        // textObject.description = description;
        // textObject.actionUrl = url;
        message.textObject = textObject;

        // 多图分享
        let multiImage = new MultiImageObject();
        // multiImage.title = title;
        // multiImage.description = description;
        // multiImage.actionUrl = url;

        // 下载图片
        let transfer = new FileTransferUtil();
        let imagePath = await transfer.downloadFile(context, image);

        let uris: ArrayList<string> = new ArrayList<string>();
        uris.add(fileUri.getUriFromPath(imagePath));
        multiImage.uriStrs = uris.convertToArray();

        // 多种消息
        message.multiImageObject = multiImage;

        if(this.mWBAPI != null) {
          let listener: WbASListener = {
            onComplete: () => {
              resolve("分享成功");
              promptAction.showToast({
                message: '分享成功',
                duration: 2000
              });
            },
            onError: (error: UiError) => {
              reject("分享取消");
              promptAction.showToast({
                message: '分享出错: ' + error.errorMessage,
                duration: 2000
              });
            },
            onCancel: () => {
              reject("分享取消");
              promptAction.showToast({
                message: '分享取消',
                duration: 2000
              });
            }
          };
          this.mWBAPI.shareMessage(context as common.UIAbilityContext, message, listener);
        }
      } catch (e) {
        LogUtil.e(e)
        reject(e)
      }
    });
  }

比较坑的是他这些个title、description、actionUrl好像没什么用,没办法还不如直接拼一个文字字符串:

textObject.text = title + "\n" + description + "\n\n" + url;

另一个坑就算这里的图片不能直接用链接,还得下载好之后获得uri再给分享的object,有点无语,下载代码前面文章有写,不过也贴一下吧:

  /**
   * 下载文件
   *
   * @param context 上下文
   * @param uploadUrl 上传路径
   * @param path 文件路径(上传专用路径!!)
   * @param header 自定义请求头
   * @param textMap 文字部分请求
   * @param onSuccess 成功回调
   * @param onFailed 失败回调
   */
  async downloadFile(
    context: Context,
    downloadUrl: string,
    downloadPath: string = ""
  ): Promise<string> {
    return new Promise((resolve, reject) => {
      try {

        // 下载图片缓存地址
        if (downloadPath == "") {
          let dir = context.cacheDir + '/image'
          if (!fs.accessSync(dir)) {
            fs.mkdirSync(dir)
          }
          downloadPath = context.cacheDir + `/image/image_${new Date().getTime()}.jpg`
        }

        request.downloadFile(context, {
          url: downloadUrl,
          filePath: downloadPath
        }).then((downloadTask: request.DownloadTask) => {
          downloadTask.on('complete', () => {
            LogUtil.d('download complete: ' + downloadPath);
            resolve(downloadPath);
          })
        }).catch((err: BusinessError) => {
          LogUtil.e(err.message);
          reject(err.message);
        });
      } catch(e) {
        LogUtil.e(e)
        reject(e)
      }
    });
  }

这里的图片好像还有大小限制,读者使用的时候还得注意下,如果超出了大小还得 PixelMap 处理下,后面我还会开篇文章讲这个。

效果就不发了,我这就算一串文字一张图,和Android的效果差不多。

小结

花了点时间,简单记录了下鸿蒙next集成微博SDK的过程,包含SDK的下载与导入、appKey的获取、SDK初始化、文字带图的分享。