Laden Sie ein Foto und eine Dateiauswahl aus dem Webview-Eingabefeld hoch

Meine App ist webbasiert und ich muss Bilder von einem INPUT-Feldlager hochladen. Ich habe zwei Situationen und da ich keinen anderen Weg kenne, dies abhängig von der Seite zu tun, wähle ich den einen oder anderen mit "boolean boolFileChoser" abhängig von seiner URL-Petition:

ein. Dateiauswahl

b. Kamera-Fotoshooting.

Ich habe mich mit der Dateiauswahl beschäftigt und sie hat die Datei perfekt hochgeladen.das problem ist mit der kamera. Sobald ich versuche, das Camera Pic hochzuladen, stürzt es ab. Soweit ich weiß, liegt es an der URI.

a) Dateiauswahl: Inhalt: // media / external / images / 1234

b) Kameraaufnahme: Datei: ///mnt/sdcard/Pic.jpg

Ich habe keine Möglichkeit gefunden, das zu ändern.

Siehe update

Es stürzt jetzt ab, weil beim Versuch, den "content: // media / external / images / 1234" hochzuladen, eine Nullpunkt-Ausnahme aufgetreten ist. (Nur mit Kamera, nicht mit Dateiauswahl.) Auch wenn die Auswahl / Kamera geschlossen ist (Zurück-Taste), kann ich sie nicht erneut aufrufen.

Fall a) und b) 100% arbeiten, hier ist der Arbeitscode, einschließlich wie ich weiß, ob fileChooser oder camera aufgerufen werden:

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



    }

UPDATE 1

Ich konnte das Uri-Format "content: // media / external / images / xxx" erhalten, aber die App stürzt beim Versuch, die Uri über "mUploadMessage.onReceiveValue (selectedImage);" hochzuladen, immer noch ab. Jetzt bekomme ich eine Nullpunktausnahme.

UPDATE 2

Fest und funktionierend.

Ich habe die 'ValueCallback uploadMsg' in der lokalen Variablen nur im Fall der Dateiauswahl gehabt, daher hat sie mir immer eine Ausnahme bereitet, als ich versuchte, eine Fotodatei hochzuladen, weil sie null war. Nachdem ich die if-else-Anweisung entfernt hatte, funktionierte alles. Das vorherige Update war die einfachste Methode, um den Datei-Upload durchzuführen.

Ich habe bereits eine 'mUploadMessage.onReceiveValue (null)' hinzugefügt. Wenn die Absicht der Kamera / Dateiauswahl aufgehoben wird (Sie müssen sich auf Ihrer Webseite damit befassen), können Sie das Feld EINGABE (Absicht) nicht erneut starten.

UPDATE 3

Der Teil des Codes wurde in AwesomeChromeClient hinzugefügt, um die Option zu unterscheiden, ein Foto aufzunehmen oder eine Datei auszuwählen. Es ist MEINE Methode, dies zu tun. Ich bin mir sicher, dass es noch viele andere gültige Methoden gibt, dies zu tun.

Der Code ist jetzt zu 100% funktionsfähig. Wenn Sie angeben, ob Sie ein Bild oder eine Datei auswählen möchten

Antworten auf die Frage(3)

Ihre Antwort auf die Frage