2011-02-09 10 views
5

Mam wyświetlić stronę internetową w widoku internetowym w aplikacji. Strona zawiera formularz html, w którym znajduje się jedno z pól. Tak to wygląda mniej więcej tak ...Podgląd strony internetowej w systemie Android, pole wprowadzania plików nie wyświetla się

<input type="file" name="file"> 

Gdybym otworzyć stronę w przeglądarce, a następnie naciśnij przycisk Wybierz plik, wyboru pliku wyskakuje i wszystko jest dobrze, ale kiedy nacisnąć przycisk Plik w WebView Wybierz nic się nie dzieje:/

Jakieś pomysły, jak to działa?

+0

Z jaką wersją Androida współpracujesz? Wierzę, że przed FroYo (2.2) wbudowana przeglądarka Androida nie obsługiwała przesyłania plików: http://code.google.com/p/android/issues/detail?id=2519 (od wersji 2.2 powinna działać działa dobrze na moim N1 z systemem 2.2). –

+0

@Charlie Collins Próbuję tego na 2.1, 2.2, 2.3 i byłoby dobrze, gdyby działało na którymkolwiek z nich. Działa dobrze w przeglądarce nawet w wersji 2.1 (Galaxy S), ale potrzebuję tego do pracy w WebView w niestandardowej aplikacji. Mówisz, że działa dobrze w Twojej aplikacji z WebView w wersji 2.2? – m0s

+0

Nie próbowałem tego specjalnie w WebView, nie (używałam tylko aplikacji Browser). Przeglądarka systemu Android używa WebViews: http://android.git.kernel.org/?p=platform/packages/apps/Browser.git;a=blob_plain;f=src/com/android/browser/BrowserActivity.java; hb = HEAD –

Odpowiedz

6

WebView domyślnie nie otwiera wyboru plików. Jednak możliwe jest wykonanie tej pracy. WebChromeClient ma ukrytą metodę openFileChooser, którą należy przesłonić, aby wyświetlić okno wyboru plików, a następnie zwrócić wynik do WebView. Według guru, nigdy nie należy używać ukrytych metod Androida SDK, więc nie jest to dobre rozwiązanie i prawdopodobnie nie powinno być używane w aplikacjach korporacyjnych. Jednak przeglądarka zasobów Androida działa dokładnie w ten sposób. Niewiele więcej informacji na temat tego, w jaki sposób przejąłem tę metodę, jest w mojej wersji question. Jeśli ktokolwiek potrzebuje źródła, daj mi znać Złóż to gdzieś.

+0

Witam, muszę zrobić dokładnie to samo ... czy możesz gdzieś umieścić przykładowy kod? – ghostCoder

+0

@ghostCoder Hej, zamieściłem to http://m0s-programming.blogspot.com/2011/02/file-upload-in-through-webview-on.html Jeśli będziesz mieć dalsze pytania, zapytaj tutaj, nie mówię. t często sprawdzaj ten blog. – m0s

+0

Dzięki za pocztę m0s, wygląda na to, że działa w wersji 2.2, ale nie w strukturze plastra miodu. Jakieś pomysły, jak zmusić go do pracy w plastrze miodu? – odiggity

2

Czy można przesłać pliki przez webview?

Ta funkcja jest dostępna w wersji 1.3.0 i nowszych. W starszych wersjach aplikacji jest to możliwe, ale musisz dodać trochę kodu, aby działał. Dodaj następujący kod do pliku AndroidManifest.xml. Umieść go poniżej innych zastosowań-elementy uprawnień:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 

Skopiuj/wklej tę klasę java MediaUtility.java do projektu. Umieść go w katalogu com/robotemplates/webviewapp/utility.

Otwórz MainFragment.java w pakiecie fragmentu. Znajdź sposób renderView() i zastąpić „webView.setWebChromeClient (nowa WebChromeClient());”, wykonując kodu:

webView.setWebChromeClient(new WebChromeClient() 
{ 
    public void openFileChooser(ValueCallback<Uri> filePathCallback) 
    { 
     mFilePathCallback4 = filePathCallback; 
     Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
     intent.addCategory(Intent.CATEGORY_OPENABLE); 
     intent.setType("*/*"); 
     startActivityForResult(Intent.createChooser(intent, "File Chooser"), REQUEST_FILE_PICKER); 
    } 

    public void openFileChooser(ValueCallback filePathCallback, String acceptType) 
    { 
     mFilePathCallback4 = filePathCallback; 
     Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
     intent.addCategory(Intent.CATEGORY_OPENABLE); 
     intent.setType("*/*"); 
     startActivityForResult(Intent.createChooser(intent, "File Chooser"), REQUEST_FILE_PICKER); 
    } 

    public void openFileChooser(ValueCallback<Uri> filePathCallback, String acceptType, String capture) 
    { 
     mFilePathCallback4 = filePathCallback; 
     Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
     intent.addCategory(Intent.CATEGORY_OPENABLE); 
     intent.setType("*/*"); 
     startActivityForResult(Intent.createChooser(intent, "File Chooser"), REQUEST_FILE_PICKER); 
    } 

    @Override 
    public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) 
    { 
     mFilePathCallback5 = filePathCallback; 
     Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
     intent.addCategory(Intent.CATEGORY_OPENABLE); 
     intent.setType("*/*"); 
     startActivityForResult(Intent.createChooser(intent, "File Chooser"), REQUEST_FILE_PICKER); 
     return true; 
    } 
}); 

Wreszcie dodać następujący kod gdzieś wewnątrz obiektu MainFragment (na przykład poniżej tej linii „private boolean mLocal = false;”):

private static final int REQUEST_FILE_PICKER = 1; 
private ValueCallback<Uri> mFilePathCallback4; 
private ValueCallback<Uri[]> mFilePathCallback5; 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent intent) 
{ 
    if(requestCode==REQUEST_FILE_PICKER) 
    { 
     if(mFilePathCallback4!=null) 
     { 
      Uri result = intent==null || resultCode!=Activity.RESULT_OK ? null : intent.getData(); 
      if(result!=null) 
      { 
       String path = MediaUtility.getPath(getActivity(), result); 
       Uri uri = Uri.fromFile(new File(path)); 
       mFilePathCallback4.onReceiveValue(uri); 
      } 
      else 
      { 
       mFilePathCallback4.onReceiveValue(null); 
      } 
     } 
     if(mFilePathCallback5!=null) 
     { 
      Uri result = intent==null || resultCode!=Activity.RESULT_OK ? null : intent.getData(); 
      if(result!=null) 
      { 
       String path = MediaUtility.getPath(getActivity(), result); 
       Uri uri = Uri.fromFile(new File(path)); 
       mFilePathCallback5.onReceiveValue(new Uri[]{ uri }); 
      } 
      else 
      { 
       mFilePathCallback5.onReceiveValue(null); 
      } 
     } 

     mFilePathCallback4 = null; 
     mFilePathCallback5 = null; 
    } 
} 

nie zapomnij dodać niezbędne import:«import android.webkit.ValueCallback;»,«import com.robotemplates.webviewapp.utility.MediaUtility;»,„import java.io .Plik;". Jeśli nadal masz problem, spróbuj dodać regułę w skrypcie Proguard: https://code.google.com/p/android/issues/detail?id=62220#c120.

Powiązane problemy