如何获取通过内容提供程序 URI 从库发送到我的应用的视频的实际路径?



我有一个应用程序,我想在其中查看我选择从图库中共享的视频文件以进行编辑。为此,我知道我必须在活动清单中使用intent-filter标签。

所以我在这里,从图库应用程序中选择一个视频以"共享"到此应用程序中。当活动打开时,我使用Uri videoUri = getIntent().getParcelableExtra(Intent.EXTRA_STREAM);来检索视频的 URI。URI 如下所示:

content://com.google.android.apps.photos.contentprovider/-1/2/file%3A%2F%2F%2Fdata%2Fdata%2Fcom.google.android.apps.photos%2Fcache%2Fshare-cache%2Fmedia.tmp%3Ffilename%3Dimage.jpg/ORIGINAL/NONE/1804018524

我可以在 MediaPlayer 中很好地播放它,但是当我必须使用需要文件 [即 MP4Parser] 的库时,问题就来了,这意味着文件路径 - 这个 URI 不起作用。

我已经解析了file%3A%2F%2F%2Fdata%2Fdata%2Fcom.google.android.apps.photos%2Fcache%2Fshare-cache%2Fmedia.tmp%3Ffilename%3Dimage.jpg部分,它给了我:

file:///data/data/com.google.android.apps.photos/cache/share-cache/media.tmp?filename=image.jpg

这样做的问题是打开它会导致 ENOENT。new File("/data/data/com.google.android.apps.photos/cache/share-cache/media.tmp").exists()返回假。

我还通过getContentResolver().query(uri, null, null, null, null)在光标中查询了 URI 本身,并在其中记录了所有值。我得到的只是:

_id:0 _display_name:image.jpg _size:2183131 mime_type:video/mpeg _data:null orientation:0 datetaken:0 latitude:null longitude:null special_type_id:null

我的问题:有没有办法查询图库应用程序共享的视频的实际路径[以file://形式或content://media/external/videos/...],如果该URI是它发送的内容?

事实证明,我需要做的就是通过ContentResolver从所述URI打开一个InputStream,将其写入指向临时文件的FileOutputStream(现在我在应用程序的FilesDir中有临时文件(,然后将其用作数据源。

最新更新