Nuestros mejores investigadores agotaron sus reservas de café, en su búsqueda noche y día por la respuesta, hasta que Mario encontró el arreglo en Bitbucket por lo tanto ahora la compartimos con nosotros.
Solución:
Intente agregar estos permisos.
Android 6.0 Marshmallow presenta un nuevo modelo para administrar permisos, que agiliza el proceso para los usuarios cuando instalan y actualizan aplicaciones. Siempre que esté usando la versión 8.1 o posterior de los servicios de Google Play, puede configurar su aplicación para apuntar al SDK de Android 6.0 Marshmallow y usar el nuevo modelo de permisos.
Si su aplicación es compatible con el nuevo modelo de permisos, el usuario no tiene que otorgar ningún permiso cuando instalan o actualizan la aplicación. En cambio, la aplicación debe solicitar permisos cuando los necesita en tiempo de ejecución, y el sistema muestra un diálogo al usuario que solicita el permiso.
Para obtener más información, consulte la documentación de Android 6.0 Marshmallow y los cambios que debe realizar en su aplicación para el nuevo modelo de permisos.
Google ha agregado WebChromeClient.onShowFileChooser. Incluso proporcionan una forma de generar automáticamente la intención del selector de archivos para que utilice los tipos de mime de aceptación de entrada.
Impleméntelo de esta manera (de una respuesta de weiyin):
public class MyWebChromeClient extends WebChromeClient // reference to activity instance. May be unnecessary if your web chrome client is member class. private MyActivity myActivity; public boolean onShowFileChooser(WebView webView, ValueCallback
filePathCallback, FileChooserParams fileChooserParams) // make sure there is no existing message if (myActivity.uploadMessage != null) myActivity.uploadMessage.onReceiveValue(null); myActivity.uploadMessage = null; myActivity.uploadMessage = filePathCallback; Intent intent = fileChooserParams.createIntent(); try myActivity.startActivityForResult(intent, MyActivity.REQUEST_SELECT_FILE); catch (ActivityNotFoundException e) myActivity.uploadMessage = null; Toast.makeText(myActivity, "Cannot open file chooser", Toast.LENGTH_LONG).show(); return false; return true; public class MyActivity extends ... public static final int REQUEST_SELECT_FILE = 100; public ValueCallback uploadMessage; protected void onActivityResult(int requestCode, int resultCode, Intent data) if (requestCode == REQUEST_SELECT_FILE) if (uploadMessage == null) return; uploadMessage.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(resultCode, data)); uploadMessage = null; }
Asegúrese de compilar la aplicación con API 21+. Y esto funcionará en todas las plataformas como mencionas en tu gradle.
Este es el método de trabajo de API 11 a 23
static WebView mWebView;
private ValueCallback mUploadMessage;
public ValueCallback uploadMessage;
public static final int REQUEST_SELECT_FILE = 100;
private final static int FILECHOOSER_RESULTCODE = 1;
Ahora modifique o anule su método onActivityResult
@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent)
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
if (requestCode == REQUEST_SELECT_FILE)
if (uploadMessage == null)
return;
uploadMessage.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(resultCode, intent));
uploadMessage = null;
else if (requestCode == FILECHOOSER_RESULTCODE)
if (null == mUploadMessage)
return;
// Use MainActivity.RESULT_OK if you're implementing WebView inside Fragment
// Use RESULT_OK only if you're implementing WebView inside an Activity
Uri result = intent == null
else
Toast.makeText(getActivity().getApplicationContext(), "Failed to Upload Image", Toast.LENGTH_LONG).show();
Ahora en el método onCreate pega el siguiente código
mWebView.setWebChromeClient(new WebChromeClient()
// For 3.0+ Devices (Start)
// onActivityResult attached before constructor
protected void openFileChooser(ValueCallback uploadMsg, String acceptType)
mUploadMessage = uploadMsg;
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType("image/*");
startActivityForResult(Intent.createChooser(i, "File Browser"), FILECHOOSER_RESULTCODE);
// For Lollipop 5.0+ Devices
public boolean onShowFileChooser(WebView mWebView, ValueCallback filePathCallback, WebChromeClient.FileChooserParams fileChooserParams)
if (uploadMessage != null)
uploadMessage.onReceiveValue(null);
uploadMessage = null;
uploadMessage = filePathCallback;
Intent intent = fileChooserParams.createIntent();
try
startActivityForResult(intent, REQUEST_SELECT_FILE);
catch (ActivityNotFoundException e)
uploadMessage = null;
Toast.makeText(getActivity().getApplicationContext(), "Cannot Open File Chooser", Toast.LENGTH_LONG).show();
return false;
return true;
//For Android 4.1 only
protected void openFileChooser(ValueCallback uploadMsg, String acceptType, String capture)
mUploadMessage = uploadMsg;
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/*");
startActivityForResult(Intent.createChooser(intent, "File Browser"), FILECHOOSER_RESULTCODE);
protected void openFileChooser(ValueCallback uploadMsg)
mUploadMessage = uploadMsg;
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType("image/*");
startActivityForResult(Intent.createChooser(i, "File Chooser"), FILECHOOSER_RESULTCODE);
);
No hay respuesta para abordar el problema aquí … algunas personas expertas en Android están dando una solución para construir la carga de imágenes en el código de Android … esa no es esta pregunta … Tengo el mismo problema que me molesta … Lo que estamos preguntando es el HTML / La página PHP que se carga en la aplicación webview no activa la aplicación de la galería o la cámara, ya que activa ‘cargar archivo desde la PC’ en una computadora de escritorio / portátil en Mozilla o Chrome … Es como una web desde un iframe tipo una cosa … pero por dentro Vista web de la aplicación Android … Creo que lo he dejado claro … No somos programadores de Android, somos desarrolladores web.
Si estás contento con lo expuesto, tienes la libertad de dejar un escrito acerca de qué te ha impresionado de esta división.