<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      小紅書分享踩坑和解決

      ?小紅書官方介入鏈接:小紅書分享開放平臺

      下載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 onError(
                              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
              }

       

      posted @ 2024-08-22 14:14  張旭小俠  閱讀(1440)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲夜夜欢一区二区三区| 亚洲成a人片在线观看中| 国产999久久高清免费观看| 欧美乱人伦人妻中文字幕| 亚洲欧洲日产国码久在线| 成人资源网亚洲精品在线| 污网站在线观看视频| 亚洲精品无码久久一线| 中文字幕无码免费不卡视频| 噜噜噜亚洲色成人网站∨| 亚洲成人精品综合在线| 在线精品另类自拍视频| 99精品热在线在线观看视| 国产suv精品一区二区| 曝光无码有码视频专区| 天天爽夜夜爱| 国产成人片无码视频在线观看| 国产成人av一区二区三区不卡| 久久热精品视频在线视频| 熟女人妻aⅴ一区二区三区电影| 国产三级精品三级在线观看| 国产盗摄xxxx视频xxxx| 131mm少妇做爰视频| 久久精产国品一二三产品| 亚洲一区二区三区在线观看精品中文| 99在线精品免费视频| 久久精品国产亚洲av久| 少妇人妻真实偷人精品| 四虎www永久在线精品| 亚洲欧洲av一区二区| 日韩av中文字幕有码| 影音先锋在线资源无码| 在线成人国产天堂精品av| 亚洲精品一区二区区别| 贞丰县| 国产成人一区二区三区视频免费| 成人做受视频试看60秒| 亚洲精品美女一区二区| 亚洲色最新高清AV网站| 丰满人妻AV无码一区二区三区| 最近中文字幕国产精选|