# Android

更新时间:2025-03-20 11:11:57

# 一、设计目标

开放平台sdk的设计目标是:第三方应用使用开放平台sdk能够方便、快速的调起快手主app的功能页面,从而将第三方内容发布到快手平台上或者使用快手APP提供的其他开放功能。

开放能力
账号授权 快手App授 权 快手极速版授权
社交功能 分享私信 分享私信到指定人 打开指定用户主页
生产功能 单图编辑 单图发布 单视频编辑 单视频裁剪 单视频发布 多视频图片裁剪 智能裁剪视频 多图编辑 发布时挂载小程序

# 二、项目地址库

准备工作
开发者需要在快手开放平台完成注册,新建一个网站应用,并获取应用标识appId 和 appSecret,详细参考申请注册流程,官网地址:https://open.kuaishou.com/platform (opens new window)

# 三、接入说明

# 1、接入aar

  • 版本要求 minsdkversion:19
  • SDK最新版本:3.7.6
 // maven 地址:https://mvnrepository.com/artifact/com.github.kwaisocial/kwai-opensdk-withauth  
dependencies {  
 // 版本号建议设置成最新的版本  
 implementation "com.github.kwaisocial:kwai-opensdk-withauth:3.7.6"  
}  
  • 混淆配置
-keep class com.kwai.opensdk.sdk.** {;}
-keep class com.kwai.auth.* {*;}
如果第三方应用需要混淆资源,请将下面文件加入白名单不要混淆防止找不到资源
/kwai-opensdk/src/main/res/layout/activity_loading.xml
/kwai-auth/src/main/res/layout/activity_kwai_login_h5.xml

# 2、快手授权使用说明

# (1)应用配置

接入方应用需要在build.gradle中配置如下信息(必须)

android {  
  defaultConfig {  
    applicationId "com.kwai.chat.demo" // 接入方的包名  
    manifestPlaceholders = [  
      "KWAI_APP_ID": "ks703687443040312600", // 申请分配的appId  
      // SDK版本号<=3.7.5 使用此配置,SDK版本号>3.7.5 需要删除该配置
      "KWAI_SCOPE" : "user_info" // 账号授权需要申请的scope权限,多个scope可以使用","分割。user_info:用户信息授权,user_phone:用户手机号授权。  
    ]  
  }  
}  

# (2)登录/授权并获取用户的openId

接入方app需要通过渠道获取分配给接入方应用的appId,当使用需要openId的功能时,请先获取必须的参数openId,当前只有分享私信到人的功能需要必须参数openId。

// 快手授权登录前需要预先初始化,若不使用授权登录功能可以忽略这里  
public class MyApplication extends Application {  
  @Override  
  public void onCreate() {  
    super.onCreate();  
    KwaiAuthAPI.init(this);  
  }  
}  
// 1、创建登录/授权的回调监听  
final ILoginListener loginListener = new ILoginListener() {   
  @Override  
  public void onSuccess(@NonNull InternalResponse response) {  
    // 根据授权返回的code请求openId(详细可以参考demo)。为了安全性,建议放在第三方的服务器中,由接入方服务器实现这个请求接口后将openid返回接入方的客户端。  
    openId = getOpenIdByNetwork(response.getCode());  
    Log.i("auth", "openId is " + openId );  
  }  
  
  @Override  
  public void onFailed(String state, int errCode, String errMsg) {  
    Log.i("auth", "openId is " + openId );  
  }  
  
  @Override  
  public void onCancel() {  
    Log.i("auth", "auth is cancel");  
  }  
};  
// 2、创建KwaiAuthRequest  
KwaiAuthRequest request = new KwaiAuthRequest.Builder()  
  // 第三方客户端来生产就可以,在授权成功后快手server回调给第三方server的时候会带上这个参数  
  .setState("state_str")  
  // SDK版本>= 3.7.5使用如下方式设置scope,无需在build.gradle中注册
  .setRequiredScopes("user_info")// 必选权限,授权页无法手动取消勾选
  .setOptional1Scopes("relation")// 可选权限,授权页可以取消勾选,默认勾选态
  .setOptional0Scopes("user_phone")//可选权限,授权页可以取消勾选,默非认勾选态
  .setState("state_str")  
  .setAuthMode(KwaiConstants.AuthMode.AUTHORIZE)  
  // KwaiConstants.LoginType.APP通过快手App登录授权,KwaiConstants.LoginType.H5通过H5页面登录授权  
  .setLoginType(KwaiConstants.LoginType.APP)  
  // 请求授权,支持两个平台KwaiConstants.Platform.KWAI_APP(快手App)、KwaiConstants.Platform.NEBULA_APP(快手极速版),默认通过快手App授权  
  .setPlatformArray(new String[]{KwaiConstants.Platform.KWAI_APP,KwaiConstants.Platform.NEBULA_APP})  
  .build();  
