2011-02-09 22 views
5

Devo visualizzare una pagina Web in una visualizzazione Web in un'app. La pagina contiene un modulo html in cui uno dei campi è un file. Così va qualcosa come ...Webview Android, campo di immissione file filechooser non viene visualizzato

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

Se apro la pagina nel browser e premere il pulsante Seleziona file, selezione dei file si apre e tutto è buono, ma quando si preme il pulsante File nella WebView Scegli non succede nulla:/

Qualche idea su come farlo funzionare?

+0

Con quale versione di Android stai lavorando? Credo che prima di FroYo (2.2) il browser Android integrato non supportasse il caricamento di file: http://code.google.com/p/android/issues/detail?id=2519 (a partire da 2.2 dovrebbe funzionare comunque , funziona bene sul mio N1 con 2.2). –

+0

@Charlie Collins Sto provando questo su 2.1, 2.2, 2.3 e sarebbe ok se funzionasse su uno di questi. Funziona perfettamente nel browser anche su 2.1 (Galaxy S), ma ho bisogno che funzioni in una WebView in un'app personalizzata. Stai dicendo che funziona bene nella tua app con una WebView su 2.2? – m0s

+0

Non l'ho provato in particolare in una WebView, no (stavo solo usando l'app Browser). Il browser Android utilizza comunque WebViews: http://android.git.kernel.org/?p=platform/packages/apps/Browser.git;a=blob_plain;f=src/com/android/browser/BrowserActivity.java; hb = HEAD –

risposta

6

WebView per impostazione predefinita non apre il selettore di file. Tuttavia è possibile farlo funzionare. WebChromeClient ha il metodo nascosto openFileChooser, che deve essere sovrascritto per far apparire un selettore di file e quindi restituire il risultato a WebView. Secondo i guru non si dovrebbero mai usare metodi nascosti di Android SDK, quindi questa non è una buona soluzione e probabilmente non dovrebbe essere usata nelle app aziendali. Tuttavia, il browser azionario di Android funziona esattamente in questo modo. Poco più informazioni su come ho ignorato questo metodo è nel mio questo question. Se qualcuno ha bisogno della fonte fammi sapere che lo postò da qualche parte.

+0

Ciao, ho bisogno di fare il esattamente la stessa cosa .. puoi postare il codice di esempio da qualche parte ?? – ghostCoder

+0

@ghostCoder Ehi, l'ho postato http://m0s-programming.blogspot.com/2011/02/file-upload-in-through-webview-on.html Se hai altre domande, chiedi qui t controllare quel blog molto spesso. – m0s

+0

Grazie per il post m0s, sembra funzionare in 2.2 ma non a nido d'ape. Qualche idea su come farlo funzionare a nido d'ape? – odiggity

2

E 'possibile caricare file tramite webview?

Questa funzione è disponibile nella versione 1.3.0 e successive. Per le versioni precedenti dell'app, sì è possibile, ma è necessario aggiungere del codice aggiuntivo per farlo funzionare. Aggiungi il seguente codice nel tuo file AndroidManifest.xml. Posizionarla sotto altri elementi usi-autorizzazione:

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

Copia/incolla questo java classe MediaUtility.java nel progetto. Inseriscilo nella directory com/robotemplates/webviewapp/utility.

Aprire MainFragment.java nel pacchetto frammento. Trova il metodo renderView() e sostituire “webView.setWebChromeClient (nuova WebChromeClient());” dal seguente codice:

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; 
    } 
}); 

Infine aggiungere seguente codice da qualche parte dentro l'oggetto MainFragment (per esempio al di sotto di questa linea “boolean privato 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; 
    } 
} 

non dimenticare di aggiungere le importazioni necessarie:‘import android.webkit.ValueCallback;’,‘importazione com.robotemplates.webviewapp.utility.MediaUtility;’,“importazione java.io .File;". Se hai ancora un problema, prova ad aggiungere una regola nello script Proguard: https://code.google.com/p/android/issues/detail?id=62220#c120.

Problemi correlati