小红书分享踩坑和解决

news/2024/9/20 3:27:01/文章来源:https://www.cnblogs.com/zxxiaoxia/p/18373731
小红书官方介入链接:小红书分享开放平台

下载sdk文件,位置如下图所示

 

之后可以按照官方文档进行开发,接入也较简单,这里主要是说明一些隐藏的坑点

一、分享应用内的文件到小红书(这里主要是指应用包名下的文件内容),需要注意setFileProviderAuthority()这个方法。

例如我的代码如下:

AndroidManifest文件
<providerandroid:name="androidx.core.content.FileProvider"android:authorities="${applicationId}.FileProvider"android:exported="false"android:grantUriPermissions="true"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/provider_paths"/></provider>
res目录下的xml配置文件
<?xml version="1.0" encoding="utf-8"?>
<paths><cache-pathname="cache"path="."/> <!--Context.getCacheDir() --><files-pathname="files"path="."/> <!--Context.getFilesDir() --><external-pathname="external"path="."/>  <!--  Environment.getExternalStorageDirectory()--><external-cache-pathname="external-cache"path="."/> <!--  Context.getExternalCacheDir() --><external-files-pathname="external-files"path="."/> <!--  Context.getExternalFilesDir() --><external-files-pathname="opensdk_external"path="Images"/><root-pathname="opensdk_root"path=""/>
</paths>

像我的项目配置的话,需要设置的代码如下

XhsShareSdk.registerApp(context, XHS_APP_KEY,XhsShareGlobalConfig().setEnableLog(true).setClearCacheWhenShareComplete(true)
//重点是下面的这句话,设置为自己应用的 Authority
.setFileProviderAuthority("${context.packageName}.FileProvider"),object : XhsShareRegisterCallback {override fun onSuccess() {log { "xhs---onSuccess: 注册成功!" }}override fun onError(errorCode: Int,errorMessage: String,@Nullable exception: Exception?) {log { "xhs---onError: 注册失败!errorCode: $errorCode errorMessage: $errorMessage exception: $exception" }}})

二、小红书构造方法的坑:

XhsNote().apply {title = getTitleString()    // 正文,Stringcontent = getContentString()    // 标题,StringimageInfo = XhsImageInfo(listOf(XhsImageResourceBean.fromUrl("网络图片 url"), XhsImageResourceBean.fromUrl("网络图片 url")))            
}

小红书的示例代码和说明,都说的很简单,可以直接使用fromUrl这个方法进行构造,他会自动识别是网络图片还是本地图片。不需要手动处理了。

但是,之后,你就会发现,分享网络资源没有问题,但是如果分享的内容是自己应用内部的文件,就无论如何,都分享不成功,到了小红书APP,就提示未获取到图片或者视频。

请看SDK代码

 

小红书SDK里面判断了是否是网络地址,然后通过File的构造方法,调用了顶部的Uri.fromFile(filePath),这个方法是存在问题的。

安卓7.0强制启用了striceMode策略,无法直接暴露file://类型的URI了。如果使用的公共目录分享文件,还是可以成功的,但是如果分享的是应用内部的文件,就会出现没有访问权限的问题。所以小红书APP,就会一直报为获取资源的问题。

解决办法:

使用XhsImageResourceBean(Uri)方式去构造视频和图片的对象。示例代码如下:

fun shareXHS(activity: Activity = requireNotNull(SnsHelper.mainActivity),filePath: String//传递过来文件地址
        ) {val xhsPackageNames = arrayOf("com.xingin.xhs")//获取赋予权限的URIval uri = getContentUriForFileProvider(filePath = filePath,packages = xhsPackageNames)log { "xhs--- FilePath=$filePath \n,uri:$uri,  " }val title="标题内容"val content="内容文字"try {//获取视频的首帧作为封面图val bitmap= getThumbnailFromVideo(filePath)val tempFile = File("${activity.cacheDir.absolutePath}/cameraShooting", "tempFileForShare.png")val stream = FileOutputStream(tempFile)bitmap?.compress(Bitmap.CompressFormat.PNG, 100, stream)stream.close()//获取首帧的图片URIval picUri = getContentUriForFileProvider(filePath = tempFile.absolutePath,packages = xhsPackageNames)val xhsNote= XhsNote().apply {this.title = titlethis.content = contentvideoInfo = XhsVideoInfo(//通过URI的方式,构建数据
                        XhsVideoResourceBean(uri),XhsImageResourceBean(picUri))    // 封面
                }//分享数据val sessionId = XhsShareSdk.shareNote(activity, xhsNote)}catch (e:Exception){ }}fun getContentUriForFileProvider(filePath: String,packages: Array<String> = emptyArray(),context: Context = CoreApp.getContext(),): Uri {//根据文件路径,生成关联的 content:// 内容 URI val file = File(filePath)val contentUri = FileProvider.getUriForFile(context,"${context.packageName}.FileProvider",file)//赋予权限
            packages.forEach {context.grantUriPermission(it,contentUri, Intent.FLAG_GRANT_READ_URI_PERMISSION)}return contentUri}fun getThumbnailFromVideo(path: String, percent: Int = 0): Bitmap? {val retriever = MediaMetadataRetriever()var bitmap: Bitmap? = nulltry {retriever.setDataSource(path)val duration = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION)?.toLongOrNull() ?: 0val timePositionUs = (duration / 100f * percent).toLong() * 1000bitmap = retriever.getFrameAtTime(timePositionUs, MediaMetadataRetriever.OPTION_CLOSEST)} catch (e: Exception) {log(type = LogType.E, errorThrowable = e)e.printStackTrace()} finally {retriever.release()}return bitmap}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/785393.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用GDI+旋转多边形来绘制一个时钟摸拟小程序