// 3、开始请求授权  
KwaiAuthAPI.getInstance().sendRequest(getActivity(), request, loginListener);  

# 3、分享视频、分享消息到快手

# 1、IKwaiOpenAPI配置

private IKwaiOpenAPI mKwaiOpenAPI; // 声明使用接口  
mKwaiOpenAPI = new KwaiOpenAPI(getContext()); // 初始化  
  
// 设置平台功能的配置选项  
OpenSdkConfig openSdkConfig = new OpenSdkConfig.Builder()  
  .setGoToMargetAppNotInstall(true) // 应用未安装,是否自动跳转应用市场  
  .setGoToMargetAppVersionNotSupport(true) // 应用已安装但版本不支持,是否自动跳转应用市场  
  .setSetNewTaskFlag(true) // 设置启动功能页面是否使用新的页面栈  
  .setSetClearTaskFlag(true) // 设置启动功能页面是否清除当前页面栈,当isSetNewTaskFlag为true时生效  
  .setShowDefaultLoading(false) // 是否显示默认的loading页面作为功能启动的过渡  
  .build();  
mKwaiOpenAPI.setOpenSdkConfig(openSdkConfig);  
  
// 设置回调结果监听  
mKwaiOpenAPI.addKwaiAPIEventListerer(new IKwaiAPIEventListener() {  
  @Override  
  public void onRespResult(@NonNull BaseResp resp) {  
    Log.i(TAG, "resp=" + resp);  
  }  
});  
  
// 移除对回调结果的监听  
mKwaiOpenAPI.removeKwaiAPIEventListerer();  

# 2、分享消息到快手

# 2.1、选择人或者群组分享私信

public void shareMessage() {  
  // base params  
  ShareMessage.Req req = new ShareMessage.Req();  
  req.sessionId = mKwaiOpenAPI.getOpenAPISessionId();  
  req.transaction = "sharemessage";  
  // 设置功能调起快手支持应用,KwaiPlatform.Platform.KWAI_APP(快手主站),KwaiPlatform.Platform.NEBULA_APP(快手极速版)  
  // 按数组顺序检查应用安装和版本情况,从中选择满足条件的第一个应用调起,若不设置则默认启动快手主站应用  
  req.setPlatformArray(new String[] {KwaiPlatform.Platform.KWAI_APP, KwaiPlatform.Platform.NEBULA_APP});  
  
  // business params  
  req.message = new KwaiMediaMessage();  
  req.message.mediaObject = new KwaiWebpageObject();  
  ((KwaiWebpageObject) req.message.mediaObject).webpageUrl =  
    "https://blog.csdn.net/a249900679/article/details/51386660";  
  req.message.title = "test";  
  req.message.description = "webpage test share, hahahah";  
  Bitmap b = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);  
  ByteArrayOutputStream baos = new ByteArrayOutputStream();  
  b.compress(Bitmap.CompressFormat.PNG, 100, baos);  
  req.message.thumbData = baos.toByteArray();  
  
  // send request  
  mKwaiOpenAPI.sendReq(req, getActivity());  
}  

# 2.2、分享私信到个人

// 通过TargetOpenId分享私信给个人,openId是必须参数  
public void shareMessageToBuddy() {  
  if (TextUtils.isEmpty(HistoryOpenIdActivity.sTargetOpenId)) {  
    Toast.makeText(getActivity(), "sTargetOpenId is null, 请先设置",  
                   Toast.LENGTH_SHORT).show();  
    return;  
  }  
  
  ShareMessageToBuddy.Req req = new ShareMessageToBuddy.Req();  
  req.openId = mOpenId;  
  req.sessionId = mKwaiOpenAPI.getOpenAPISessionId();  
  req.transaction = "sharemessageToBuddy";  
  // 设置功能调起快手支持应用,KwaiPlatform.Platform.KWAI_APP(快手主站),KwaiPlatform.Platform.NEBULA_APP(快手极速版)  
  // 按数组顺序检查应用安装和版本情况,从中选择满足条件的第一个应用调起,若不设置则默认启动快手App  
  req.setPlatformArray(new String[] {KwaiPlatform.Platform.NEBULA_APP, KwaiPlatform.Platform.KWAI_APP});  
  
  req.targetOpenId = HistoryOpenIdActivity.sTargetOpenId;  
  req.message = new KwaiMediaMessage();  
  req.message.mediaObject = new KwaiWebpageObject();  
  ((KwaiWebpageObject) req.message.mediaObject).webpageUrl =  
    "https://blog.csdn.net/a249900679/article/details/51386660";  
  req.message.title = "test";  
  req.message.description = "webpage test share, hahahah";  
  Bitmap b = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);  
  ByteArrayOutputStream baos = new ByteArrayOutputStream();  
  b.compress(Bitmap.CompressFormat.PNG, 100, baos);  
  req.message.thumbData = baos.toByteArray();  
  mKwaiOpenAPI.sendReq(req, getActivity());  
}  

