如何区分文件 URI 和内容提供者 URI?

How to differentiate between a file URI and contentprovider URI?

假设我通过以下方式从外部选择一个文件:

Intent i = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(i, GALLERY_REQUEST_CODE);

结果通过onActivityResult

返回
Uri file = data.getData();

这可以是不同的格式。确定是否需要内容解析器查询的约定是什么?如果文件 URI 是文件路径 file:/// 或类似 //package.example/....

的应用程序 URI

我知道我可以检查 uri 是否有 file:/// 前缀,但这似乎有点老套。我只想要文件路径。

What is the convention here to determine if a content resolver query is needed?

ContentResolver 上的

openInputStream() 处理 file 方案和 content 方案。

I know I could check if the uri has a file:/// prefix but that seems a bit hacky

嗯,好吧,Uria getScheme() method

I just want the file path.

content Uri 没有 "file path",因为不要求将内容存储为文件。

只是恭维 CommonsWare 的回答。您可以检查 URI 的方案,例如,使用 getScheme() method, as mentioned in CommonsWare's answer. A content provider URI scheme is content://,而文件 URI 方案是 file://