OSS SDK通过文件的Uri上传文件,报错com.alibaba.sdk.android.oss.ClientException: No entry for content://media/external/audio/media/54511
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
遇到这个错误提示,意味着您在使用阿里云对象存储(OSS)SDK通过Android的Content URI上传文件时遇到了问题。错误信息No entry for content://media/external/audio/media/54511
表明SDK尝试访问的文件URI无法直接被读取或转换为可以上传的数据流。
要解决这个问题,您可以按照以下步骤操作:
检查文件权限:确保您的应用拥有读取外部存储中文件的权限。在AndroidManifest.xml中添加如下权限声明(如果尚未添加):
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
对于Android 6.0(API级别23)及以上版本,还需要在运行时请求权限。
使用ContentResolver打开并读取文件:由于您是通过Content URI访问文件,需要使用ContentResolver
来打开一个输入流,然后将这个输入流转给OSS SDK进行上传。示例如下:
// 假设uri是您要上传的文件的Uri
Uri fileUri = Uri.parse("content://media/external/audio/media/54511");
try {
ContentResolver resolver = context.getContentResolver();
InputStream inputStream = resolver.openInputStream(fileUri);
// 确保OSSClient已经初始化
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 设置Object的名称,即上传到OSS后的文件名
String objectName = "your_object_name";
// 使用流式上传
ossClient.putObject(new PutObjectRequest(bucketName, objectName, inputStream));
// 关闭输入流
inputStream.close();
// 关闭OSSClient
ossClient.shutdown();
} catch (IOException e) {
e.printStackTrace();
} catch (ClientException ce) {
ce.printStackTrace();
}
处理大文件:如果文件较大,建议使用分块上传(ResumableUploadRequest
)以提高上传的稳定性和效率。
请根据您的具体需求调整上述代码示例,并确保替换endpoint
、accessKeyId
、accessKeySecret
、bucketName
以及your_object_name
等占位符为实际的值。这样应该能帮助您解决报错问题,并成功上传文件至阿里云OSS。