# 2.3、打开快手用户的主页

// 打开TargetOpenId指向的个人主页  
public void showProfile() {  
  ShowProfile.Req req = new ShowProfile.Req();  
  req.sessionId = mKwaiOpenAPI.getOpenAPISessionId();  
  req.transaction = "showProfile";  
  // 设置功能调起快手支持应用,KwaiPlatform.Platform.KWAI_APP(快手主站),KwaiPlatform.Platform.NEBULA_APP(快手极速版)  
  // 按数组顺序检查应用安装和版本情况,从中选择满足条件的第一个应用调起,若不设置则默认启动快手App  
  req.setPlatformArray(new String[] {KwaiPlatform.Platform.KWAI_APP,KwaiPlatform.Platform.NEBULA_APP});  
  
  req.targetOpenId = HistoryOpenIdActivity.sTargetOpenId;  
  
  mKwaiOpenAPI.sendReq(req, getActivity());  
}  

# 3、分享图片、视频到快手

提示:

  • 设置封面时需要封面图与视频大小保持一致
  • req.mediaInfo中的传入的分享文件mMultiMediaAssets支持传递fileAbsolutePath、fileUri和contentUri三种方式(建议优先使用fileAbsolutePath);
  • 若使用Uri传递分享文件需要保证快手app的版本支持,请使用接口isAppSupportUri(Context context, BaseReq req)来判断快手版本是否支持Uri做为参数;
  • 若分享文件在三方应用私有目录内请保证授权快手访问该文件的权限;
  • 若使用fileUri和contentUri作为参数传递,SDK版本要求至少升级到3.0.3及以上

# 3.1、发布单张图片

public void publishPicture(ShareParam param) {  
  SinglePicturePublish.Req req = new SinglePicturePublish.Req();  
  req.sessionId = mKwaiOpenAPI.getOpenAPISessionId();  
  req.transaction = "SinglePicturePublish";  
  // 设置功能调起快手支持应用,KwaiPlatform.Platform.KWAI_APP(快手主站),KwaiPlatform.Platform.NEBULA_APP(快手极速版)  
  // 按数组顺序检查应用安装和版本情况,从中选择满足条件的第一个应用调起,若不设置则默认启动快手App  
  req.setPlatformArray(new String[] {KwaiPlatform.Platform.KWAI_APP,KwaiPlatform.Platform.NEBULA_APP});  
  req.mediaInfo = new PostShareMediaInfo();  
  ArrayList<String> imageFiles = new ArrayList<>();  
  String filePath = param.albumFile.getAbsolutePath();  
  if (param.isUserPrivateFile && param.privateFile != null && param.privateFile.exists()) {  
    // 获取私有文件目录下的分享文件uri  
    String fileUriPath = FileProviderUtil.generateFileUriPath(getActivity(), param.privateFile, req,  
                                                              mKwaiOpenAPI);  
    if (!TextUtils.isEmpty(fileUriPath)) {  
      filePath = fileUriPath;  
    }  
  }  
  imageFiles.add(filePath);  
  req.mediaInfo.mMultiMediaAssets = imageFiles;  
  if (!TextUtils.isEmpty(mTagList.getText().toString())) {  
    req.mediaInfo.mTag = mTagList.getText().toString();  
  }  
  if (!TextUtils.isEmpty(mThirdExtraEdit.getText().toString())) {  
    req.thirdExtraInfo = mThirdExtraEdit.getText().toString();  
  }  
  Map<String, Object> mediaInfoMap = getMediaMap();  
  if (mediaInfoMap != null && !mediaInfoMap.isEmpty()) {  
    req.mediaInfo.mMediaInfoMap =  mediaInfoMap;  
  }  
  
    // 发布时挂载小程序PLC,该能力需要申请权限,要求快手和极速版版本不低于11.3.20  
  String plcMpAppId = mPostPlcMpAppId.getText().toString();  
  String plcTitle = mPostPlcMpTitle.getText().toString();  
  String plcMpPath = mPostPlcMpPath.getText().toString();  
  if (!TextUtils.isEmpty(plcMpAppId) && !TextUtils.isEmpty(plcTitle) && !TextUtils.isEmpty(plcMpPath)) {  
    req.mPlcBindInfo = new MiniProgramPlcBindInfo(plcTitle, plcMpAppId, plcMpPath);  
  }  
  
  mKwaiOpenAPI.sendReq(req, getActivity());  
}  

