首页 > 其他分享 >小红书分享踩坑和解决

小红书分享踩坑和解决

时间:2024-08-22 14:15:48浏览次数:2  
标签:String val filePath 小红书 URI 解决 分享

​小红书官方介入链接:小红书分享开放平台

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

 

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

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

例如我的代码如下:

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

    <external-path
        name="external"
        path="."
        />  <!--  Environment.getExternalStorageDirectory()-->
    <external-cache-path
        name="external-cache"
        path="."
        /> <!--  Context.getExternalCacheDir() -->
    <external-files-path
        name="external-files"
        path="."
        /> <!--  Context.getExternalFilesDir() -->
    <external-files-path
        name="opensdk_external"
        path="Images"
        />
    <root-path
        name="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 one rror(
                        errorCode: Int,
                        errorMessage: String,
                        @Nullable exception: Exception?
                    ) {
                        log { "xhs---onError: 注册失败!errorCode: $errorCode errorMessage: $errorMessage exception: $exception" }
                    }
                })

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

XhsNote().apply {
    title = getTitleString()    // 正文,String
    content = getContentString()    // 标题,String
    imageInfo = 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")
            //获取赋予权限的URI
            val 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()
                //获取首帧的图片URI
                val picUri = getContentUriForFileProvider(
                    filePath = tempFile.absolutePath,
                    packages = xhsPackageNames
                )
                val xhsNote= XhsNote().apply {
                    this.title = title
                    this.content = content
                    videoInfo = 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? = null
            try {
                retriever.setDataSource(path)
                val duration = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION)
                    ?.toLongOrNull() ?: 0
                val timePositionUs = (duration / 100f * percent).toLong() * 1000
                bitmap = retriever.getFrameAtTime(
                    timePositionUs, MediaMetadataRetriever.OPTION_CLOSEST
                )
            } catch (e: Exception) {
                log(type = LogType.E, errorThrowable = e)
                e.printStackTrace()
            } finally {
                retriever.release()
            }
            return bitmap
        }

 

标签:String,val,filePath,小红书,URI,解决,分享
From: https://www.cnblogs.com/zxxiaoxia/p/18373731

相关文章

  • 最新小红书矩阵批量起号玩全自动图文法,无脑操作轻松引流创业粉
    项目介绍:很多人对于引流觉得很难每天都在网上找各种各样的教程那么今天流量终结者来了小红书图文矩阵批量制作软件加小红书号商+流量回收渠道全都给你带来了这套玩法是我们一直以来自己使用的玩法相对其他引流方法这个是上量最快的也是玩法最简单的,这个软件可以给......
  • 如何使用排除法解决模板上的问题
    1.使用Firebug进行排查1.1简要介绍与安装方法Firebug是Firefox的一款插件,提供了一整套web开发所必需的工具。从HTML的编写,到CSS样式表的美化调优,以及…所以我们首先要安装Firefox浏览器。安装好浏览器后,选择菜单栏上的“工具”菜单,点击“附加组件”==>“获取附加组件”在输......
  • Python之列表解决实际问题案例(字谜、文件分析)
    字谜文件分析1.《葛底斯堡演说》的长度2、有多少个不同的单词字谜字谜通过重新安排单词里的字母,来组成新的单词或词组。例如,将cinema转换成另一个英语单词iceman。在这个例子中,将设计一个程序,检查两个词是否构成字谜。如何做到这一点?做法是找出两个字谜单词所共享......
  • 从海量信息中脱颖而出:Workflow智能分析解决方案,大语言模型为AI科技文章打造精准摘要评
    从海量信息中脱颖而出:Workflow智能分析解决方案,大语言模型为AI科技文章打造精准摘要评分体系(总篇章)1.简介该项目整合了编程、AI、产品设计、商业科技及个人成长等多领域的精华内容,源自顶尖技术企业和社群。借助先进语言模型技术,对精选文章进行高效摘要、专业评分及多语种翻译,......
  • java创建链表异常解决
    问题解决问题解释该错误表明,在试图创建非静态类实例时,没有正确引用外部类的实例。源代码如下packagevjudge;importjava.util.Scanner;publicclasstest{//节点类publicclassNode{intdata;Nodenext;Node(intdata){......
  • [工具推荐]Hessian反序列化漏洞利用工具分享
    如果觉得该文章有帮助的,麻烦师傅们可以搜索下微信公众号:良月安全。点个关注,感谢师傅们的支持。免责声明本号所发布的所有内容,包括但不限于信息、工具、项目以及文章,均旨在提供学习与研究之用。所有工具安全性自测。如因此产生的一切不良后果与文章作者和本公众号无关。如有涉......
  • setupres.dll丢失解决方案速递:全面修复流程,从简易排查至高级修复策略
    遇到setupres.dll文件丢失问题,可以按照以下步骤尝试修复:1.系统文件扫描:首先,利用系统自带的文件检查工具来修复潜在的系统文件问题。打开命令提示符(以管理员身份运行),输入sfc/scannow并回车,等待扫描并修复完成。2.Windows更新:确保操作系统是最新版本,因为有时这类问题可通......
  • msxml*.dll 错误 ‘80072f7d‘ 安全频道支持出错 解决方案
    诡异的msxml6.dll错误'80072f7d'安全频道支持出错,用SSLTools.exe修复的方法无效!!!’---------------------------------------------------------------有如下简要ASP代码,用于获取网页链接返回内容:'-----ASP获取链接内容FunctionGetBody(url) dimObjXML SetObjX......
  • 启动应用程序出现pspluginwkr.dll找不到问题解决
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个pspluginwkr.dll文件(挑选合适的版本文件)把......
  • 启动应用程序出现ptpprov.dll找不到问题解决
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个ptpprov.dll文件(挑选合适的版本文件)把它放......