Biorąc pod uwagę bezwzględną Uri
i względną ścieżkę, jak uzyskać wartość bezwzględną Uri
wskazującą położenie względne?Jak rozwiązać względne Uri?
Załóżmy na przykład, że mamy Uri
dla file:///android_asset/dir
, wskazując lokalizację w naszych zasobach. Dalej przypuśćmy, że gdzie indziej mamy względną ścieżkę /foo
. Wartość bezwzględna Uri
dla tej ścieżki względnej powinna wynosić file:///android_asset/foo
. Czy jest coś na Uri
lub w innym miejscu w zestawie SDK Androida, którego mi brakuje, aby uzyskać ten wynik: Uri
?
Uri.withAppendedPath()
nie jest odpowiedzią, jak wszystko wydaje się zrobić to obsługiwać końcowe separatory katalogu:
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
poprzez buildUpon()
na Uri
, nie jest poprawa:
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
w A szczypta Mogę spróbować użyć java.net.URL
i jego konstruktora URL(URL context, String spec)
lub po prostu zrzucić na niego jakiś kod, ale miałem nadzieję pozostać w świecie Androida Uri
wartości, jeśli to możliwe, tylko dla wszelkich dziwactw różnicujących URL
i Uri
.
nie trzeba dodawać slasha dla appendPath - robi to za Ciebie. Mam swoją metodę getBaseUriBuilder, aby uzyskać Uri.Builder ze schematem + root. Więc wszystko, czego potrzebujesz, to dołączanie parametrów ścieżek i zapytań ... –
"Więc wszystko, czego potrzebujesz, to dołączenie ścieżki" - istnieje wiele możliwych względnych struktur ścieżki. '/ foo' jest po prostu jednym. Istnieją również 'foo','./Foo', '../ foo',' ../../ foo/bar', i tak dalej. Wielu użyje części ścieżki absolutnego 'Uri', inni (np.'/Foo') nie będą. Próbuję poradzić sobie w każdej sytuacji, jeśli to możliwe. – CommonsWare
zobacz Konkursy plików: 'Plik (katalog plików, nazwa ciągu)' i/lub 'Plik (String dirPath, Nazwa ciągu)' oraz 'Plik # getCanonicalPath()' – pskink