# 3.2、分享图片到编辑页

public void editPicture(ShareParam param) {  
  SinglePictureEdit.Req req = new SinglePictureEdit.Req();  
  req.sessionId = mKwaiOpenAPI.getOpenAPISessionId();  
  req.transaction = "SinglePictureEdit";  
  // 设置功能调起快手支持应用,KwaiPlatform.Platform.KWAI_APP(快手主站),KwaiPlatform.Platform.NEBULA_APP(快手极速版)  
  // 按数组顺序检查应用安装和版本情况,从中选择满足条件的第一个应用调起,若不设置则默认启动快手App  
  req.setPlatformArray(new String[] {KwaiPlatform.Platform.KWAI_APP,KwaiPlatform.Platform.NEBULA_APP});  
  req.mediaInfo = new PostShareMediaInfo();  
  ArrayList<String> imageFiles = new ArrayList<>();  
  String filePath = param.albumFile.getAbsolutePath();  
  if (param.isUserPrivateFile && param.privateFile != null && param.privateFile.exists()) {  
    // 获取私有文件目录下的分享文件uri  
    String fileUriPath = FileProviderUtil.generateFileUriPath(getActivity(), param.privateFile, req,  
                                                              mKwaiOpenAPI);  
    if (!TextUtils.isEmpty(fileUriPath)) {  
      filePath = fileUriPath;  
    }  
  }  
  imageFiles.add(filePath);  
  req.mediaInfo.mMultiMediaAssets = imageFiles;  
  if (!TextUtils.isEmpty(mTagList.getText().toString())) {  
    req.mediaInfo.mTag = mTagList.getText().toString();  
  }  
  req.mediaInfo.mDisableFallback = mDisableFallBack.isChecked();  
  
  // 发布时挂载小程序PLC,该能力需要申请权限,要求快手和极速版版本不低于11.3.20  
  String plcMpAppId = mPostPlcMpAppId.getText().toString();  
  String plcTitle = mPostPlcMpTitle.getText().toString();  
  String plcMpPath = mPostPlcMpPath.getText().toString();  
  if (!TextUtils.isEmpty(plcMpAppId) && !TextUtils.isEmpty(plcTitle) && !TextUtils.isEmpty(plcMpPath)) {  
    req.mPlcBindInfo = new MiniProgramPlcBindInfo(plcTitle, plcMpAppId, plcMpPath);  
  }  
  
  mKwaiOpenAPI.sendReq(req, getActivity());  
}  

# 3.3、发布单个视频

注意: 此能力需要申请权限,申请方式请前往开发者社区 (opens new window)咨询

