从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
相关产品推荐
相关产品推荐

