studio programacion herramientas fundamentos descargar con avanzado aplicaciones android image input webview crop

programacion - manual android studio avanzado



Android, no puede cargar imágenes usando WebView (3)

Estoy buscando una solución para mi problema algunos días, pero no puedo encontrar uno bueno. Así que quería preguntar aquí otra vez antes de comenzar a desarrollar una aplicación nativa para Android, ya que no puedo resolver este problema.

Como dice el título, estoy intentando subir una imagen usando webview a un contenido html que NORMALMENTE está eligiendo una imagen, mostrándola en la página y permitiendo que el usuario la recorte. Hice la aplicación completa y la probé en el navegador normal de mi teléfono, así que no sabía que esto no funcionaría. Es por eso que es malditamente frustrante.

Esas soluciones que he encontrado en Internet no funcionan para mi Android y leo que ya no es posible.

¿Alguien sabe si esto es posible o no? Sería de gran ayuda si pudiera obtener más información al respecto (¿incluso si es posible o no?) Gracias en Adavnce ...


Ninguna respuesta aborda el problema aquí. Algunas personas expertas de Android están dando una solución para crear imágenes cargadas en el código de Android ... esa no es la pregunta que me piden ... Tengo el mismo problema que me molesta ... Lo que estamos preguntando es el HTML / La página PHP que está cargada en la aplicación webview no activa la galería o la aplicación de la cámara ya que desencadena ''cargar archivo desde la PC'' en una computadora de escritorio / laptop en Mozilla o Chrome. Es como web desde un iframe tipo una cosa ... pero dentro vista web de la aplicación Android ... Creo que lo he dejado en claro ... No somos programadores de Android, somos desarrolladores web.

<form method="post" action="" enctype="multipart/form-data" name="form1"> <!-- this following input is not working in webview --> <input size="25" name="file" type="file"> <input name="submit" type="submit" value="submit"> </form>


Este es el método de trabajo de API 11 a 23

static WebView mWebView; private ValueCallback<Uri> mUploadMessage; public ValueCallback<Uri[]> 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 || resultCode != MainActivity.RESULT_OK ? null : intent.getData(); mUploadMessage.onReceiveValue(result); mUploadMessage = 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<Uri[]> 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<Uri> 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<Uri> 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); } });


Intenta agregar estos permisos.

<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Android 6.0 Marshmallow presenta un nuevo modelo para gestionar permisos, que agiliza el proceso para los usuarios cuando instalan y actualizan aplicaciones. Siempre que esté utilizando la versión 8.1 o posterior de los servicios de Google Play, puede configurar su aplicación para que apunte al SDK Marshmallow de Android 6.0 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 instala o actualiza la aplicación. En cambio, la aplicación debe solicitar permisos cuando los necesita en tiempo de ejecución, y el sistema muestra un cuadro de 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 use la entrada accept mime types.

Implementarlo de esta manera (a partir de una respuesta por weiyin ):

public class MyWebChromeClient extends WebChromeClient { // reference to activity instance. May be unnecessary if your web chrome client is member class. private MyActivity activity; public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> 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<Uri[]> 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 menciones en tu gradle.