// 发布单个视频  
public void publishSingleVideo(ShareParam param) {  
  SingleVideoPublish.Req req = new SingleVideoPublish.Req();  
  req.sessionId = mKwaiOpenAPI.getOpenAPISessionId();  
  req.transaction = "SingleVideoPublish";  
  // 设置功能调起快手支持应用,KwaiPlatform.Platform.KWAI_APP(快手主站),KwaiPlatform.Platform.NEBULA_APP(快手极速版)  
  // 按数组顺序检查应用安装和版本情况,从中选择满足条件的第一个应用调起,若不设置则默认启动快手主站应用  
  req.setPlatformArray(platformList.toArray(new String[platformList.size()]));  
  req.mediaInfo = new PostShareMediaInfo();  
  ArrayList<String> videoFiles = new ArrayList<>();  
  String filePath = param.albumFile.getAbsolutePath();  
  if (param.isUserPrivateFile && param.privateFile != null && param.privateFile.exists()) {  
    // 获取私有文件目录下的分享文件uri  
    String fileUriPath = FileProviderUtil.generateFileUriPath(getActivity(), param.privateFile, req,  
                                                              mKwaiOpenAPI);  
    if (!TextUtils.isEmpty(fileUriPath)) {  
      filePath = fileUriPath;  
    }  
  }  
  videoFiles.add(filePath);  
  req.mediaInfo.mMultiMediaAssets = videoFiles;  
  printShareFilePath(req.mediaInfo.mMultiMediaAssets);  
  if (!TextUtils.isEmpty(mSingleVideocoverPath.getText())) {  
    req.mCover = mSingleVideocoverPath.getText().toString();  
  }  
  if (!TextUtils.isEmpty(mTagList.getText().toString())) {  
    req.mediaInfo.mTag = mTagList.getText().toString();  
  }  
  req.mediaInfo.mDisableFallback = mDisableFallBack.isChecked();  
  if (!TextUtils.isEmpty(mExtraInfoEdit.getText().toString())) {  
    req.mediaInfo.mExtraInfo = mExtraInfoEdit.getText().toString();  
  }  
  if (!TextUtils.isEmpty(mThirdExtraEdit.getText().toString())) {  
    req.thirdExtraInfo = mThirdExtraEdit.getText().toString();  
  }  
  Map<String, Object> mediaInfoMap = getMediaMap();  
  if (mediaInfoMap != null && !mediaInfoMap.isEmpty()) {  
    req.mediaInfo.mMediaInfoMap =  mediaInfoMap;  
  }  
  
  // 发布时挂载小程序PLC,该能力需要申请权限,要求快手和极速版版本不低于11.3.20  
  String plcMpAppId = mPostPlcMpAppId.getText().toString();  
  String plcTitle = mPostPlcMpTitle.getText().toString();  
  String plcMpPath = mPostPlcMpPath.getText().toString();  
  if (!TextUtils.isEmpty(plcMpAppId) && !TextUtils.isEmpty(plcTitle) && !TextUtils.isEmpty(plcMpPath)) {  
    req.mPlcBindInfo = new MiniProgramPlcBindInfo(plcTitle, plcMpAppId, plcMpPath);  
  }  
  
  mKwaiOpenAPI.sendReq(req, getActivity());  
}  

# 3.4、分享单个视频到编辑页

public void editSingleVideo(ShareParam param) {  
  SingleVideoEdit.Req req = new SingleVideoEdit.Req();  
  req.sessionId = mKwaiOpenAPI.getOpenAPISessionId();  
  req.transaction = "SingleVideoEdit";  
  // 设置功能调起快手支持应用,KwaiPlatform.Platform.KWAI_APP(快手主站),KwaiPlatform.Platform.NEBULA_APP(快手极速版)  
  // 按数组顺序检查应用安装和版本情况,从中选择满足条件的第一个应用调起,若不设置则默认启动快手主站应用  
  req.setPlatformArray(platformList.toArray(new String[platformList.size()]));  
  req.mediaInfo = new PostShareMediaInfo();  
  ArrayList<String> videoFiles = new ArrayList<>();  
  String filePath = param.albumFile.getAbsolutePath();  
  if (param.isUserPrivateFile && param.privateFile != null && param.privateFile.exists()) {  
    // 获取私有文件目录下的分享文件uri  
    String fileUriPath = FileProviderUtil.generateFileUriPath(getActivity(), param.privateFile, req,  
                                                              mKwaiOpenAPI);  
    if (!TextUtils.isEmpty(fileUriPath)) {  
      filePath = fileUriPath;  
    }  
  }  
  videoFiles.add(filePath);  
  req.mediaInfo.mMultiMediaAssets = videoFiles;  
  printShareFilePath(req.mediaInfo.mMultiMediaAssets);  
  if (!TextUtils.isEmpty(mTagList.getText().toString())) {  
    req.mediaInfo.mTag = mTagList.getText().toString();  
  }  
  req.mediaInfo.mDisableFallback = mDisableFallBack.isChecked();  
  if (!TextUtils.isEmpty(mExtraInfoEdit.getText().toString())) {  
    req.mediaInfo.mExtraInfo = mExtraInfoEdit.getText().toString();  
  }  
  if (!TextUtils.isEmpty(mThirdExtraEdit.getText().toString())) {  
    req.thirdExtraInfo = mThirdExtraEdit.getText().toString();  
  }  
  Map<String, Object> mediaInfoMap = getMediaMap();  
  if (mediaInfoMap != null && !mediaInfoMap.isEmpty()) {  
    req.mediaInfo.mMediaInfoMap =  mediaInfoMap;  
  }  
  
  // 发布时挂载小程序PLC,该能力需要申请权限,要求快手和极速版版本不低于11.3.20  
  String plcMpAppId = mPostPlcMpAppId.getText().toString();  
  String plcTitle = mPostPlcMpTitle.getText().toString();  
  String plcMpPath = mPostPlcMpPath.getText().toString();  
  if (!TextUtils.isEmpty(plcMpAppId) && !TextUtils.isEmpty(plcTitle) && !TextUtils.isEmpty(plcMpPath)) {  
    req.mPlcBindInfo = new MiniProgramPlcBindInfo(plcTitle, plcMpAppId, plcMpPath);  
  }  
  
  mKwaiOpenAPI.sendReq(req, getActivity());  
}  
  

