2011-02-09 8 views
5

Se supone que debo mostrar una página web en una vista web en una aplicación. La página contiene un formulario html donde uno de los campos es archivo. Por lo tanto, es algo como ...Vista web de Android, el archivo de archivo de campo filechooser no aparece

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

Si abro la página en el navegador y pulse el botón Seleccionar archivo, selección de archivos aparece y todo está bien, pero cuando se presiona el botón del archivo en el vistaweb Elige no pasa nada:/

¿Alguna idea de cómo hacer esto?

+0

¿Con qué versión de Android estás trabajando? Creo que antes de FroYo (2.2), el navegador Android incorporado no admitía la carga de archivos: http://code.google.com/p/android/issues/detail?id=2519 (a partir del 2.2 debería funcionar, aunque , funciona bien en mi N1 corriendo 2.2). –

+0

@Charlie Collins Estoy intentando esto en 2.1, 2.2, 2.3 y estaría bien si funcionó en alguno de estos. Funciona bien en el navegador incluso en 2.1 (Galaxy S), pero necesito que esto funcione en una WebView en una aplicación personalizada. ¿Estás diciendo que funciona bien en tu aplicación con WebView en 2.2? – m0s

+0

No lo he probado específicamente en una WebView, no (solo estaba usando la aplicación del navegador). El navegador Android utiliza WebViews: http://android.git.kernel.org/?p=platform/packages/apps/Browser.git;a=blob_plain;f=src/com/android/browser/BrowserActivity.java; hb = HEAD –

Respuesta

6

WebView de forma predeterminada no abre el selector de archivos. Sin embargo, es posible hacer que esto funcione. WebChromeClient tiene el método oculto openFileChooser, que debe sobrescribirse para mostrar un selector de archivos y luego devolver el resultado a WebView. Según los gurús, nunca se deben usar métodos ocultos de Android SDK, por lo que esta no es una buena solución, y probablemente no se deba usar en aplicaciones empresariales. Sin embargo, el navegador de stock de Android funciona exactamente de esta manera. Poco más información sobre cómo superé este método está en mi esto question. Si alguien necesita la fuente, avíseme y la publicaré en algún lado.

+0

Hola, necesito hacer el exactamente lo mismo ... ¿puedes publicar el código de ejemplo en alguna parte? – ghostCoder

+0

@ghostCoder Hola, lo publiqué http://m0s-programming.blogspot.com/2011/02/file-upload-in-through-webview-on.html Si tienes más preguntas, pregunta aquí No lo hago Revisa ese blog muy a menudo. – m0s

+0

Gracias por los post m0s, parece funcionar en 2.2 pero no en nido de abeja. ¿Alguna idea de cómo hacer que funcione en Honeycomb? – odiggity

2

¿Es posible cargar archivos a través de la vista web?

Esta característica está disponible en la versión 1.3.0 y posterior. Para versiones anteriores de la aplicación, sí, es posible, pero debe agregar un código adicional para que funcione. Agregue el siguiente código en su archivo AndroidManifest.xml. Colocarla debajo de otros elementos de usos en permisos:

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

Copia/pega este MediaUtility.java clase Java en el proyecto. Colóquelo en el directorio com/robotemplates/webviewapp/utility.

Abra MainFragment.java en paquete de fragmentos. Encuentra método RenderView() y reemplazar “webView.setWebChromeClient (nueva WebChromeClient());” por el siguiente código:

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

Por último añadir siguiente código en algún lugar dentro del objeto MainFragment (por ejemplo, por debajo de esta línea de “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; 
    } 
} 

no se olvide de añadir las importaciones necesarias:‘android.webkit.ValueCallback importación;’,‘com.robotemplates.webviewapp.utility.MediaUtility importación;’,“java.io importación .Archivo;". Si todavía tiene un problema, intente agregar una regla en el script de Proguard: https://code.google.com/p/android/issues/detail?id=62220#c120.

Cuestiones relacionadas