Prześlij zdjęcie z kamery i filechooser z pola widzenia internetowego INPUT

Moja aplikacja jest oparta na Internecie i muszę przesłać zdjęcia z obozu terenowego INPUT. Mam dwie sytuacje i ponieważ nie znam innego sposobu na zrobienie tego w zależności od strony, którą wybieram z „boolean boolFileChoser” w zależności od petycji URL:

za. plik wyboru

b. sesja zdjęciowa aparatu.

Zajmowałem się selektorem plików i idealnie ładował plik,problem dotyczy aparatu. Gdy spróbuję przesłać Pic Camera, zawiesza się. O ile wiem, to dlatego, że jest to URI.

a) Wybór pliku: content: // media / external / images / 1234

b) Strzelanie z kamery: plik: ///mnt/sdcard/Pic.jpg

Nie znalazłem sposobu, by to zmienić.

Zobacz aktualizację

Obecnie ulega awarii, ponieważ wyjątek nullpointerexception podczas próby przesłania „content: // media / external / images / 1234”. (tylko w przypadku aparatu, a nie wyboru pliku.). Również, jeśli wybieracz / kamera jest zamknięta (przycisk wstecz), nie mogę zadzwonić ponownie.

Przypadek a) ib) w 100% działający, oto działający kod, w tym jak wiem, czy nazwa pliku lub aparatu nazywa się:

@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. **/



    }

AKTUALIZACJA 1

Mogłem uzyskać format uri „content: // media / external / images / xxx”, ale aplikacja nadal ulega awarii podczas próby przesłania uri przez „mUploadMessage.onReceiveValue (selectedImage);”. Teraz dostaję wyjątek dotyczący punktu zerowego.

AKTUALIZACJA 2

Naprawiono i działa.

Miałem „ValueCallback uploadMsg” w lokalnej zmiennej tylko w przypadku wyboru pliku, więc zawsze rzucałem mi wyjątek, gdy próbowałem przesłać plik zdjęcia, ponieważ był pusty. Po usunięciu z instrukcji if-else wszystko działało. Poprzednia aktualizacja była najłatwiejszą metodą radzenia sobie z przesyłaniem plików.

Dodałem już 'mUploadMessage.onReceiveValue (null);' jeśli cel kamery / filechooser zostanie anulowany (musisz sobie z tym poradzić na swojej stronie internetowej), jeśli nie, nie będziesz mógł ponownie uruchomić pola INPUT (Intent).

AKTUALIZACJA 3

Dodano część kodu wewnątrz AwesomeChromeClient, aby rozróżnić opcję, zrobić zdjęcie lub wybrać plik. Jest to MOJA droga do tego i dodana przez petycję, jestem pewien, że jest wiele innych ważnych sposobów, aby to zrobić,

Kod jest teraz w 100% funkcjonalny. Jeśli wskażesz, czy chcesz wybrać zdjęcie lub plik do wyboru

questionAnswers(3)

yourAnswerToTheQuestion