# 3.5、裁剪单个视频

public void clipSingleVideo(ShareParam param) {  
  SingleVideoClip.Req req = new SingleVideoClip.Req();  
  req.sessionId = mKwaiOpenAPI.getOpenAPISessionId();  
  req.transaction = "SingleVideoClip";  
  // 设置功能调起快手支持应用,KwaiPlatform.Platform.KWAI_APP(快手主站),KwaiPlatform.Platform.NEBULA_APP(快手极速版)  
  // 按数组顺序检查应用安装和版本情况,从中选择满足条件的第一个应用调起,若不设置则默认启动快手主站应用  
  req.setPlatformArray(platformList.toArray(new String[platformList.size()]));  
  req.mediaInfo = new PostShareMediaInfo();  
  ArrayList<String> videoFiles = new ArrayList<>();  
  String filePath = param.albumFile.getAbsolutePath();  
  if (param.isUserPrivateFile && param.privateFile != null && param.privateFile.exists()) {  
    // 获取私有文件目录下的分享文件uri  
    String fileUriPath = FileProviderUtil.generateFileUriPath(getActivity(), param.privateFile, req,  
                                                              mKwaiOpenAPI);  
    if (!TextUtils.isEmpty(fileUriPath)) {  
      filePath = fileUriPath;  
    }  
  }  
  videoFiles.add(filePath);  
  req.mediaInfo.mMultiMediaAssets = videoFiles;  
  printShareFilePath(req.mediaInfo.mMultiMediaAssets);  
  if (!TextUtils.isEmpty(mTagList.getText().toString())) {  
    req.mediaInfo.mTag = mTagList.getText().toString();  
  }  
  req.mediaInfo.mDisableFallback = mDisableFallBack.isChecked();  
  if (!TextUtils.isEmpty(mExtraInfoEdit.getText().toString())) {  
    req.mediaInfo.mExtraInfo = mExtraInfoEdit.getText().toString();  
  }  
  if (!TextUtils.isEmpty(mThirdExtraEdit.getText().toString())) {  
    req.thirdExtraInfo = mThirdExtraEdit.getText().toString();  
  }  
  Map<String, Object> mediaInfoMap = getMediaMap();  
  if (mediaInfoMap != null && !mediaInfoMap.isEmpty()) {  
    req.mediaInfo.mMediaInfoMap =  mediaInfoMap;  
  }  
  
  // 发布时挂载小程序PLC,该能力需要申请权限,要求快手和极速版版本不低于11.3.20  
  String plcMpAppId = mPostPlcMpAppId.getText().toString();  
  String plcTitle = mPostPlcMpTitle.getText().toString();  
  String plcMpPath = mPostPlcMpPath.getText().toString();  
  if (!TextUtils.isEmpty(plcMpAppId) && !TextUtils.isEmpty(plcTitle) && !TextUtils.isEmpty(plcMpPath)) {  
    req.mPlcBindInfo = new MiniProgramPlcBindInfo(plcTitle, plcMpAppId, plcMpPath);  
  }  
  
  mKwaiOpenAPI.sendReq(req, getActivity());  
}  

# 3.6、多图和视频裁剪

