Carregar foto da câmera e filechooser a partir do campo INPUT da visualização da Web

Meu aplicativo é baseado na web e preciso enviar fotos de um campo de campo INPUT. Eu tenho duas situações e como eu não sei outra maneira de fazer isso, dependendo da página eu estou escolhendo um ou outro com "boolean boolFileChoser" dependendo de sua petição de URL:

uma. selecionador de arquivos

b. sessão de fotos da câmera.

Eu lidei com o seletor de arquivos e enviei o arquivo perfeitamente,O problema é com a câmera. Uma vez que eu tento fazer upload do Camera Pic, ele cai. Tanto quanto eu sei que é porque o URI.

a) Seletor de arquivos: conteúdo: // media / external / images / 1234

b) Camera shoot: file: ///mnt/sdcard/Pic.jpg

Eu não encontrei nenhuma maneira de mudar isso.

Veja a atualização

Ele agora falha porque um nullpointerexception ao tentar carregar o "content: // media / external / images / 1234". (apenas com a câmera, não com o seletor de arquivos). Além disso, se o seletor / câmera estiver fechado (botão Voltar), não consigo ligar novamente.

Caso a) eb) 100% funcionando, aqui está o código de trabalho, incluindo como eu sei se fileChooser ou camera são chamados:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
    if (resultCode != RESULT_OK) {
    /** fixed code **/
            //To be able to use the filechooser again in case of error
            mUploadMessage.onReceiveValue(null);
    /** fixed code **/
            return;
    }
    if (mUploadMessage==null) {
        Log.d("androidruntime","no mUploadMessage");
        return;
    }
    if (requestCode == FILECHOOSER_RESULTCODE) {
        Uri selectedImage= intent == null || resultCode != RESULT_OK ? null : intent.getData();
        Log.d("androidruntime","url: "+selectedImage.toString());

    }else if (requestCode == CAMERAREQUEST_RESULTCODE) { 
        if(mCapturedImageURI==null){
            Log.d("androidruntime","no mCapturedImageURI");
            return;
        }
      /** fixed code **/
        getContentResolver().notifyChange(mCapturedImageURI, null);
        ContentResolver cr = getContentResolver();
        Uri uriContent= Uri.parse(MediaStore.Images.Media.insertImage(getContentResolver(), photo.getAbsolutePath(), null, null));
        photo = null;
      /** fixed code **/
    }
    mUploadMessage.onReceiveValue(selectedImage);
    mUploadMessage = null;
}


    private static final int FILECHOOSER_RESULTCODE   = 2888;
    private static final int CAMERAREQUEST_RESULTCODE = 1888;
    private ValueCallback<Uri> mUploadMessage;
    private Uri mCapturedImageURI = null;

    protected class AwesomeWebChromeClient extends WebChromeClient{
        // Per Android 3.0+
        public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType){  
           /**updated, out of the IF **/
                            mUploadMessage = uploadMsg;
           /**updated, out of the IF **/
            if(boolFileChooser){ //Take picture from filechooser

                Intent i = new Intent(Intent.ACTION_GET_CONTENT);  
                i.addCategory(Intent.CATEGORY_OPENABLE);  
                i.setType("image/*");  
                MainActivity.this.startActivityForResult( Intent.createChooser( i, "Escoger Archivo" ), MainActivity.FILECHOOSER_RESULTCODE );  

            } else { //Take photo and upload picture
                Intent cameraIntent = new Intent("android.media.action.IMAGE_CAPTURE");
                File photo = new File(Environment.getExternalStorageDirectory(),  "Pic.jpg");
                cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT,
                        Uri.fromFile(photo));
                mCapturedImageURI = Uri.fromFile(photo);
                startActivityForResult(cameraIntent, MainActivity.CAMERA_REQUEST);
            }
        }
        // Per Android < 3.0
        public void openFileChooser(ValueCallback<Uri> uploadMsg){
            openFileChooser(uploadMsg, "");
        }
        //Altre
        public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
            openFileChooser(uploadMsg, "");
        }



        /** Added code to clarify chooser. **/

        //The webPage has 2 filechoosers and will send a console message informing what action to perform, taking a photo or updating the file
        public boolean onConsoleMessage(ConsoleMessage cm) {        
            onConsoleMessage(cm.message(), cm.lineNumber(), cm.sourceId());
            return true;
        }
        public void onConsoleMessage(String message, int lineNumber, String sourceID) {
            Log.d("androidruntime", "Per cònsola: " + cm.message());
            if(message.endsWith("foto")){ boolFileChooser= true; }
            else if(message.endsWith("pujada")){ boolFileChooser= false; }
        }
        /** Added code to clarify chooser. **/



    }

ATUALIZAÇÃO 1

Eu poderia obter o formato uri "content: // media / external / images / xxx", mas o aplicativo ainda falha ao tentar carregar o uri via "mUploadMessage.onReceiveValue (selectedImage);". Agora estou recebendo uma nullpointerexception.

ATUALIZAÇÃO 2

Corrigido e funcionando.

Eu tive o 'ValueCallback uploadMsg' na variável local apenas no caso do seletor de arquivos, por isso sempre me lançou uma exceção quando eu tentei carregar um arquivo de foto porque era nulo. Uma vez que tirei da declaração if-else, tudo funcionou. A atualização anterior foi o método mais fácil para lidar com o upload do arquivo.

Eu já adicionei um 'mUploadMessage.onReceiveValue (null);' se a intenção do Camera / filechooser for cancelada (você deve lidar com isso em sua página da web), se não, você não poderá iniciar o campo INPUT (Intent) novamente.

ATUALIZAÇÃO 3

Adicionado a parte do código dentro AwesomeChromeClient para discriminar a opção, tirar uma foto ou escolher um arquivo .. sua maneira de fazê-lo e adicionado por petição, tenho certeza que há uma série de outras formas válidas para fazê-lo,

O código é 100% funcional agora. Se você indicar se deseja uma foto ou um seletor de arquivos

questionAnswers(3)

yourAnswerToTheQuestion