2015-01-25 13 views
5

Ich versuche, Web-Projekt mit Android, von Webview zu bauen. Ich habe ein Eingabefeld des Typs Datei <input type="file" >, um Benutzer Dateien auf den Server hochladen zu lassen, aber es scheint nicht auf Android-Webview zu funktionieren, wenn ich auf die Schaltfläche Durchsuchen tippen, passiert nichts.Android Webview Eingabe Typ Datei

Comp.java

package com.gururaju.bbmp; 

import android.app.Activity; 
import android.os.Bundle; 
import android.webkit.WebView; 
import android.webkit.WebViewClient; 
import android.webkit.WebChromeClient; 

public class Comp extends Activity { 
    WebView comp; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_comp); 

     WebView myWebView = (WebView) findViewById(R.id.comp); 
     myWebView.setWebChromeClient(new WebChromeClient()); 
     myWebView.loadUrl("file:///android_asset/comp.html"); 

    } 
} 

activity_comp.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <WebView 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:id="@+id/comp" 
     > 

     </WebView> 
</LinearLayout> 

comp.html (Assets Ordner)

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <link rel="stylesheet" type="text/css" href="comp.css"> 
    <meta charset="UTF-8"> 
    <title></title> 
</head> 
<body> 
    <h2 align="center">Post your Complaints here</h2> 
    <form enctype="multipart/form-data" action="" name="complaints" method="POST"> 
     <input class="title" type="text" name="title" placeholder="Enter the Complaint Title" /><br /> 

     <div class="spacer-welcome"></div> 
     <textarea name="desc" class="desc" placeholder="Your complaint description here..."></textarea><br /> 
     <div class="spacer-welcome1"></div> 

      <input id="center" type="file" name="image" ><br /> 
     <input class="upload" type="submit" name="submit" value="Submit" > 
    </form> 
</body> 
</html> 

Jede Hilfe wäre willkommen.

Antwort

2

Die Antwort von Riad weist in die richtige Richtung, aber das einzelne Rückruf nicht genug um zu implementieren.

Es gibt insgesamt vier versteckte API-Methoden, die Sie implementieren müssen. Ihre Verwendung hängt von der Android-Version ab. Diese Methoden sind:

public void openFileChooser(ValueCallback<Uri> uploadMsg) 
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) 
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) 
public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) 

Sie können die folgende Bibliothek benutzen, die tut all diese Dinge für Sie:

https://github.com/delight-im/Android-AdvancedWebView

Alternativ Sie einen Blick auf den Quellcode nehmen kann, um zu sehen, wie es gemacht :

https://github.com/delight-im/Android-AdvancedWebView/blob/master/Source/src/im/delight/android/webview/AdvancedWebView.java

+1

"https://github.com/delight-im/Android-AdvancedWebView" hat den Trick gemacht – Nilabja

0

Versuchen Sie, die file Chooser Methode, wie diese Umsetzung, wie es in dem Artikel einen Link am Ende versehen erwähnt:

webView.setWebChromeClient(new WebChromeClient() { 

    // openFileChooser for Android 3.0+ 

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

    // Update message 
    mUploadMessage = uploadMsg; 

    try{ 
     // do work.... 

    }catch(Exception e){ 

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

View Details Here

+0

ich das versucht, scheint es nicht zu funktionieren! –

1

Webview Klasse allein nicht Datei-Upload auf Facebook unterstützen. Sie müssen sowohl den web chrome client als auch den webview client verwenden, um den Dateiupload auf Ihrer Android-Anwendung zu handhaben, wie unten gezeigt. View more details and a working demo

package com.whatsonline.androidphotouploadonfacebook; 

import android.app.Activity; 
import android.content.ActivityNotFoundException; 
import android.content.Intent; 
import android.content.res.Configuration; 
import android.graphics.Bitmap; 
import android.net.Uri; 
import android.os.Bundle; 
import android.view.ViewGroup; 
import android.webkit.ValueCallback; 
import android.webkit.WebChromeClient; 
import android.webkit.WebSettings; 
import android.webkit.WebView; 
import android.webkit.WebViewClient; 
import android.widget.LinearLayout; 

/** 
* Created by sada on 6/17/2016. 
*/ 
public class upload extends Activity { 

    WebView web; 
    private ValueCallback<Uri> mUploadMessage; 
    private final static int FILECHOOSER_RESULTCODE=1; 
    LinearLayout ln1; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.upload); 

     web = new WebView(this); 
     web.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); 

     ln1=(LinearLayout) findViewById(R.id.ln1); 

     WebSettings settings=web.getSettings(); 
     settings.setJavaScriptEnabled(true); 


     web.loadUrl("http://www.facebook.com"); 
     web.setWebViewClient(new myWebClient()); 

     web.setWebChromeClient(new WebChromeClient() { 
      //The undocumented magic method override 
      //Eclipse will swear at you if you try to put @Override here 
      // For Android 3.0+ 
      public void openFileChooser(ValueCallback<Uri> uploadMsg) { 

       mUploadMessage = uploadMsg; 
       Intent i = new Intent(Intent.ACTION_GET_CONTENT); 
       i.addCategory(Intent.CATEGORY_OPENABLE); 
       i.setType("image/*"); 
       upload.this.startActivityForResult(Intent.createChooser(i, "File Chooser"), FILECHOOSER_RESULTCODE); 

      } 

      // For Android 3.0+ 
      public void openFileChooser(ValueCallback uploadMsg, String acceptType) { 
       mUploadMessage = uploadMsg; 
       Intent i = new Intent(Intent.ACTION_GET_CONTENT); 
       i.addCategory(Intent.CATEGORY_OPENABLE); 
       i.setType("*/*"); 
       upload.this.startActivityForResult(
         Intent.createChooser(i, "File Browser"), 
         FILECHOOSER_RESULTCODE); 
      } 

      //For Android 4.1 
      public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) { 
       mUploadMessage = uploadMsg; 
       Intent i = new Intent(Intent.ACTION_GET_CONTENT); 
       i.addCategory(Intent.CATEGORY_OPENABLE); 
       i.setType("image/*"); 
       upload.this.startActivityForResult(Intent.createChooser(i, "File Chooser"), upload.FILECHOOSER_RESULTCODE); 

      } 

      }); 
     ln1.addView(web); 
    } 
    public class myWebClient extends WebViewClient 
    { 
     @Override 

     public void onPageStarted(WebView view, String url, Bitmap favicon) { 
      super.onPageStarted(view, url, favicon); 

     } 

     @Override 

     public boolean shouldOverrideUrlLoading(WebView view, String url) { 
      view.loadUrl(url); 
      return true; 
     } 

     @Override 
     public void onPageFinished(WebView view, String url) { 
      super.onPageFinished(view, url); 
     } 
    } 

    //flipscreen not loading again 
    @Override 
    public void onConfigurationChanged(Configuration newConfig){ 
     super.onConfigurationChanged(newConfig); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent intent) { 

     if(requestCode==FILECHOOSER_RESULTCODE){ 
      if (null == mUploadMessage) return; 
      Uri result = intent == null || resultCode != RESULT_OK ? null : intent.getData(); 
      mUploadMessage.onReceiveValue(result); 
      mUploadMessage = null; 

     } 
    } 
    } 
Verwandte Themen