public void clipMultiMedia(ArrayList<String> multiMedia) {  
  MultiMediaClip.Req req = new MultiMediaClip.Req();  
  req.sessionId = mKwaiOpenAPI.getOpenAPISessionId();  
  req.transaction = "MultiMediaClip";  
  // 设置功能调起快手支持应用,KwaiPlatform.Platform.KWAI_APP(快手主站),KwaiPlatform.Platform.NEBULA_APP(快手极速版)  
  // 按数组顺序检查应用安装和版本情况,从中选择满足条件的第一个应用调起,若不设置则默认启动快手主站应用  
  req.setPlatformArray(new String[] {KwaiPlatform.Platform.NEBULA_APP});  
  req.mediaInfo.mMultiMediaAssets = multiMedia;  
  if (!TextUtils.isEmpty(mTagList.getText().toString())) {  
    req.mediaInfo.mTag = mTagList.getText().toString();  
  }  
  req.mediaInfo.mDisableFallback = mDisableFallBack.isChecked();  
  if (!TextUtils.isEmpty(mExtraEdit.getText().toString())) {  
    req.mediaInfo.mExtraInfo = mExtraEdit.getText().toString();  
  }  
  
  // 发布时挂载小程序PLC,该能力需要申请权限,要求快手和极速版版本不低于11.3.20  
  String plcMpAppId = mPostPlcMpAppId.getText().toString();  
  String plcTitle = mPostPlcMpTitle.getText().toString();  
  String plcMpPath = mPostPlcMpPath.getText().toString();  
  if (!TextUtils.isEmpty(plcMpAppId) && !TextUtils.isEmpty(plcTitle) && !TextUtils.isEmpty(plcMpPath)) {  
    req.mPlcBindInfo = new MiniProgramPlcBindInfo(plcTitle, plcMpAppId, plcMpPath);  
  }  
  
  mKwaiOpenAPI.sendReq(req, getActivity());  
}  
  

# 3.7、快手智能剪辑

public void aiCutMedias(ArrayList<String> multiMedia) {  
  AICutMedias.Req req = new AICutMedias.Req();  
  req.sessionId = mKwaiOpenAPI.getOpenAPISessionId();  
  req.transaction = "AICutMedias";  
  // 设置功能调起快手支持应用,KwaiPlatform.Platform.KWAI_APP(快手主站),KwaiPlatform.Platform.NEBULA_APP(快手极速版)  
  // 按数组顺序检查应用安装和版本情况,从中选择满足条件的第一个应用调起,若不设置则默认启动快手主站应用  
  req.setPlatformArray(new String[] {KwaiPlatform.Platform.KWAI_APP});  
  req.mediaInfo = new PostShareMediaInfo();  
  req.mediaInfo.mMultiMediaAssets = multiMedia;  
  if (!TextUtils.isEmpty(mTagList.getText().toString())) {  
    req.mediaInfo.mTag = mTagList.getText().toString();  
  }  
  req.mediaInfo.mDisableFallback = mDisableFallBack.isChecked();  
  if (!TextUtils.isEmpty(mExtraEdit.getText().toString())) {  
    req.mediaInfo.mExtraInfo = mExtraEdit.getText().toString();  
  }  
  mKwaiOpenAPI.sendReq(req, getActivity());  
}  

# 3.8、多图编辑

// SDK版本不低于3.0.4,快手App和快手极速版App不低于9.7.20  
public void editMultiPicture(ArrayList<String> multiPicture) {  
  MultiPictureEdit.Req req = new MultiPictureEdit.Req();  
  req.sessionId = mKwaiOpenAPI.getOpenAPISessionId();  
  req.transaction = "MultiPictureEdit";  
  req.setPlatformArray(platformList.toArray(new String[platformList.size()]));  
  req.mediaInfo = new PostShareMediaInfo();  
  req.mediaInfo.mMultiMediaAssets = multiPicture;  
  printShareFilePath(req.mediaInfo.mMultiMediaAssets);  
  if (!TextUtils.isEmpty(mTagList.getText().toString())) {  
    req.mediaInfo.mTag = mTagList.getText().toString();  
  }  
  req.mediaInfo.mDisableFallback = mDisableFallBack.isChecked();  
  if (!TextUtils.isEmpty(mExtraInfoEdit.getText().toString())) {  
    req.mediaInfo.mExtraInfo = mExtraInfoEdit.getText().toString();  
  }  
  if (!TextUtils.isEmpty(mThirdExtraEdit.getText().toString())) {  
    req.thirdExtraInfo = mThirdExtraEdit.getText().toString();  
  }  
  Map<String, Object> mediaInfoMap = getMediaMap();  
  if (mediaInfoMap != null && !mediaInfoMap.isEmpty()) {  
    req.mediaInfo.mMediaInfoMap =  mediaInfoMap;  
  }  
  
  // 发布时挂载小程序PLC,该能力需要申请权限,要求快手和极速版版本不低于11.3.20  
  String plcMpAppId = mPostPlcMpAppId.getText().toString();  
  String plcTitle = mPostPlcMpTitle.getText().toString();  
  String plcMpPath = mPostPlcMpPath.getText().toString();  
  if (!TextUtils.isEmpty(plcMpAppId) && !TextUtils.isEmpty(plcTitle) && !TextUtils.isEmpty(plcMpPath)) {  
    req.mPlcBindInfo = new MiniProgramPlcBindInfo(plcTitle, plcMpAppId, plcMpPath);  
  }  
  
  // 检查快手版本是否支持多图编辑  
  if (mKwaiOpenAPI.isAppSupportEditMultiPicture(getContext(), req)) {  
    mKwaiOpenAPI.sendReq(req, getActivity());  
  } else {  
    Toast.makeText(getContext(), "快手版本不支持多图编辑,请更新快手", Toast.LENGTH_SHORT).show();  
  }  
}  

