上一篇
安卓原生对接七牛云短视频sdk
- 行业动态
- 2025-04-23
- 2339
安卓原生集成七牛云短视频SDK需配置权限、初始化SDK,调用接口实现视频上传与播放功能
前置准备
七牛云账号注册与配置
- 注册账号:访问七牛云官网完成注册,创建主账号。
- 创建空间(Bucket):
- 进入「对象存储」->「空间管理」->「新建空间」。
- 设置空间名称(如
shortvideo
)、存储区域(如华东)、访问控制(建议私有空间)。
- 获取密钥:
- 在「个人面板」->「密钥管理」中获取
AccessKey
和SecretKey
。
- 在「个人面板」->「密钥管理」中获取
安卓项目配置
- AndroidManifest.xml 中添加权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.INTERNET"/>
SDK集成步骤
下载七牛云SDK
- 访问七牛云开发者中心下载最新版 Android SDK(包含短视频模块)。
- 解压后将
.jar
或.aar
文件放入项目libs
目录。
配置Gradle依赖
// 项目根目录 build.gradle allprojects { repositories { google() mavenCentral() } } // 模块级 build.gradle dependencies { implementation fileTree(dir: 'libs', include: ['.jar']) // 引入本地SDK implementation 'com.qiniu:qiniu-android-sdk:7.9.0' // 七牛官方Maven库(可选) }
初始化SDK
// Application类中初始化 public class App extends Application { @Override public void onCreate() { super.onCreate(); // 初始化七牛云配置 QNConfiguration config = new QNConfiguration(); config.setAccessKey("你的AccessKey"); config.setSecretKey("你的SecretKey"); config.setBucketName("你的空间名"); config.setZone(FixedZone.zone0()); // 根据空间所在区域选择 QNService.init(this, config); } }
核心功能实现
选择本地视频文件
// 调用系统文件选择器 Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("video/"); startActivityForResult(intent, REQUEST_CODE_SELECT_VIDEO);
上传视频到七牛云
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_CODE_SELECT_VIDEO && resultCode == RESULT_OK) { Uri videoUri = data.getData(); // 获取文件路径 String filePath = FileUtils.getPath(this, videoUri); // 创建上传任务 QNUploadTask task = new QNUploadTask(filePath, "短视频/" + System.currentTimeMillis() + ".mp4"); task.setCallback(new QNUploadCallback() { @Override public void onProgress(double progress) { // 更新进度条 progressBar.setProgress((int) (progress 100)); } @Override public void onSuccess(String key, String hash) { // 上传成功后返回文件key和hash Toast.makeText(MainActivity.this, "上传成功,Key:" + key, Toast.LENGTH_LONG).show(); } @Override public void onFailure(Exception exception) { // 处理失败逻辑 Toast.makeText(MainActivity.this, "上传失败:" + exception.getMessage(), Toast.LENGTH_LONG).show(); } }); task.execute(); // 执行上传 } }
生成视频播放链接
// 根据返回的key生成公开访问链接 String publicUrl = QNService.getPublicUrl("短视频/" + fileKey);
关键配置参数表
参数项 | 说明 | 示例值 |
---|---|---|
AccessKey | 七牛云账户密钥 | abcdefghijklmnopq |
SecretKey | 七牛云账户私钥 | 1234567890abcdef |
BucketName | 存储空间名称 | shortvideo |
FixedZone | 存储区域(根据空间位置选择) | zone0 (华东) |
RequestTimeout | 网络请求超时时间(毫秒) | 30000 |
常见问题与解决方案
上传失败提示权限不足
- 原因:未在运行时动态申请存储权限。
- 解决:
// Android 6.0+动态申请权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE_PERMISSION); }
视频文件过大导致上传超时
- 原因:默认分片大小或超时时间不足。
- 解决:
- 调整分片大小:
task.setBlockSize(1024 1024);
// 1MB分片 - 延长超时时间:
QNConfiguration.setRequestTimeout(60000);
// 60秒
- 调整分片大小:
相关问题与解答
问题1:如何限制上传视频的格式和大小?
解答:
- 格式限制:在文件选择后检查URI的MIME类型,仅允许
video/mp4
等格式。 - 大小限制:在上传前获取文件大小,例如限制为50MB以内:
long fileSize = new File(filePath).length(); if (fileSize > 50 1024 1024) { Toast.makeText(this, "视频大小超过50MB限制", Toast.LENGTH_SHORT).show(); return; }
问题2:如何实现视频封面图自动生成?
解答:
- 方案:利用FFmpeg生成视频截图,步骤如下:
- 集成FFmpeg库到项目中。
- 上传视频后调用命令截取第1秒画面:
String coverPath = "/sdcard/cover.jpg"; FFmpegCommandUtil.runCommand("-i " + videoPath + " -ss 1 -vframes 1 " + coverPath);
- 将封面图一并上传至七牛云,并与视频关联