如何从绝对 Uri
和相对 Uri
或相对路径获得指向相对位置的绝对 Uri
?
例如,假设我们有指向资源文件夹中位置的file:///android_asset/dir
的 Uri
。进一步假设我们有一个相对路径/foo
。那么该相对路径的绝对Uri
应该是file:///android_asset/foo
。在 Uri
或Android SDK中是否有我忽略的提供这个结果的方法吗?
Uri.withAppendedPath()
不是答案,因为它似乎只处理尾部目录分隔符:
Uri abs=Uri.parse("file:///android_asset/");
Uri rel=Uri.withAppendedPath(abs, "/foo");
Assert.assertEquals("file:///android_asset/foo", rel.toString());
// actually returns file:///android_asset//foo
Uri abs2=Uri.parse("file:///android_asset/dir");
Uri rel2=Uri.withAppendedPath(abs2, "/foo");
Assert.assertEquals("file:///android_asset/foo", rel2.toString());
// actually returns file:///android_asset/dir//foo
Uri.Builder
通过buildUpon()
方法创建Uri
对象,但并不是一个优化。
Uri rel3=abs.buildUpon().appendPath("/foo").build();
Assert.assertEquals("file:///android_asset/foo", rel3.toString());
// actually returns file:///android_asset/%2Ffoo
Uri rel4=abs.buildUpon().appendEncodedPath("/foo").build();
Assert.assertEquals("file:///android_asset/foo", rel4.toString());
// actually returns file:///android_asset//foo
在紧急情况下,我可以尝试使用java.net.URL
和它的URL(URL context, String spec)
构造函数,或者自己编写一些代码,但我希望如果可能的话,仍然留在Android Uri
值的领域内,只是为了区分URL
和Uri
之间的任何特殊性。
Uri rel=Uri.withAppendedPath(abs, "foo");
,然后返回值将是file:///android_asset/foo
。 - BNK/foo
只是其中之一。还有foo
、./foo
、../foo
、../../foo/bar
等等。许多人会使用绝对Uri
的部分路径,而其他人(例如/foo
)则不会。如果可能的话,我会尽量处理所有情况。 - CommonsWareURI absolute = new URI("file:////android_asset/"); URI relative = new URI("foo/bar"); System.out.println(absolute.resolve(relative)); // I/System.out﹕ file://android_asset/foo/bar relative = new URI("./foo/bar"); System.out.println(absolute.resolve(relative)); // I/System.out﹕ file://android_asset/foo/bar relative = new URI("../foo"); System.out.println(absolute.resolve(relative)); // I/System.out﹕ file://foo
- BNKfile:///android_asset
中的android_asset
是“魔法”,必须以不同的方式对待,就像它是URL的主机一样。常规的file:///
值没有这种限制。结果是,似乎SDK中没有处理此解析的功能,我将使用URI
和/或Uri.Builder
来拼凑一些东西。 - CommonsWare