# 四、FAQ

# 1、出现任何问题排查流程

  1. 请检查 SDK接入配置 是否缺少配置;到应用市场升级最新的快手App。
  2. 请检查下载的SDK包里面的所有文件是否都引入并配置到了开发者的工程里。
  3. 在demo 内测试接入的功能是否正常。
  4. 若运行 demo 正常,仔细对比demo和开发者工程的集成逻辑的区别。
  5. 若还是不行,提供快手App信息、开发者信息找人工客服,会有专业人员接收问题。

# 2、快手外部应用app分享视频时如何插入话题。

目前对外的opensdk不支持发布视频时带话题标签。另外mExtraInfo,thirdExtraInfo,mMediaInfoMap这些字段暂不对外开放。

# 3、获取第三方App name失败。

检查App的包名的书写方式为如下代码。可以参考demo

<application  
    android:label="@string/app_name">  
</application>  
<resources>  
  <string name="app_name">OpenSdkDemo</string>  
</resources>  

# 4、适配Android11的软件包可见性

Android11加强了隐私保护策略,引入了大量变更和限制,其中一个重要变更 —— 软件包可见性 (opens new window)
此更改将会导致检查是否安装快手app失败,从而无法正确调起开放平台功能。
特别需要注意的是,Android11的该变更只会影响到升级 targetSdkVersion=30 的应用,未升级的应用暂不受影响。

  • 根据Android官方给出的适配方案,在主工程的AndroidManifest.xml 中增加 标签,即可解决以上影响,代码如下:
<manifest package="com.kwai.opensdk.demo">  
  // 在应用的AndroidManifest.xml添加如下<queries>标签  
   <queries>  
    <package android:name="com.smile.gifmaker"/>  // 快手主站  
    <package android:name="com.kuaishou.nebula"/> // 快手极速版  
  </queries>  
</manifest>  
  
  • 添加以上标签之后,需要开发者升级编译工具,否则会出现编译错误:
    Android Studio 需要升级至 3.3 及以上,建议升级至 4.0 及以上版本
    Android SDK Build-Tools 需要升级至 30.0.0 及以上版本
    com.android.tools.build:gradle 需要升级至 3.6.0 版本及以上,建议升级至最新版本

# 5、调用发布视频的功能却跳转到了剪辑页是为什么?

按以下步骤进行检查:

  1. 在开发者后台检查此应用是否有发布视频的权限,若没有可能会跳转到剪辑页。
  2. 检查发布的视频是否超过最大长度限制,若视频长度超限也会跳转到剪辑页。如果开发者想配置此最大长度限制可以前往开发者社区 (opens new window)咨询。

# 6、Android11及更高版本分享时,会进入剪辑页,并提示失败,这是什么原因?

android 11的读取sd卡目录权限变了,有两种改法。一种是使用fileProvider,一种将视频放公共目录下。官方参考链接 (opens new window)

# 五、错误码

错误码 说明 备注
1 分享成功
-1 内部问题,联系客服
-1005 没有安装快手App
-1006 不支持此功能
-1010 参数传递失败
-1011 快手App没有登录
-1013 拒绝当次分享动作 如果是发布视频:请检查视频长度; mDisableFallback是否是false
-1014 快手App开着青少年模式,关闭即可。
-1015 网络出现异常,可以稍后试试
-1016 快手App没有存储权限
-1017 分享的图片损坏
-1018 3s内不能重复分享
-1019 视频size太大
Copyright ©2025, All Rights Reserved