2016-05-19 7 views
1

Ich entwickle eine App, die eine WebView verwendet, um auf einige Logik zuzugreifen. Die Logik, hat einen Teil, wo der Benutzer ein Bild hochladen kann, aber ich kann nicht scheinen, einen Weg für die App zu finden, dies zu tun.
Der Code, den ich als Beispiel verwende, ist in diesem link.Android Datei-Wähler öffnet nicht von WebView in Lollipop noch Marshmallow

Wie Sie sehen werden, wird eine benutzerdefinierte Intent von der WebChromeClient festgelegt, jedoch öffnet die Dateiauswahl überhaupt nicht. Code:

public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType){ 

       // Update message 
       mUploadMessage = uploadMsg; 

       try{  

        // Create AndroidExampleFolder at sdcard 

        File imageStorageDir = new File(
              Environment.getExternalStoragePublicDirectory(
              Environment.DIRECTORY_PICTURES) 
              , "AndroidExampleFolder"); 

        if (!imageStorageDir.exists()) { 
         // Create AndroidExampleFolder at sdcard 
         imageStorageDir.mkdirs(); 
        } 

        // Create camera captured image file path and name 
        File file = new File(
            imageStorageDir + File.separator + "IMG_" 
            + String.valueOf(System.currentTimeMillis()) 
            + ".jpg"); 

        mCapturedImageURI = Uri.fromFile(file); 

        // Camera capture image intent 
        final Intent captureIntent = new Intent(
                android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 

        captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, mCapturedImageURI); 

        Intent i = new Intent(Intent.ACTION_GET_CONTENT); 
        i.addCategory(Intent.CATEGORY_OPENABLE); 
        i.setType("image/*"); 

        // Create file chooser intent 
        Intent chooserIntent = Intent.createChooser(i, "Image Chooser"); 

        // Set camera intent to file chooser 
        chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS 
              , new Parcelable[] { captureIntent }); 

        // On select image call onActivityResult method of activity 
        startActivityForResult(chooserIntent, FILECHOOSER_RESULTCODE); 

        } 
       catch(Exception e){ 
        Toast.makeText(getBaseContext(), "Exception:"+e, 
           Toast.LENGTH_LONG).show(); 
       } 

      } 

Vielen Dank im Voraus!
EDIT

So, nach @JoxTraex mich erleuchtet, erkannte ich, dass die Dateiauswahl war nicht Auslösung, weil ich keine Methoden des WebChromeClient überschrieben wurde. Jetzt fragt der Dateiwähler, aber wenn ein Bild ausgewählt wird, wird das Bild nicht hochgeladen.
Der Code, den ich für die Dateiauswahl bin mit:

@Override 
      public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) { 
       openFileChooser(filePathCallback, ""); 
       return super.onShowFileChooser(webView, filePathCallback, fileChooserParams); 
      } 

      public void openFileChooser(ValueCallback<Uri[]> uploadMsg, String acceptType){ 
       // Update message 
       //mUploadMessage = uploadMsg.this; 
       try{ 
        // Create AndroidExampleFolder at sdcard 
        File imageStorageDir = new File(
          Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_PICTURES) 
          , "AndroidExampleFolder"); 

        if (!imageStorageDir.exists()) { 
         // Create AndroidExampleFolder at sdcard 
         imageStorageDir.mkdirs(); 
        } 

        // Create camera captured image file path and name 
        File file = new File(
          imageStorageDir + File.separator + "IMG_" 
            + String.valueOf(System.currentTimeMillis()) 
            + ".jpg"); 

        mCapturedImageURI = Uri.fromFile(file); 

        // Camera capture image intent 
        final Intent captureIntent = new Intent(
          android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 

        captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, mCapturedImageURI); 

        Intent i = new Intent(Intent.ACTION_GET_CONTENT); 
        i.addCategory(Intent.CATEGORY_OPENABLE); 
        i.setType("image/*"); 

        // Create file chooser intent 
        Intent chooserIntent = Intent.createChooser(i, "Image Chooser"); 

        // Set camera intent to file chooser 
        chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS 
          , new Parcelable[] { captureIntent }); 

        // On select image call onActivityResult method of activity 
        startActivityForResult(chooserIntent, FILECHOOSER_RESULTCODE); 

       } 
       catch(Exception e){ 
        Toast.makeText(getBaseContext(), "Exception:"+e, 
          Toast.LENGTH_LONG).show(); 
       } 

      } 

Vielen Dank im Voraus!

+1

Sind Sie sicher, dass eine App tatsächlich mit dieser bestimmten Absicht umgehen kann? – JoxTraex

+0

@JoxTraex Ich habe der Manifest-Datei einige Berechtigungen hinzugefügt, wie zum Beispiel das Internet, externen Speicher lesen, Kamera – pamobo0609

+0

Ich weiß nicht, ob Sie einen Broadcast-Empfänger deklarieren wollen – pamobo0609

Antwort

7

Nun, nachdem ich mit einigen Zuhörern zu kämpfen hatte, fand ich einen Code, der meine Situation löste. Trotzdem, dank @JoxTraex und this dude.

+0

Dies funktioniert nicht in Nexus, was kann dafür getan werden? Nur Option aus der Galerie Arbeit aber von der Kamera, es öffnet sich, aber Foto ist nicht ausgewählt oder nichts passiert. Wenn du das oder irgendeine Idee gelöst hast, teile es bitte mit. –

+0

@SatanPandeya, Ich habe den Code kürzlich auf meinem Nexus 5X getestet und alles scheint gut. Ich werde jedoch einen Kern mit dem neuesten Code, den ich dafür gemacht habe, erstellen. Ich komme wieder. – pamobo0609

+0

@SatanPandeya hier ist das Wesentliche: https://gist.github.com/pamobo0609/1650a73d0478f5aeabc95f67f1457ba5 lassen Sie mich wissen, wenn Sie irgendwelche Zweifel haben. – pamobo0609

1

Die angenommene Antwort ist korrekt, aber ich werde meinen Code veröffentlichen, wenn es jemandem hilft. Ich habe den folgenden Code verwendet, der innerhalb der webChrome-Klasse hinzugefügt werden soll.

public boolean onShowFileChooser(WebView view, ValueCallback<Uri[]> uploadMsg, WebChromeClient.FileChooserParams fileChooserParams) { 
      mFilePathCallback = uploadMsg; 
      Intent i = new Intent(Intent.ACTION_GET_CONTENT); 
      i.addCategory(Intent.CATEGORY_OPENABLE); 
      i.setType("image/*"); 
      startActivityForResult(Intent.createChooser(i, "File Chooser"), FILECHOOSER_RESULTCODE); 
      return true; 
     } 

Und verwenden Sie den Code in onActivityResult

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
     if (requestCode != FILECHOOSER_RESULTCODE || mFilePathCallback == null) { 
      super.onActivityResult(requestCode, resultCode, intent); 
      return; 
     } 
     Uri[] results = null; 
     // Check that the response is a good one 
     if (resultCode == Activity.RESULT_OK) { 
       String dataString = intent.getDataString(); 
       if (dataString != null) { 
        results = new Uri[]{Uri.parse(dataString)}; 
      } 
     } 
     mFilePathCallback.onReceiveValue(results); 
     mFilePathCallback = null; 
    } 

Sie müssen auch Laufzeitberechtigungen für Eibisch und höher. Dieser Code funktioniert in Lollipop einwandfrei. Sie müssen auch Bedingungen für andere Android-Versionen hinzufügen, damit es auch mit anderen Versionen funktioniert.

Verwandte Themen