Subir una imagen de la cámara o galería en WebView
WebView en esta aplicación abre una página con el botón de carga.
A continuación se muestra el bloque de código que permite abrir un cuadro de diálogo para cargar la imagen desde la galería o la cámara.
Dentro de mi actividad tengo:
private WebView wv;
//make HTML upload button work in Webview
private ValueCallback<Uri> mUploadMessage;
private final static int FILECHOOSER_RESULTCODE=1;
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
if(requestCode==FILECHOOSER_RESULTCODE)
{
if (null == mUploadMessage) return;
Uri result = intent == null || resultCode != RESULT_OK ? null
: intent.getData();
mUploadMessage.onReceiveValue(result);
mUploadMessage = null;
}
}
Dentro de onCreate tengo lo siguiente:
wv.setWebChromeClient(new WebChromeClient() {
private Uri imageUri;
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType ) {
File imageStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "MyApp");
// Create the storage directory if it does not exist
if (! imageStorageDir.exists()){
imageStorageDir.mkdirs();
}
File file = new File(imageStorageDir + File.separator + "IMG_" + String.valueOf(System.currentTimeMillis()) + ".jpg");
imageUri = Uri.fromFile(file);
final List<Intent> cameraIntents = new ArrayList<Intent>();
final Intent captureIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
final PackageManager packageManager = getPackageManager();
final List<ResolveInfo> listCam = packageManager.queryIntentActivities(captureIntent, 0);
for(ResolveInfo res : listCam) {
final String packageName = res.activityInfo.packageName;
final Intent i = new Intent(captureIntent);
i.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
i.setPackage(packageName);
i.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
cameraIntents.add(i);
}
mUploadMessage = uploadMsg;
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType("image/*");
Intent chooserIntent = Intent.createChooser(i,"Image Chooser");
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, cameraIntents.toArray(new Parcelable[]{}));
MainActivity.this.startActivityForResult(chooserIntent, FILECHOOSER_RESULTCODE);
}
Puedo ver la opción para la cámara, la galería de imágenes y el explorador de archivos al hacer clic en el botón Cargar.
Explorador de archivos y Galería está funcionando como se esperaba. El problema es que, cuando tomo una foto con la cámara, no se carga en la opción "elegir archivo" que muestra el estado "Ningún archivo elegido".
SOBRE LA SELECCIÓN DE CÁMARA:
SOBRE LA TOMA DE FOTOGRAFÍA USANDO LA CÁMARA: Aparecen las opciones de retroceso y verificación.
SOBRE LA ELECCIÓN DE LA MARCA DE VERIFICACIÓN:
EL ARCHIVO NO SE CARGA: (EN LA OPCIÓN "ELEGIR ARCHIVO")
LO QUE ES ESPERADO:
Verifiqué que tengo el permiso de escritura adecuado y, por lo tanto, se genera un directorio llamado "MyApp" y la imagen se almacena dentro de él (si se toma invocando la cámara después de hacer clic en el botón de carga en la página web).
¿Cómo indicar a la aplicación que elija la imagen tomada desde la cámara (que se almacenó en el directorio MyApp) después de marcar la marca de verificación?