¿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.
¿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). –
@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
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 –