Próbowałem uzyskać ścieżkę URI dla pliku aktywów.
uri = Uri.fromFile(new File("//assets/mydemo.txt"));
Kiedy sprawdzam, czy plik istnieje, widzę, że plik nie istnieje
File f = new File(filepath);
if (f.exists() == true) {
Log.e(TAG, "Valid :" + filepath);
} else {
Log.e(TAG, "InValid :" + filepath);
}
Czy ktoś może mi powiedzieć, jak mogę wymienić bezwzględną ścieżkę do pliku istniejącego w folderze zasobów
file://android_asset/...
, gdzie...
jest ścieżką względną wassets/
katalogu twojego projektu .file://android_asset/
, choć nie dlaUri
: github.com/commonsguy/cw-advandroid/tree/master/WebView/GeoWeb1file:///
.new File("file:///android_asset/sounds/beep.mid");
, ale plik wynikowy nie istnieje. Jakieś pomysły? Plik PS znajduje się wassets/sounds/
folderze.Prawidłowy adres URL to:
gdzie RELATIVEPATH jest ścieżką do twojego zasobu względem folderu zasobów.
Zwróć uwagę na 3 / w schemacie. Widok sieciowy nie załadowałby żadnego z moich zasobów bez 3. Próbowałem 2, jak (poprzednio) skomentował CommonsWare, i nie zadziałałoby. Potem spojrzałem na źródło CommonsWare na githubie i zauważyłem dodatkowy ukośnik.
Testy te zostały jednak przeprowadzone tylko na emulatorze Androida 1.6, ale wątpię, by było inaczej na prawdziwym urządzeniu lub w wyższej wersji.
EDYCJA: CommonsWare zaktualizował swoją odpowiedź, aby odzwierciedlić tę drobną zmianę. Więc zredagowałem to, więc jego obecna odpowiedź nadal ma sens.
źródło
String fileName = "file:///android_asset/file.csv";
System.out.println(new File(fileName).exists()); // prints false
File
który akceptuje ciąg znaków oczekuje ścieżki, a nie identyfikatora URI . Od kilku lat nie kodowałem dla Androida i mogło się to zmienić. Nie jestem pewien, czy możesz uzyskać dostęp do folderu zasobów osadzonych przy użyciu normalnej klasy plików Java. Wydaje mi się, że pamiętam, że musisz użyć AssetManagera . Pliki w folderze zasobów są umieszczane na urządzeniu w pakiecie APK tylko do odczytu i kompresowane (pliki APK to w rzeczywistości pliki ZIP), dzięki czemu więcej pracy, aby je ponownie odczytać. Spróbuj na przykładnew File(new URI(filename))
Spróbuj, aby ten kod działał poprawnie
źródło
Wreszcie znalazłem sposób, aby uzyskać ścieżkę do pliku, który jest obecny w zasobach z tej odpowiedzi w Kotlinie. Tutaj kopiujemy plik zasobów do pamięci podręcznej i uzyskujemy ścieżkę do pliku z tego pliku pamięci podręcznej.
Uzyskaj ścieżkę do pliku, na przykład:
źródło
fileName
have directorydir/file
. Spadnie ze ścieżką, któracache/dir/file
nie istnieje. Myślę też, że lepiej mieć sprawdzenieif(!it.exist)
wewnątrzalso
bloku, wtedy nie skopiuje pliku za każdym razem, gdy plik jest już w pamięci podręcznejif(!it.exist)
zgłasza błąd nierozwiązane odwołanie. jakieś rozwiązanie?if(!it.exist)
powinienem wstawić przedit.outputStream()
...Upewnij się, że folder zasobów jest umieszczony we właściwej pozycji.
źródło
sourceSets { main { assets.srcDirs = ['src/main/assets'] } }
Działa dla WebView, ale wydaje się, że nie działa
URL.openStream()
. Musisz więc rozróżniać protokoły file: // i obsługiwać je przez AssetManager zgodnie z sugestią.źródło
Wypróbuj to, działa:
Jeśli otrzymasz wyjątek wartości null, spróbuj tego (z klasą
TopBrandData
):źródło
źródło
Spróbuj tego :
Zrobiłem to i zadziałało
źródło
Tak, nie możesz uzyskać dostępu do folderu na dysku z telefonu z Androidem lub emulatora, ponieważ Twój komputer i Android to dwa różne systemy operacyjne. Poszedłbym do folderu res na Androida, ponieważ ma dobre metody zarządzania zasobami. Dopóki nie masz bardzo dobrego powodu, aby umieścić plik w folderze zasobów. Zamiast tego możesz to zrobić
źródło
Pracował dla mnie Wypróbuj ten kod
źródło