Od kilku dni zmagam się z przesyłaniem plików z WebView i nie ma postępu. Wyszukałem w Google i wdrożyłem wszystkie sugerowane rozwiązania, ale żadne nie działa, na przykład: rozwiązania sugerowane tutaj i tak dalej.
Problem: Mam stronę HTML z następującym kodem do przesłania pliku. Działa dobrze w przeglądarce na komputerze, takiej jak Firefox i wbudowanej przeglądarce emulatora / AVD, tj. Kiedy klikam przycisk „Przeglądaj ...” renderowany przez element, przeglądarka otwiera okno dialogowe, w którym mogę wybrać plik do przesłania.
Jednak w emulatorze / AVD systemu Android 3.0, kiedy klikam „Wybierz plik”, nic się nie dzieje, żadne okno dialogowe pliku nie jest otwierane !!!
<form method="POST" enctype="multipart/form-data">
File to upload: <input type="file" name="uploadfile">
<input type="submit" value="Press to Upload..."> to upload the file!
</form>
Czy ktoś mógłby zasugerować najwcześniej możliwe rozwiązanie.
android
android-emulator
webview
user741148
źródło
źródło
Webview
podklasy, która automatycznie obsługuje przesyłanie plików itp.: Github.com/delight-im/Android-AdvancedWebViewAdvancedWebView.isFileUploadAvailable()
czy przesyłanie jest obsługiwane. Możesz też udostępnić swój kod i poprosić o pomoc w problemach: github.com/delight-im/Android-AdvancedWebView/issuesOdpowiedzi:
Jest to pełne rozwiązanie dla wszystkich wersji Androida, też miałem z tym trudności.
Chcę również dodać, że „strona przesyłania”, taka jak ta w tym przykładzie, nie będzie działać na <4 wersjach, ponieważ ma funkcję podglądu obrazu, jeśli chcesz, aby działała, użyj prostego przesyłania php bez podglądu.
Aktualizacja :
Proszę znaleźć rozwiązanie dla urządzeń Lollipop tutaj i dzięki za gauntface
Aktualizacja 2 :
Kompletne rozwiązanie dla wszystkich urządzeń z Androidem aż do oreo tutaj i jest to bardziej zaawansowana wersja , powinieneś się temu przyjrzeć, może to pomoże.
źródło
progressBar
Wydaje tam nieużywane. Widzę tylko, że się ukrywa, ale nie widzę, gdzie jest aktywowany. Myślę, że w tym celu należałoby dodaćonProgressChanged(...)
doWebChromeClient
wariantu niestandardowego . (I coś jakgetWindow().setFeatureInt( Window.FEATURE_PROGRESS, Window.PROGRESS_VISIBILITY_ON);
wonCreate
.)Metoda pracy od HONEYCOMB (API 11) do Oreo (API 27)
[Nie testowano na Pie 9.0]
Zmodyfikowano
onActivityResult()
Teraz w
onCreate()
lubonCreateView()
wklej następujący kodźródło
to jedyne rozwiązanie, które znalazłem, które działa!
źródło
W wersji 5.0 Lollipop Google dodał oficjalną metodę WebChromeClient.onShowFileChooser . Zapewniają nawet sposób automatycznego generowania intencji selektora plików, tak aby używał danych wejściowych akceptujących typy MIME.
W przypadku wersji Androida przed KitKatem działają prywatne metody wymienione w innych odpowiedziach. Nie znalazłem dobrego obejścia dla KitKat (4.4).
źródło
uploadMessage.onReceiveValue()
działa i kończy)
Okazało się, że potrzebuję 3 definicji interfejsu, aby obsługiwać różne wersje Androida.
źródło
To rozwiązanie działa również w przypadku Honeycomb i Ice Cream Sandwich. Wygląda na to, że Google wprowadził fajną nową funkcję (atrybut akceptacji) i zapomniał zaimplementować przeciążenie w celu zapewnienia zgodności z poprzednimi wersjami.
źródło
Pełne rozwiązanie Hifarrera jest dla mnie bardzo pomocne.
ale napotkałem wiele innych problemów - obsługa innego typu MIME, wyświetlanie listy urządzeń do przechwytywania (kamera, wideo, rejestrator dźwięku), natychmiastowe otwieranie urządzenia przechwytującego (np .: <input accept = "image / *; capture">) ...
Dlatego stworzyłem rozwiązanie, które działa dokładnie tak samo, jak domyślna aplikacja przeglądarki internetowej.
Użyłem Androida-4.4.3_r1 / src / com / android / browser / UploadHandler.java. (dzięki Rupert Rawnsley)
dodatkowy ciąg znaków res / values / string.xml:
Jeśli używasz proguard, możesz potrzebować poniższej opcji w proguard-project.txt:
AKTUALIZACJA # 1 (2015.09.09)
dodaje kod kompatybilności z Androidem 5.0.1.
źródło
To jest praca dla mnie. Pracuj także dla Nougat i Marshmallow [ [
źródło
Uznałem za konieczne zdefiniowanie
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture)
w systemie Android 4.1. Następnie poszedłem za rozwiązaniem Michela Oliviera.źródło
Właściwie udało mi się sprawić, aby selektor plików pojawił się w KitKat, aby wybrać obraz i pobrać ścieżkę pliku w wyniku działania, ale jedyną rzeczą, której nie mogę „naprawić” (z powodu tego obejścia), jest wypełnienie pola wejściowego z danymi pliku.
Czy ktoś wie, jak uzyskać dostęp do pola wprowadzania z działania? Używam tego przykładowego komentarza . To tylko ostatni kawałek, ostatnia cegła w ścianie, którą muszę po prostu umieścić we właściwym miejscu (chociaż mógłbym uruchomić przesyłanie pliku obrazu bezpośrednio z kodu.
AKTUALIZACJA # 1
Nie jestem zagorzałym programistą Androida, więc pokażę kod na poziomie początkującym. Tworzę nowe działanie w już istniejącym działaniu
Manifest część
Tworzę moją klasę BrowseActivity na podstawie tej przykładowej odpowiedzi . Instancja WebChromeClient () w zasadzie wygląda tak samo, z wyjątkiem ostatniego elementu, wyzwalającego część interfejsu selektora ...
I jeszcze trochę rzeczy
}
Na koniec trochę więcej kodu, aby uzyskać rzeczywistą ścieżkę do pliku, kod znaleziony w SO, pięć dodanych adresów URL postów w komentarzach, aby autor otrzymał kredyty za swoją pracę.
Wreszcie, strona HTML musi wyzwolić tę nową metodę showPicker (szczególnie w przypadku A4.4)
źródło
Własna przeglądarka Google oferuje tak kompleksowe rozwiązanie tego problemu, że gwarantuje swoją własną klasę:
Implementacja openFileChooser w systemie Android 4.0.4
UploadHandler w systemie Android 4.0.4
źródło
2019: Ten kod zadziałał dla mnie (testowany na Androidach 5-9).
Hope może ci pomóc.
źródło
Znalazłem ROZWIĄZANIE, które działa dla mnie! Dodaj jeszcze jedną regułę w pliku
proguard-android.txt
:źródło
Rozwiązanie Kotlin dla Androida 8:
Stałe:
Konfiguracja WebView:
I część onAcrtivityResult:
Proszę zwrócić uwagę, że nasza zmienna intencji nazywa się "data".
źródło
czy odwiedziłeś te linki? http://groups.google.com/group/android-developers/browse_thread/thread/dcaf8b2fdd8a90c4/62d5e2ffef31ebdb
http://moazzam-khan.com/blog/?tag=android-upload-file
http://evgenyg.wordpress.com/2010/05/01/uploading-files-multipart-post-apache/
Zwięzły przykład przesyłania plików przez Java lib Apache Commons
myślę, że otrzymasz z tego pomoc
źródło
W KitKat możesz użyć Storage Access Framework.
Struktura dostępu do magazynu / pisanie aplikacji klienckiej
źródło
Webview - wybór jednego i wielu plików
potrzebujesz dwóch minut na zaimplementowanie tego kodu:
build.gradle
kod java:
źródło
Jestem nowy w Andriod i też z tym walczyłem. Zgodnie z Przewodnikiem informacyjnym Google WebView.
Przykładowy kod, który wykonałem w MainActvity.java.
Wykuty
źródło
Badałem tę kwestię przez prawie miesiąc. Wszystko zawiodło. Nie wszystkie kody widoczne na wielu stronach internetowych nie działają dobrze. Ale tutaj istnieje najlepsze rozwiązanie
https://github.com/chiclaim/android-webview-upload-file
Kroki
1) Kliknij sklonuj lub pobierz
2) Pobierz plik zip z katalogu lokalnego
3) rozpakuj plik zip
4) Otwórz studio Android
5) Idź do pliku ----> Otwórz ---> Przejdź do katalogu, w którym rozpakowałeś zawartość.
6) Zmień wymagany adres URL w webView.loadUrl („Twój adres url hre”); w MainActivity.java
7) Działa dobrze z wersją Android Studio 3.4.2
źródło