效果图 在头文件类中声明变量TCHAR m_dayStr[4];    // 日期TCHAR m_weekStr[4];  // 星期Gdiplus::Font* m_pFont;  // 字体Gdiplus::StringFormat m_strFormat;  // 格式化字符串Gdiplus::Pen* m_pPen;      // 画笔Gdiplus::SolidBrush* m_pBrush;  // 画…

CREO装配约束

creo装配约束第一个是从添加进去的时候, 当直接从装配体中重新约束元件,需要点击左侧层树,右键点击编辑定义编辑定义右侧的链条符号也可以查看约束了那些内容

【流量特征+webshell】 菜刀 一句话流量分析

连接webshell 准备一句话 <?php eval($_POST[caidao]);?>打开菜刀连接webshell使用wireshark查询流量 特征分析 特征一:POST方法,一句话路径 首先,过滤http流量,可以看到有访问webshell后门的路径特征二:UA头均为百度爬虫标识User-Agent: Mozilla/5.0 (compatible…

Linux 中 sed G选项在行后添加空行

001、[root@localhost test]# ls a.txt [root@localhost test]# cat a.txt ## 测试数据 dfghghj hgfdwe [root@localhost test]# sed G a.txt ## G添加空行 dfghghjhgfdwe[root@localhost test]# sed G;G a.txt dfghghjhgfdwe[root@localhost test]# sed G;G;G…

【溯源系列】使用Wireshark分析日志文件:发现有人对网站进行了SQL注入,分析日志找到该IP地址

工具 Wireshark某公司安全工程师在维护网站时发现有人对网站进行了SQL注入,分析日志找到该IP地址。 要点 SQL.log文件主要显示具体的sql语句】access.log文件主要是记录web页面操作数据库的请求解题很简单,直接打开access.log文件,一步到位,检索sql注入的常见关键词select、…

【OS系列】程序是怎么一步步变成机器指令的?

程序是怎么一步步变成机器指令的? 2024年08月22日 12:03 四川 以下文章来源于码农的荒岛求生 ,作者码农的荒岛求生 大家好,今天简单聊聊程序是怎么一步步变成机器指令的。 左边是我们写的代码,右边是CPU执行的机器指令:想让CPU执行代码只需要简单的点击一下这个按钮:可是…

小米电视主页导航栏修改啦

小米电视导航栏可以修改啦,终于不再杂乱无章了。 步骤一:点击我的,拉到最下方,导航管理步骤二:进入导航管理后,按遥控器OK键,就可以移动了。OK 键 按遥控器菜单键,就可以删除或者添加了。菜单键 就是这么简单,赶紧去试试吧版权申明本文由:二萌生活发布,如需转载请注…

安装MySQL报错ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost:3306‘ (10061)

今天要在本地装个mysql,发现mysql-5.7.19-winx64版总是报错由于找不到MSVCP120.dll,无法继续执行代码。重新安装程序可能会解决此问题。,去微软官网找到了最新的Visual C++ Redistributable for Visual Studio,下载后发现还是不停地报错。怀疑是系统不兼容,没办法只好安装m…

Centos scp 免密传输文件

mkdir -p ~/.ssh 1、在 A 服务器上,进入.ssh 目录; [root@iZam205rbu8s7yra2fop0nZ ~]# cd ~/.ssh/2、在 A 服务器上面的.ssh 目录下生成密钥; [root@iZam205rbu8s7yra2fop0nZ .ssh]# ssh-keygen -t rsa 生成两个密钥,一个是私钥,一个是公钥;3、在 B 服务器上创建.ssh 文…

mysql57小版本升级操作指南

1. 关停 注意要使用 慢速关闭mysql,这样InnoDB在关闭之前执行完整的清除和更改缓冲区合并。 登录到mysql中 执行 mysql> SET GLOBAL innodb_fast_shutdown=0; mysql> shutdown;2. 备份 注:备份数据目录和应用程序,注意mysql的属主属组 数据目录查找方式: MySQL 的数据…

MySQL 亿级数据平滑迁移实战

本文介绍了一次 MySQL 数据迁移的流程,通过方案选型、业务改造、双写迁移最终实现了亿级数据的迁移。作者:来自 vivo 互联网服务器团队- Li Gang本文介绍了一次 MySQL 数据迁移的流程,通过方案选型、业务改造、双写迁移最终实现了亿级数据的迁移。 一、背景 预约业务是 vivo…

星尘智能发布AI机器人助理Astribot S1

原文链接:https://mp.weixin.qq.com/s/P26zhHzmuqe0M2TDTLRlvg星尘智能很高兴正式发布 AI 机器人助理—— Astribot S1 我们精心打磨了 S1 背后的技术与产品细节, 希望它为你而生,为你而智(Naturally Yours)。星尘智能 S1 产品视频请看:https://www.bilibili.com/video/B…