Kamera Foto-Upload und der Dateiauswahl-Dialog von webview Eingabefeld

Meine app ist webbasiert und ich brauche, um Fotos von einem Eingabefeld camp. Ich habe zwei Situationen, und ich weiß nicht, einen anderen Weg, es zu tun, je nach der Seite, ich habe mich entschieden den einen oder anderen mit "boolean boolFileChoser" je nach Ihrer URL-petition:

ein. Dateiauswahl

b. Kamera Foto-Shooting.

Habe ich behandelt mit Dateiauswahl und upload der Datei perfekt, das problem mit der Kamera. Sobald ich versuche, laden Sie die Kamera-Pic, stürzt es ab.
Soweit ich weiß, seine weil der URI.

a) Datei-picker: Inhalt://media/external/images/1234

b) - Kamera-Schießen: file:///mnt/sdcard/Pic.jpg

Habe ich keine Möglichkeit gefunden, es zu ändern.

Siehe update

Es jetzt abstürzt, weil eine nullpointerexception beim Versuch, laden Sie die "content://media/external/images/1234". (nur mit Kamera, nicht die Datei-Auswahl. ).
Auch wenn die Auswahl/Kamera geschlossen ist, (zurück-Taste), ich bin nicht in der Lage, es zu nennen, wieder.

Fall a) und b) 100% arbeiten, hier ist der funktionierende code, darunter, wie ich weiß, wenn fileChooser oder die Kamera 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 könnte den "content://media/external/images/xxx" uri-format, aber die app immer noch abstürzt, während Sie versuchen, laden Sie die uri über "mUploadMessage.onReceiveValue(selectedImage);". Jetzt bin ich immer eine nullpointerexception.


UPDATE 2

Fest und arbeiten.

Hatte, habe ich die 'ValueCallback uploadMsg' in der lokalen variable nur in der Datei-Auswahl Fall, so dass es immer throwed mich eine Ausnahme, wenn ich versuchte, laden Sie ein Foto-Datei, weil es null war.
Einmal nahm ich Sie heraus, aus der if-else-Anweisung, alle arbeiteten.
Das Vorherige update war die einfachste Methode, um die Datei hochzuladen.

Habe ich bereits Hinzugefügt 'mUploadMessage.onReceiveValue(null);", wenn die Kamera/filechooser Absicht ist abgesagt (Sie muss sich mit ihm in Ihre Webseite), wenn nicht, werden Sie nicht in der Lage zu starten, das INPUT-Feld (Absicht) wieder.


UPDATE 3

Hinzugefügt der Teil des Codes, der innerhalb AwesomeChromeClient zu unterscheiden ist die option, ein Foto aufzunehmen, oder wählen Sie eine Datei.. es ist MEIN Weg, es zu tun, und fügte hinzu, durch petition, ich bin sicher, es gibt eine Menge andere gültige Wege, es zu tun,

Der code ist 100% funktional jetzt. Wenn Sie angeben, wenn Sie möchten, dass Bild-oder Datei-chooser

Alle Fehler sind behoben und post aktualisiert mit den funktionierenden code.
Der code sieht gut aus, und wird sehr nützlich für mich, ich habe nicht versucht, es sich einfach nur noch, ich bin versucht, herauszufinden, wo die variable "boolFileChooser"'s Wert eingestellt ist? Auch entdeckt ein Tippfehler: ich denke, "MainActivity.CAMERA_REQUEST" sollte "MainActivity.CAMERAREQUEST_RESULTCODE"
Ich habe es geschafft, mein code funktioniert jetzt, vielen Dank für die Hilfe. Versuchte viele andere Lösungen auf dem web, aber dieses war das beste. Prost!
ist es möglich den upload der vollständige code? danke.
user280109 ich erinnere mich, dass ich es auch ausprobiert (viele verschiedene Quellen und code tryings) und ich kann mich nicht erinnern, warum ich das, aber "es funktioniert" 😀 ich kann nicht poste den vollständigen code (spezifischer code für die app und die standard webview in oncreate), aber ich Stell die "boolFileChooser" Teil.. es ist der fehlende Teil, damit es funktioniert, es sollte also genug sein.. Wenn ich dieses schrieb, es war einfach noch nicht implementiert. (ich war bis jetzt, sorry für die nicht Antwort, die Sie früher).

InformationsquelleAutor Jordi | 2012-11-08

Schreibe einen Kommentar