You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从Google Photos选云端视频时URI异常及getPath返回null问题

解决Google Photos云端视频URI无法获取本地路径的问题

问题原因

你遇到的getPath()返回null的核心原因是:Google Photos返回的云端视频URI属于存储访问框架(SAF) 范畴,并非本地MediaStore数据库中的条目。MediaStore.Video.Media.DATA字段仅对应本地存储的媒体文件路径,云端视频不存在这个字段,因此cursor查询不到结果。

解决方案

不需要获取本地路径,直接通过ContentResolver操作URI对应的输入流即可处理视频;同时调整Intent类型以更好支持云端文件选择:

1. 调整Intent初始化代码

使用ACTION_OPEN_DOCUMENT替代ACTION_PICK,它专门用于存储访问框架,支持选择云端文件并获取持久访问权限:

Intent pickVideoIntent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
pickVideoIntent.setType("video/*");
pickVideoIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
pickVideoIntent.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
startActivityForResult(pickVideoIntent, REQ_CODE_PICK_VIDEO);

2. 修改onActivityResult逻辑

移除本地路径获取逻辑,直接使用URI,并持久化权限以保证后续访问:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQ_CODE_PICK_VIDEO && resultCode == RESULT_OK && data != null) {
        Uri selectedMediaUri = data.getData();
        // 持久化URI访问权限,避免后续无法访问
        getContentResolver().takePersistableUriPermission(
                selectedMediaUri,
                Intent.FLAG_GRANT_READ_URI_PERMISSION
        );
        // 直接传入URI处理上传
        uploadVideoFromUri(selectedMediaUri);
    }
}

3. 重构uploadVideoFromUri方法

通过ContentResolver打开输入流处理视频,无需本地路径:

private void uploadVideoFromUri(Uri uri) {
    try (InputStream inputStream = getContentResolver().openInputStream(uri)) {
        // 在此处实现上传逻辑,比如将inputStream写入临时文件或直接上传至服务器
        // 示例:将流写入本地临时文件
        File tempFile = File.createTempFile("temp_video", ".mp4", getCacheDir());
        FileOutputStream outputStream = new FileOutputStream(tempFile);
        byte[] buffer = new byte[4096];
        int bytesRead;
        while ((bytesRead = inputStream.read(buffer)) != -1) {
            outputStream.write(buffer, 0, bytesRead);
        }
        outputStream.flush();
        // 使用tempFile进行上传...
    } catch (IOException e) {
        e.printStackTrace();
    }
}

关键说明

  • 云端视频没有本地物理路径,所有操作必须通过ContentResolver提供的API进行。
  • FLAG_GRANT_PERSISTABLE_URI_PERMISSION配合takePersistableUriPermission可以让APP在重启后仍能访问该URI,避免重新选择文件。

内容的提问来源于stack exchange,提问作者Muhammad Noamany

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 18:01:05