Учитывая абсолютный Uri и относительный Uri или относительный путь, как вы получаете абсолютное Uri, указывающее на относительное местоположение?
Например, предположим, что мы имеем Uri для file:///android_asset/dir, указывая на местоположение в наших активах. Предположим далее, что в другом месте мы имеем относительный путь /foo. Абсолютный Uri для этого относительного пути должен быть file:///android_asset/foo. Есть ли что-то на Uri или в другом месте Android SDK, которое мне не хватает, что дает мне этот результат Uri?
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.