鸿蒙微博SDK分享
前言
因为公司想在鸿蒙九月份发布前把鸿蒙APP搞出来,最近一直在如牛马一样工作,其中就有几个SDK要从安卓迁移过来,虽然大部分SDK都还没什么消息,微博倒是挺快,这里记录下。
SDK下载
可以用下面链接下载鸿蒙的SDK,里面有 demo 和一个 har 包:
创建一个 lib 目录,把 har 包放到里面:
entry/lib/core.har
然后在 terminal 执行安装,就集成好了微博SDK:
ohpm install .\entry\lib\core.har
申请 appKey
弄好 SDK 后,就可以去申请 appKey了,去微博开发平台登录你的开发者账号:
然后创建APP,在我的应用 - 应用信息 - 基础信息右边的应用基础信息,点击编辑:
在下面勾选 Android 后,在 Android 的信息里面填写鸿蒙的信息(说实话这里卡了我好久,网上没教程),包括包名和签名:
点击保存就好了,应用就算没审核通过,也是可以分享的。
编写分享代码
官方的 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初始化、文字带图的分享。